【问题标题】:Comparison function that compares two text files in Unix比较 Unix 中的两个文本文件的比较函数
【发布时间】:2012-10-04 21:11:27
【问题描述】:

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

谢谢

【问题讨论】:

  • diff -u file1 file2 注意:patch 程序可以(并且将)使用 diff 的输出将 file1“编辑”为 file2(反之亦然)

标签: bash unix cmp


【解决方案1】:

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

  • cmp -s file1 file2:看$?的值。如果两个文件匹配则为零,否则为非零。
  • diff file1 file2 > /dev/nulldiff 命令的某些形式可以接受一个参数,告诉它不要输出任何东西。然而,大多数都没有。毕竟,您使用diff 来查看两个文件之间的差异。同样,退出代码(您可以检查 $? 的值,如果文件匹配则为 0,否则为非零。

您可以在 shell if 语句中使用这些命令:

if cmp -s file1 file2
then
   echo "The files match"
else
   echo "The files are different"
fi

diff 命令专门用于文本文件。 cmp 命令也应该适用于所有二进制文件。

【讨论】:

  • 如果你想让 if 更短,并且只在文件不同时执行 if 怎么办?我可以使用! 吗?我不清楚我的字面意思是颠倒你的逻辑,第一个 then 将是“文件不匹配”,否则“文件匹配”
【解决方案2】:

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

if cmp file1 file1; then
    ...
fi

希望这会有所帮助 =)

【讨论】:

  • 刚刚击败我。 :-) 添加-s 选项将确保它对不同的文件保持沉默,并且只提供返回码,因此您不会获得额外的输出
【解决方案3】:
#!/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

【讨论】:

    【解决方案4】:

    您可以对这两个文件执行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 ]; [stackoverflow.com/questions/12736013/…]
    【解决方案5】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-25
      • 1970-01-01
      • 2012-12-17
      • 2013-09-25
      • 1970-01-01
      • 2017-04-09
      相关资源
      最近更新 更多