我diff -r a b
用来递归比较目录a和b。尽管经常有一些断开的链接(a和b目录中相同的断开链接并指向相同的,不存在的目标),但这种情况经常发生。
diff然后针对这些情况输出错误消息,并以非零退出代码退出,但是我希望它保持沉默,并以0退出,因为目录与我的书相同。
我怎样才能做到这一点?
我diff -r a b
用来递归比较目录a和b。尽管经常有一些断开的链接(a和b目录中相同的断开链接并指向相同的,不存在的目标),但这种情况经常发生。
diff然后针对这些情况输出错误消息,并以非零退出代码退出,但是我希望它保持沉默,并以0退出,因为目录与我的书相同。
我怎样才能做到这一点?
Answers:
对于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
或单线:
for f in `find a/* ! -type l`;do diff -rq $f b/${f##*/};done
这将标识内容不同的文件,或a中但b中没有的文件。
注意:
rsync
for f in
找到a / *!类型l ;do echo $f b/${f#*/};done
。我现在没有时间对此进行测试。让我知道是否可行。
$(xxx)
反引号代替。反引号的对称性使它们的可读性降低,并防止嵌套。关于图1和2见stackoverflow.com/questions/11366184/...
您可以使用更高版本的 diff
将diff
在GNU diffutils
3.3包括一个--no-dereference
选项,允许您将符号链接本身比较,而不是他们的目标。它报告他们是否不同,如果他们同意则保持安静,并且不在乎是否被破坏。
我不知道该选项何时添加;它在2.8.1中不存在。