如何让 rsync 不打印目录

And*_*rtz 9 linux rsync

我使用 rsync 在外部硬盘驱动器上创建备份。我通常先进行一次试运行,只是为了检查完整性。具体来说,我将使用

rsync -auvn path/to/source path/to/dest
Run Code Online (Sandbox Code Playgroud)

但是,这会打印递归到的所有目录,无论是否需要复制它或其任何文件。由于我正在备份一个大型文件结构,这将打印我们的数百个目录,通常只有几个文件需要复制。因此这个输出并不理想,需要我挖掘数百行不必要的输出来实际进行我的健全性检查。

我希望能够告诉它只打印要执行的实际操作。我目前的解决方法是| grep '\.',但显然这不是一个完美的过滤器。

有没有办法让 rsync 的试运行模式不打印目录?

Ant*_*gan 9

我经常使用 rsync 来同步目录结构,并且喜欢在运行实际命令之前进行试运行。我也对目录名称的打印感到恼火,所以我grep用来过滤它们。

我的用法和你的用法之间的一个区别是我使用了--delete从目标目录中删除文件的选项。因此,我不希望grep过滤掉诸如

deleting folderA/
deleting folderA/folderB/
Run Code Online (Sandbox Code Playgroud)

此外,我喜欢保留空行 ( ^$) 以提高可读性,因此完整的管道是:

rsync -auvn --delete source_folder destination_folder | grep -E '^deleting|[^/]$|^$'
Run Code Online (Sandbox Code Playgroud)

如果rsync有一个不打印目录名称的标志(它几乎可以选择其他所有内容),那就太好了,但与此同时,这是我想出的最好的 hack。


小智 5

我遇到了一个非常类似的问题,我正在进行一次试运行,并且不必要地打印未修改的目录。我发现--omit-dir-times(简而言之-O)解决了这个问题。


小智 1

我的解决方案是这样的:

rsync -auovin SOURCE_DIR/ DEST_DIR/ |sed '/^.d/d'
Run Code Online (Sandbox Code Playgroud)

诀窍在于该i参数将打印所有行,并在前面添加额外信息。对于文件,该额外信息将以 . 开头.f..;对于目录,该额外信息将以 . 开头.d..。该sed命令会说,对于输出中以 开头的每一行.d,将其从输出中删除。