2014-02-09 18 views
0

我有利用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) 

这里列出了删除的文件和删除的文件夹。如果您只是简单地将所有内容复制到“|” - 符号的右侧,以“* deleted”开头,那么当您已经复制文件夹及其内容时,您最终将复制已删除文件夹中的文件。或者相反,取决于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/ 

的原因,它是不足以仅复制已删除的文件夹并跳过文件 - 部分原因是删除并修改了未驻存在未删除的文件夹中的文件应复制到安全位置,并且您不希望只复制整个文件夹其中的文件已被删除。

正如你看到的,这是更复杂的比第一眼满足眼睛。有没有一个友善的灵魂在那里,可以给我一组命令,可以找到这些“父”的目录或可能的另一个解决方案的问题。

+0

问题是有点混乱给我。如果您只是试图从文件和文件夹列表转到输出,那么可以更多地解释一下规则是什么。例如目前还不清楚为什么'/ Original/Artist/Dir_en_grey/dir1/dir2 /'不应该输出? – BroSlow

+0

这是因为rsync发现整个文件夹**/Original/Artist/Dir_en_grey/**已被删除,因此是子文件夹** dir1/dir2/dir1/**包含并且在cp复制内容时已复制/ Original/Artist/Dir_en_grey到安全的位置。正如你在rsync的输出只能看到两个文件夹被删除,其内容一起,无论是文件或文件夹或没有内容: '*删除| /原厂/艺术家/ Dir_en_grey /' '*删除| /非\ Original/Electronic/dir2 /' – Nikken

+0

没有建议..?任何人 :) – Nikken

回答

0

将溶液的内置函数--backup和--backup-DIR =在rsync的。 --backup只是调用它并与--backup-dir一起使用,将备份的文件移动到安全的位置,问题就解决了。