我使用 rsync 在外部硬盘驱动器上创建备份。我通常先进行一次试运行,只是为了检查完整性。具体来说,我将使用
rsync -auvn path/to/source path/to/dest
Run Code Online (Sandbox Code Playgroud)
但是,这会打印递归到的所有目录,无论是否需要复制它或其任何文件。由于我正在备份一个大型文件结构,这将打印我们的数百个目录,通常只有几个文件需要复制。因此这个输出并不理想,需要我挖掘数百行不必要的输出来实际进行我的健全性检查。
我希望能够告诉它只打印要执行的实际操作。我目前的解决方法是| grep '\.'
,但显然这不是一个完美的过滤器。
有没有办法让 rsync 的试运行模式不打印目录?
我经常使用 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。
小智 1
我的解决方案是这样的:
rsync -auovin SOURCE_DIR/ DEST_DIR/ |sed '/^.d/d'
Run Code Online (Sandbox Code Playgroud)
诀窍在于该i
参数将打印所有行,并在前面添加额外信息。对于文件,该额外信息将以 . 开头.f..
;对于目录,该额外信息将以 . 开头.d..
。该sed
命令会说,对于输出中以 开头的每一行.d
,将其从输出中删除。