重用rsync --dry-run输出以加快稍后的实际传输速度


23

我通常rsync -n在做实际的事情前就做过rsync。问题是,我如何才能使第二轮运行自动化以完全重复使用生成的列表--dry-run

我的意思是,如果我运行了,rsync -n然后得到了rsync将要执行的模拟操作,我的想法是获取该输出,对其进行处理,然后以某种方式rsync仅生成--include-from该输出,因此完整列表仅需计算一次。

如果这甚至没有道理,请告诉我。

顺便说一下,我倾向于使用rsync -hva --progress --stats --delete --exclude-from "$EXCLUDEFILE"。如果您对使用什么选项也有建议,请告诉我。我正在尝试将外部硬盘驱动器(仅包含图像,视频和文档)的内容复制到另一个外部硬盘驱动器。


您可以尝试将--dry-run命令的输出重定向到文件(例如rsync --dry-run -avz SOURCE DEST > include.txt),从include.txt中删除不是文件/路径的所有行,然后运行rsync --include-from include.txt
ThatGuy

最后一个命令应该是rsync --include-from include.txt --exclude=* SOURCE DEST。有关详细信息,请参见stackoverflow.com/a/19296415/1765910
ThatGuy 2016年

是的,那是个主意,但我不知道该怎么做(再加上我希望得到一个真正知道他在做什么的人的同意)。我只是用,rsync但对shell脚本/ bash一无所知…
Manuel

Answers:


18

当然,可以将在空运行期间生成的文件列表用作包含文件。但是,理想情况下,应该删除空运行输出顶部和底部的多余行。

输出示例:

sending incremental file list
[LIST OF FILES]

sent 226 bytes  received 34 bytes  520.00 bytes/sec
total size is 648,373,274  speedup is 2,493,743.36 (DRY RUN)

要删除这些行,请将rsync输出通过管道传递headtail。然后,将处理后的输出保存到一个包含文件中:

rsync --dry-run -avz source/ destination/ | head --lines=-3 | tail --lines=+3 > include.txt

最后,告诉rsync使用生成的包含文件(根据需要添加其他选项):

rsync --include-from=include.txt --exclude=* source/ dest/


这样做的问题是它不能处理应删除的文件。tail/ head健壮的方法是否足以确保仅包含文件列表?
曼努埃尔

添加--delete会导致从源目录中删除的文件也从目标目录中删除,至少在我尝试过的计算机上也是如此。您可以完全省略tail/ head部分。rsync将包含文件中的每一行解释为一个文件名,而只是忽略不存在的文件,因此,如果保留多余的行,则什么也不会发生(除非碰巧有名为“发送增量文件列表”的文件,依此类推)这些文件也会被复制)。
ThatGuy
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.