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

Che*_*eng 51 rsync

说我有

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

DEST
  hello.jpg
Run Code Online (Sandbox Code Playgroud)

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

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

Ste*_*n D 74

rsync手册页解释了您的命令不起作用的原因(强调已添加):

- 删除

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

因此,当你运行

$ rsync -d --delete SRC:{*.jpg,*.txt} DEST
Run Code Online (Sandbox Code Playgroud)

DEST 中不需要的文件不会被删除,因为您实际上并未要求同步目录,而只是要求同步少数特定文件。要获得您想要的结果,请尝试以下操作:

rsync -d --delete-excluded --include '*.jpg' --include '*.txt' --exclude '*' SRC/ DEST/
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢!对我来说,我缺少源目录上的尾部斜杠。 (3认同)
  • @Cheng:我怀疑你不想要`--delete-excluded`。没有它,在目标端只能删除`*.jpg`和`*.txt`。有了它,不相关的文件也将被删除。您可能对这个 [rsync 过滤器教程](http://unix.stackexchange.com/questions/2161/rsync-filter-copying-one-pattern-only/2503#2503) 感兴趣。 (2认同)