如何打印使用 rsync 更改的文件?

Joe*_*sai 48 linux bash diff rsync

有没有办法让 rsync 打印所有不同文件的完整文件路径,而无需实际传输任何文件?

或者,我需要一种仅根据大小或上次修改时间的变化跨两棵树(通过 SSH)区分文件的方法。

小智 48

Rsync 有一个dry-run选项:

-n, --dry-run               show what would have been transferred
Run Code Online (Sandbox Code Playgroud)

我不确定这是否是您想要的。

如果你想要diff跨越两棵树的文件,你可以使用 find 和 pipe 递归搜索两个方向以输出到 ls 并通过管道将两者都输出到一个文件。然后,您可以diff用来比较文件。

  • 但是 --dry-run 似乎显示文件,即使它们是相同的。 (10认同)
  • +1,这是 rsync 内置的。`--dry-run` 的输出细节将取决于你对 `-v` 和 `--progress 选项` 的使用 - 所以如果你根本没有得到输出,请检查这些选项是否根据需要设置。我注意到即使文件没有更改,它也会发送目录名称,但是您可以通过将输出传递给 `sed` 或类似方法来过滤掉这些名称。 (4认同)

kab*_*bZX 18

我更喜欢使用 --out-format 来查看详细信息,将其减少到更少:

rsync -azh --dry-run --delete-after --out-format="[%t]:%o:%f:Last Modified %M" source destination | less
Run Code Online (Sandbox Code Playgroud)


小智 12

rsync -rvn localdir targetdir

-n 表示仅显示操作(不执行任何操作)。

请注意,您需要“v”,否则它不会显示任何内容!(其余的答案忘记了这一点......)

  • 对于追随者 -n 相当于“--dry-run” :) (6认同)

Yva*_*van 7

建立在其他答案和https://serverfault.com/a/618740/114520 的基础上

  • 使用--dry-run(或-n) 来避免修改
  • 使用--itemize-changes(或-i) 查找更改
  • 使用--archive(或-a) 获取所有子目录
  • 用于egrep过滤掉以点开头的条目(无变化)

这给你:rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^\."

如果您只想要一种方式,您可以更改命令:

  • 对于从源到目的地的更改:rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^(\.|<)"
  • 对于从目的地到源的更改:rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^(\.|>)"

如果您只需要文件,只需添加awk魔法:rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^\." | awk '{print $2}'


rog*_*ack 5

事实是,如果您运行rsync -v ...并且它在屏幕上输出一个文件名,则该文件正在被传输(或者如果您正在执行 --dry-run,则该文件已经被传输)。要确定rsync为何要传输它,请使用 itemize 模式: https: //serverfault.com/a/618740/27813

正如其他人所指出的,默认情况下,rsync 仅根据文件大小和时间戳进行比较,两者都必须匹配,否则会在该文件上启动“增量副本”。如果您确实想查看哪些文件不同,请使用“-c”校验和模式。