是否可以使用 rsync 比较两个目录并仅打印差异?有一个试运行选项,但是当我将详细程度增加到一定程度时,会显示每个比较的文件。
ls -alR
这里没有diff
选项,因为源代码中存在硬链接,使得每一行都不同。 (当然,我可以用 perl 删除这一列。)
答案1
添加到尼尔斯的答案(对于通过谷歌遇到这个问题的任何人),默认情况下rsync
仅比较文件大小和修改时间来判断是否存在任何差异。 (如果它们不同,它会执行更多操作,但如果它们相同,它会停在那里。)
如果你想比较实际文件内容,即使对于具有相同大小和上次修改时间的文件,也添加标志-c
来告诉rsync
使用校验和来比较文件。
rsync -avnc $SOURCE $TARGET
(该-u
选项告诉 rsync 忽略$TARGET
比 on更新的文件$SOURCE
,如果您要比较内容,您可能不希望这样做。)
答案2
rsync -avun --delete
您可能必须在两个方向上运行类似的操作 。
但你实际上想要实现什么目标?
更新:
rsync -avun --delete $TARGET $SOURCE |grep "^deleting "
将为您提供目标目录中不存在的文件列表。
“grep delet”因为每行打印:删除ing ..文件..
rsync -avun $SOURCE $TARGET
将为您提供“不同”文件(包括新文件)的列表。
答案3
仅供那些不太熟悉的人使用rsync
:
rsync -rvnc --delete ${SOURCE}/ ${DEST}
-r
:递归到目录;-v
:列出文件)-n
:最重要的一点——做不是改变任何事情;-c
:通过校验和而不是 mod-time & size 比较内容(-a
否则使用);--delete
:寻找对称的差异,而不是单向的差异。- 最后,
/
意味着“查看目录内部,并比较其内容到目的地”。
它将打印通常的
rsync
输出,
- 与一个<文件名>在每个“新”文件的一行上
${SOURCE}
- 和一个“删除<文件名>”中每个“新”文件的行
${DEST}
。
- 它还可能打印一些警告,例如“跳过非常规文件<文件名>”对于符号链接。
附言。我知道这是一个糟糕的 PS——但它确实是匆忙添加的。尽管如此,我打赌人们可能会发现这很有用。
聚苯硫醚。或者,也可以这样做
find $SOURCE -type f -exec md5sum {} \; | tee source.md5
find $DEST -type f -exec md5sum {} \; | tee dest.md5
如果文件名不包含换行符,我们就可以对这两个*.md5
文件及其diff
本身进行排序。 (不过,这仅适用于文件;也就是说,不会检测到两侧的空目录。)
答案4
我从你的问题中了解到你不想使用 diff上 LS,但您也可以在目录上递归地使用 diff:
diff -rq DIR1 DIR2