我正在使用diff -r a b递归比较目录a和b。尽管存在一些断开的链接(a和b目录中的相同断开链接并指向相同的、不存在的目标),但经常会发生这种情况。
diff然后为这些情况输出错误消息并以非零退出代码退出,但是我希望它保持沉默,并以 0 退出,因为目录在我的书中是相同的。
我怎样才能做到这一点?
ire*_*ses 34
对于 3.3 或更高版本diff,您应该使用该--no-dereference选项,如Pete Harlan 的回答中所述。
不幸的是,旧版本diff 不支持忽略符号链接:
有些文件既不是目录也不是常规文件:它们是不常见的文件,如符号链接、设备特殊文件、命名管道和套接字。目前,
diff将符号链接视为常规文件;如果在顶层指定其他特殊文件,它会将其他特殊文件视为常规文件,但在比较目录时仅报告它们的存在。这意味着patch不能代表对此类文件的更改。例如,如果更改符号链接指向的文件,则diff输出两个文件之间的差异,而不是符号链接的更改。
diff应该选择性地报告特殊文件的更改,并且patch应该扩展以了解这些扩展名。
如果您只想验证 rsync(并可能修复丢失的内容),那么您可以再次运行 rsync 命令。如果您不想这样做,那么对目录进行校验和可能就足够了。
如果你真的想用 来做到这一点diff,那么你可以使用find跳过符号链接,并分别在每个文件上运行 diff 。将您的目录a和b作为参数传递:
#!/bin/bash
# Skip files in $1 which are symlinks
for f in `find $1/* ! -type l`
do
# Suppress details of differences
diff -rq $f $2/${f##*/}
done
Run Code Online (Sandbox Code Playgroud)
或作为单线:
for f in `find a/* ! -type l`;do diff -rq $f b/${f##*/};done
Run Code Online (Sandbox Code Playgroud)
这将识别内容不同的文件,或者在a 中但不在b 中的文件。
注意:
rsync场景,这可能不是问题。Phi*_*ter 22
由于版本 3.3 GNUdiff不支持取消引用符号链接,而是比较它们指向的路径。
安装 GNU diffutils>= 3.3 并使用该--no-dereference选项;对此没有简短的选择。
如果相等或:诊断将静音:
符号链接/tmp/noderef/a/symlink和/tmp/noderef/b/symlink不同
小智 8
您可以使用较新版本的 diff
将diff在GNU diffutils3.3包括一个--no-dereference选项,允许您将符号链接本身比较,而不是他们的目标。它报告他们是否不同,如果他们同意则安静并且不在乎他们是否被破坏。
我不知道这个选项是什么时候添加的;它在 2.8.1 中不存在。