在Unix中比较两个文本文件的比较函数

16

我想知道在Unix、Bash中是否有一个可以比较文件所有行的函数。如果它们不同,应输出true/false,或者-1、0、1。我知道其他语言中存在cmp函数,但我在man页面上找了一圈却没有找到成功的方法。如果没有这个功能,能否有人帮我提供替代解决方案?

谢谢


diff -u file1 file2。注意:diff 的输出可以(并且将会)被 patch 程序用来“编辑” file1file2(或反之亦然)。 - wildplasser
5个回答

38

有几种方法可以实现此目的:

  • 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 命令则适用于所有二进制文件。


如果想让if语句更短,并且只有文件不同时才执行,该怎么办?我能直接使用“!”吗?我的意思是要颠倒逻辑,第一个“then”的意思是“文件不匹配”,而“else”的意思是“文件匹配”。 如果条件成立,可以使用单个感叹号“!”来翻转逻辑。 - Freedo

7

有一个简单的cmp file file命令可以实现这一点。如果它们相等,则返回0,如果它们不同,则返回1,因此在if语句中使用它非常简单:

if cmp file1 file1; then
    ...
fi

希望这有所帮助 =)

2
刚想说这个。 :-) 添加一个 -s 选项将确保对于不同的文件它是静默的,并且只提供返回代码,因此您不会得到额外的输出。 - TaninDirect

2
#!/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

0

你可以在这两个文件上执行 md5,然后在 bash 中比较结果。

这里没有 Unix 系统来测试,但应该是正确的。

#!/bin/bash

md1=$(md5 file1);
md2=$(md5 file2);

if [ $md1 -eq $ $md2 ]; then
  echo The same
else
  echo Different
fi

这不起作用,因为它总是不同的,因为文件名也被打印出来了。 请参阅之前的答案之一:TEST 3: `md1 = $(md5 $ {file1}); md2 = $(md5 $ {file2});mdd1 = $(echo $ md1 | awk '{print $ 4}') mdd2 = $(echo $ md2 | awk '{print $ 4}')if [ $ mdd1 -eq $ mdd2]; `[https://dev59.com/-Gcs5IYBdhLWcg3wk06X#36638506] - kris

0

echo "读取第一个文件" read f1 echo "读取第二个文件" read f2

diff -s f1 f2 # 如果两个文件相同,则打印


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接