如何让 rsync 不打印目录

如何让 rsync 不打印目录

我使用 rsync 在外部硬盘上创建备份。我通常会先运行一次试运行,以检查是否正确。具体来说,我将使用

rsync -auvn path/to/source path/to/dest

但是,无论是否需要复制该目录或其中的任何文件,此命令都会打印所有递归目录。由于我正在备份一个大型文件结构,因此此命令会打印数百个目录,而通常只有几个文件需要复制。因此,此输出并不理想,需要我仔细研究数百行不必要的输出才能真正进行健全性检查。

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

有什么办法可以让 rsync 的空运行模式不打印出目录?

答案1

我的解决方案是这样的:

rsync -auovin SOURCE_DIR/ DEST_DIR/ |sed '/^.d/d'

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

答案2

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

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

deleting folderA/
deleting folderA/folderB/

另外,为了便于阅读,我喜欢保留空行(^$),因此完整的管道是:

rsync -auvn --delete source_folder destination_folder | grep -E '^deleting|[^/]$|^$'

如果有一个标志不打印目录名称(它几乎为所有其他内容提供了一个选项)那就太好了,rsync但同时,这是我想到的最好的解决办法。

答案3

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

答案4

同样的问题。我的通用解决方法是过滤掉以 / 结尾的行(目录),只要第一个单词包含 /,即不是“删除”。这只会在命令行上指定的顶级目录名称中包含空格时失败,例如“My parent dir/source_subdir”,因为 awk 会将第一个单词视为“My”。

rsync -avP --dry-run --stats --delete foo dest/dir/ | awk '!($1~/\// && /\/$/)'

相关内容