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

时间:2012-10-04 21:11:28

标签: bash unix cmp

我想知道是否有人能告诉我unix中是否有可用的功能,bash会比较文件的所有行。如果它们不同,则应输出true / false或-1,0,1。我知道这些cmp函数存在于其他语言中。我一直在寻找手册页,但都没有成功。如果没有,有人可以帮我提出替代解决方案吗?

由于

5 个答案:

答案 0 :(得分:32)

有几种方法可以做到这一点:

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

答案 1 :(得分:6)

有一个简单的cmp file file命令可以做到这一点。如果它们相等则返回0,如果它们不同则返回1,因此在if s中使用它是微不足道的:

if cmp file1 file1; then
    ...
fi

希望这有助于=)

答案 2 :(得分:1)

#!/bin/bash

file1=old.txt
file2=new.txt

echo " TEST 1 : "
echo

if [ $( cmp -s ${file1} ${file2}) ]
then
   echo "The files match"
else
   echo "The files are different"
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 : "
echo

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

mdd1=$(echo $md1 | awk '{print $4}' ) 
mdd2=$(echo $md2 | awk '{print $4}' ) 
echo $md1
echo $mdd1
echo $md2
echo $mdd2
echo

#if [ $mdd1 = $mdd2 ]; 
if [ $mdd1 -eq $mdd2 ]; 
then
   echo "The files match"
else
   echo "The files are different"
fi

答案 3 :(得分:0)

您可以对这两个文件执行md5,然后比较bash中的结果。

这里没有Unix框可供测试,但这应该是正确的。

#!/bin/bash

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

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

答案 4 :(得分:0)

echo“读取第一个文件” 读f1 echo“读取第二个文件” 阅读f2

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