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

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

说我有

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

DEST
  hello.jpg

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

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

答案1

您的命令不起作用的原因由rsync 的手册页(强调):

- 删除

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

因此,当你跑步时

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

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

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

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

相关内容