列出最长的多个目录前缀

时间:2014-02-09 00:50:13

标签: bash backup rsync

我有一个使用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/

仅仅复制已删除的文件夹并跳过文件部分是不够的原因是,删除和修改的文件(驻留在未删除的文件夹中)应该被复制到安全位置并且您不希望仅仅因为其中的一个文件被删除而复制整个文件夹。

如你所见,这比乍一看更复杂。是否有一个友好的灵魂可以向我提供一组命令,可以找到这些“父”目录或可能是问题的另一种解决方案。

1 个答案:

答案 0 :(得分:0)

解决方案是rsync中的内置函数--backup和--backup-dir =。 --backup执行它所调用的内容并与--backup-dir一起使用,它将备份文件移动到安全位置,问题解决了。