![使用 rsync 删除源中存在的文件](https://linux22.com/image/49778/%E4%BD%BF%E7%94%A8%20rsync%20%E5%88%A0%E9%99%A4%E6%BA%90%E4%B8%AD%E5%AD%98%E5%9C%A8%E7%9A%84%E6%96%87%E4%BB%B6.png)
我在服务器“A”上有一个名为 的文件夹./delete
。
我想删除./stuff
服务器“B”上的文件夹中存在于./delete
服务器“A”上的文件夹中的所有内容。
它就像 rsync 的逆过程。我只想删除服务器“B”上两个位置上的所有文件,而不是从 到 传输文件a:/delete
。b:/stuff
比如--delete-on-destination
旗帜什么的。
答案1
rsync 等文件复制工具不会轻松帮助您,因为您不想复制任何文件。
在大多数情况下,列出服务器 A 上的文件并删除服务器 B 上的这些文件的直接方法是一种不错的方法。如果您的服务器find
和xargs
命令能够理解空分隔符(Linux、*BSD、Cygwin),则可以更轻松地处理任意文件名。从A:
cd ./delete
find . ! -type d -print0 | ssh B 'cd /path/to/stuff && xargs -0 rm -f'
这可能会留下一些空目录。您可以删除所有空目录(甚至是之前为空的目录)
ssh B 'cd /path/to/stuff && find . -depth -type d -exec rmdir {} + 2>/dev/null'
如果您只想删除源端存在的目录,则需要再次使用该列表:
find . -depth -type d -print0 | ssh B 'cd /path/to/stuff && xargs -0 rmdir'
如果 A 上有包含大量文件的目录树,而 B 上不存在,则会传输整个文件列表以进行擦除,而rm -rf
B 上精心选择的目录树将在 B 上本地执行相同的工作,但会节省很多传输中的带宽。在这种情况下,文件同步工具就可以发挥作用。您可以运行rsync -nv
并尝试解析输出,但在此基础上构建可靠的东西并不容易。
答案2
答案3
我不认为 rsync 可以解决你的问题。但另一个同步工具也许可以帮助您。看一眼一致。
Unison 有很多功能,可以同步不同机器上的两个文件夹。 Unison 是用 OCaml 编写的,这是一种迷人的函数式语言。
Rsync 是一个单向同步工具。Unison 是一个双向同步工具。