使用 rsync 删除源中存在的文件

使用 rsync 删除源中存在的文件

我在服务器“A”上有一个名为 的文件夹./delete

我想删除./stuff服务器“B”上的文件夹中存在于./delete服务器“A”上的文件夹中的所有内容。

它就像 rsync 的逆过程。我只想删除服务器“B”上两个位置上的所有文件,而不是从 到 传输文件a:/deleteb:/stuff

比如--delete-on-destination旗帜什么的。

答案1

rsync 等文件复制工具不会轻松帮助您,因为您不想复制任何文件。

在大多数情况下,列出服务器 A 上的文件并删除服务器 B 上的这些文件的直接方法是一种不错的方法。如果您的服务器findxargs命令能够理解空分隔符(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 -rfB 上精心选择的目录树将在 B 上本地执行相同的工作,但会节省很多传输中的带宽。在这种情况下,文件同步工具就可以发挥作用。您可以运行rsync -nv并尝试解析输出,但在此基础上构建可靠的东西并不容易。

答案2

我也想这样做,并决定为其编写一个 ruby​​ 脚本。

干得好:

https://github.com/saizai/utils/blob/master/rm_dupes_from.rb

答案3

我不认为 rsync 可以解决你的问题。但另一个同步工具也许可以帮助您。看一眼一致

Unison 有很多功能,可以同步不同机器上的两个文件夹。 Unison 是用 OCaml 编写的,这是一种迷人的函数式语言。

Rsync 是一个单向同步工具。Unison 是一个双向同步工具。

相关内容