笔记:我是 Linux 新手,但我曾简单研究过 rsync
命令,我很确定这就是我要使用的。不幸的是,这个命令有很多不同的选项,我有点困惑如何根据我的具体情况使用它(如下所述)。
情况:我有两个目录,一个目录包含从存储库下载的一组基本文件(我不想修改它们),另一个目录包含同一个存储库的工作副本。我正在寻找一个命令,用于将存储库的工作副本与静态存储库进行比较,以查看两者之间是否有任何变化。如果有变化,仅有的更改的文件将被移动到另一个目录(专门用于备份)。另一个限制是我想保留工作副本的目录结构(见下面的示例)。
例子:
静态仓库:
/src
code1.java
code2.java
/tests
test1.java
工作回购:
/src
code1.java
code2.java (modified)
/tests
test1.java
test2.java (added)
备份目录:
/src
code2.java
/tests
test2.java
最初,静态仓库和工作仓库会是一样的,备份目录将是空的。一旦我对工作仓库,我可以运行我正在寻找的命令,然后备份目录将被适当填充(仅包含新的/修改的文件/目录)。
有这样的命令吗?
答案1
我不确定您要解决什么问题,但我相信git
可能有一个解决方案。但让我们假设唯一可接受的选项是某种备份脚本。
我将使用find
命令来搜索所有文件工作仓库比文件更新静态仓库具有最新修改时间。
所以我首先在静态仓库中查找最新文件然后使用类似如下的方法:
find <working_repo> -type f -newer <latest_file_in_static_repo> -exec rsync {} <backup_dir>/{} \;
选项find
:
-newer <f>
查找比文件最近修改的文件<f>
。-exec <command>
<command>
对每个找到的文件执行,其中{}
替换为当前处理的文件名。-type f
仅查找Files(跳过目录、符号链接、套接字等)。
笔记:我没有检查上面的命令,所以它可能有一些错误或拼写错误,但总的来说它展示了这个想法。
答案2
合理的备份可以保留历史记录。为了能够在任何系统上读取它,我会采取以下措施:
20170125-230000
/src
code1.java (version 1)
code2.java (version 1)
/tests
test1.java (version 1)
20170126-000000
/src
code1.java (version 1) hardlink to 20170125-230000
code2.java (version 2)
/tests
test1.java (version 1) hardlink to 20170125-230000
test2.java (version 1)
20170126-010000
/src
code1.java (version 1) hardlink to 20170125-230000
code2.java (version 2) hardlink to 20170126-000000
code3.java (version 1)
/tests
test1.java (version 2)
test3.java (version 1)
为了节省磁盘空间,rsync
可以使用--link-dest
为未更改的文件(甚至文件夹)创建硬链接。当然,这也意味着如果备份磁盘上的某个扇区出现问题,则某些未更改文件的所有历史记录可能会丢失(例如code1.java (version 1)
,该文件实际上只存储在磁盘上一次,而它存储在所有备份文件夹中)。因此:始终轮换备份磁盘。
看Ubuntu 上有时间机器吗?了解实现,并阅读有关理解硬链接文件夹的警告。但你可能想使用类似快照。
(事实上,解决你真正问题的答案是 Git。但即便如此,你也需要进行备份。始终创建备份。始终。)