我想知道在Unix、Bash中是否有一个可以比较文件所有行的函数。如果它们不同,应输出true/false,或者-1、0、1。我知道其他语言中存在cmp函数,但我在man页面上找了一圈却没有找到成功的方法。如果没有这个功能,能否有人帮我提供替代解决方案?
谢谢
有几种方法可以实现此目的:
cmp -s file1 file2
:查看$?
的值。如果两个文件匹配,则为零,否则为非零。diff file1 file2 > /dev/null
:某些形式的diff
命令可以接受一个参数,告诉它不要输出任何内容。但是,大多数都不会这样做。毕竟,您使用diff
来查看两个文件之间的差异。同样,退出代码(您可以检查$?
的值)为0表示两个文件匹配,否则为非零。您可以在shell if语句中使用这些命令:
if cmp -s file1 file2
then
echo "The files match"
else
echo "The files are different"
fi
diff
命令是专门用于文本文件的。而 cmp
命令则适用于所有二进制文件。
有一个简单的cmp file file
命令可以实现这一点。如果它们相等,则返回0,如果它们不同,则返回1,因此在if
语句中使用它非常简单:
if cmp file1 file1; then
...
fi
-s
选项将确保对于不同的文件它是静默的,并且只提供返回代码,因此您不会得到额外的输出。 - TaninDirect#!/bin/bash
file1=old.txt
file2=new.txt
echo " TEST 1 : "
echo
if [ $( cmp -s ${file1} ${file2}) ]
then
echo "The files match : ${file1} - ${file2}"
else
echo "The files are different : ${file1} - ${file2}"
fi
echo
echo " TEST 2 : "
echo
bool=$(cmp -s "$file1" "$file2" )
if cmp -s "$file1" "$file2"
then
echo "The files match"
else
echo "The files are different"
fi
echo
echo " TEST 3 : md5 / md5sum - compute and check MD5 message digest"
echo
md1=$(md5 ${file1});
md2=$(md5 ${file2});
mdd1=$(echo $md1 | awk '{print $4}' )
mdd2=$(echo $md2 | awk '{print $4}' )
# or md5sum depends on your linux flavour :D
#md1=$(md5sum ${file1});
#md2=$(md5sum ${file2});
#mdd1=$(echo $md1 | awk '{print $1}' )
#mdd2=$(echo $md2 | awk '{print $1}' )
echo $md1
echo $mdd1
echo $md2
echo $mdd2
echo
#if [ $mdd1 = $mdd2 ];
if [ $mdd1 -eq $mdd2 ];
then
echo "The files match : ${file1} - ${file2}"
else
echo "The files are different : ${file1} - ${file2}"
fi
你可以在这两个文件上执行 md5,然后在 bash
中比较结果。
这里没有 Unix 系统来测试,但应该是正确的。
#!/bin/bash
md1=$(md5 file1);
md2=$(md5 file2);
if [ $md1 -eq $ $md2 ]; then
echo The same
else
echo Different
fi
echo "读取第一个文件" read f1 echo "读取第二个文件" read f2
diff -s f1 f2 # 如果两个文件相同,则打印
diff -u file1 file2
。注意:diff
的输出可以(并且将会)被patch
程序用来“编辑”file1
到file2
(或反之亦然)。 - wildplasser