我有很多文件,我想检查所有这些文件是否具有相同的内容。
我可以使用什么命令行来检查?
用法可能是这样的:
$ diffseveral file1 file2 file3 file4
结果:
All files equals
或者
Files are not all equals
答案1
使用 GNU diff,将其中一个文件作为参数传递给,--from-file
并将任意数量的其他文件作为操作数传递:
$ diff -q --from-file file1 file2 file3 file4; echo $?
0
$ echo >>file3
$ diff -q --from-file file1 file2 file3 file4; echo $?
Files file1 and file3 differ
1
您可以像往常一样使用通配符。例如,如果当前目录包含file1
、file2
、file3
和file4
,则以下示例将file2
、file3
和file4
与进行比较file1
。
$ diff -q --from-file file*; echo $?
请注意,“from file”必须是常规文件,而不是管道,因为 diff 会多次读取它。
答案2
怎么样:
md5sum * | awk 'BEGIN{rc=1}NR>1&&$1!=last{rc=0}{last=$1}END{exit rc}'
计算每个文件的 MD5 值,然后将每个条目与下一个条目进行比较,如果有不同,则返回零(真)退出状态。如果不同则返回 false,这会短得多:
md5sum * | awk 'NR>1&&$1!=last{exit 1}{last=$1}'
不需要排序,因为我们只是检查是否有不同。
答案3
下面的代码应该是相当不言自明的。 $#
是文件参数的数量,shift
一次只消耗一个。用于cmp -s
静默字节比较。
#!/bin/sh
# diffseveral
if [ $# -lt 2 ]; then
printf '%s\n' "Usage: $0 file1 file2 [files ...]" >&2
exit 2
fi
oldfile="$1"
shift
while [ $# -gt 0 ]; do
newfile="$1"
if ! cmp -s "$oldfile" "$newfile"; then
echo 'Files differ.'
exit 1;
fi
shift
done
echo 'All files identical.'
exit 0
答案4
diff
您一次只能使用两个,但检查它们是否都相等相当容易:
if diff file1 file2 && diff file2 file3 && diff file3 file4; then
echo All equal
else
echo Not
fi
如果您有足够的理由证明循环合理,请使用如下内容:
alleq () {
for file; do
diff -q "$1" "$file" >/dev/null || return 1
done
}
if alleq file1 file2 ...; then
echo All equal
else
echo Not
fi