我使用 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~/\// && /\/$/)'