我有一个利用rsync同步源文件夹和目标文件夹的备份脚本。这是非常直接的,不需要180行的bash脚本。问题是,我希望在rsync同步目录之前,将源中所有修改/删除的文件和目录从目标复制到一个安全的位置。
我使用rsync--delete参数是因为,我希望文件夹同步,只是我还希望备份已删除和修改的文件和文件夹。rsync列出所有已删除的文件和文件夹,即使这些文件包含在已删除的文件夹中。rsync的输出如下:
sending incremental file list
.d..t......|Original/Artist/
*deleting |Original/Artist/nymapp/skitfil.mp3
*deleting |Original/Artist/nymapp/
sent 416.81K bytes received 732 bytes 25.30K bytes/sec
total size is 89.97G speedup is 215480.91 (DRY RUN)
此处列出了已删除的文件和已删除的文件夹。如果您只需将所有内容复制到以"*删除"开头的"|"符号右侧,那么当您已经复制了文件夹及其内容时,您最终会复制已删除文件夹中的文件。或者反过来,这取决于rsync输出中最先列出的条目。如果将文件复制到不存在的文件夹,cp将退出,并返回目标文件夹不存在的错误代码。因此,最好的方法是先复制所有已删除的文件夹,然后检查已删除的文件是否已包含在已删除的目录中。
基本上,我想要以下文件和文件夹列表的所有"父"文件夹的列表:
*deleting |/Original/Artist/HDLC/fake.mp3
*deleting |/Original/Various/blabla.mp3
*deleting |/Original/Artist/Dir_en_grey/duh.mp3
*deleting |/Original/Artist/Dir_en_grey/
*deleting |/Original/Artist/Dir_en_grey/dir1/dir2/dir1/
*deleting |/Non Original/hey.mp3
*deleting |/Non Original/Electronic/bla.mp3
*deleting |/Non Original/Electronic/dir2/
*deleting |/Non Original/Synth/meh.mp3
*deleting |/differentparent/nofile.mp3
输出应为:
/Original/Artist/HDLC/
/Original/Various/
/Original/Artist/Dir_en_grey/
/Non Original/
/Non Original/Electronic/
/Non Original/Synth/
/differentparent/
仅仅复制已删除的文件夹并跳过文件部分是不够的,因为还应该将未删除的文件夹中已删除和修改的文件复制到安全位置,并且您不希望仅仅因为其中的一个文件已删除就复制整个文件夹。
正如你所看到的,这比第一眼看到的更复杂。有没有一个友好的灵魂可以向我提供一组命令来找到这些"父"目录,或者可能是问题的另一个解决方案。
解决方案是rsync中的内置函数--backup和--backup dir=--backup就是它的名称,并与--backup-dir一起使用,后者将备份的文件移动到一个安全的位置,问题就解决了。