通过rsync从dest目录中删除无关的文件?


51

说我有

SRC 
  001.jpg
  002.jpg
  001.txt
  a.zip

DEST
  hello.jpg

rsync -d --delete SRC:{*.jpg,*.txt} DEST

它不会从DEST中删除hello.jpg,知道如何将其归档吗?

Answers:


72

rsync手册页(添加了重点)说明了您的命令不起作用的原因:

- 删除

这告诉rsync从接收方删除无关的文件(不在发送方的文件),但仅针对正在同步的目录。 您必须已经要求rsync发送整个目录(例如“ dir”或“ dir /”),而不使用通配符作为目录内容(例如“ dir / *”),因为通配符已被外壳扩展,因此rsync得到一个请求传输单个文件,而不是文件的父目录。 除非您使用--delete-excluded选项或将规则标记为仅与发送方匹配,否则也将从删除中排除从传输中排除的文件(请参阅“过滤规则”部分中的“包括/排除”修饰符)。

因此,当您跑步时

$ rsync -d --delete SRC:{*.jpg,*.txt} DEST

DEST中不需要的文件不会被删除,因为您实际上并没有要求同步一个目录,而只是要求一些特定的文件。要获得所需的结果,请尝试如下操作:

rsync -d --delete-excluded --include '*.jpg' --include '*.txt' --exclude '*' SRC/ DEST/

请注意,include和exclude指令的顺序很重要。本质上,每个文件都按照包含或排除模式出现的顺序进行检查。因此,具有.jpg或.txt扩展名的文件将被同步,因为它们在与排除的“ *”模式匹配之前便与“包含”模式匹配。该--exclude '*'模式排除了其他所有内容。该--delete-excluded选项可确保删除DEST端的排除文件。


@Cheng,想多说明一点吗?如果有问题/改进,我很乐意更新我的答案。
史蒂文·D

有用。我猜。--process的事情使我感到困惑,使我以为它又被转移了。

我已经编辑了答案,以进行进一步解释。
史蒂文D

2
@程:我怀疑你不要--delete-excluded。没有它,只有*.jpg*.txt可在目的地侧被删除。有了它,不相关的文件也将被删除。您可能对本教程中的rsync过滤器感兴趣。
吉尔(Gilles)“所以,别再邪恶了”,

3
谢谢!对我而言,我在源目录中缺少斜杠。
沃恩2012年
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.