最快的方法来判断Unix / Linux中的两个文件是否相同?

我有一个shell脚本,我需要检查两个文件是否相同。 我这样做了很多文件,在我的脚本diff命令似乎是性能瓶颈。

这里是行:

 diff -q $dst $new > /dev/null if ($status) then ... 

有没有更快的方法来比较文件,也许是一个自定义的algorithm,而不是默认的diff

我相信cmp将停止在第一个字节的差异:

 cmp --silent $old $new || echo "files are different" 

我喜欢@Alex Howansky为此使用了'cmp –silent'。 但是我需要正面和负面的回应,所以我使用:

 cmp --silent file1 file2 && echo '### SUCCESS: Files Are Identical! ###' || echo '### WARNING: Files Are Different! ###' 

然后我可以在terminal或者用ssh在一个常量文件中检查文件。

你为什么不得到这两个文件内容的散列?

试试这个脚本,例如调用它script.sh然后运行它,如下所示:script.sh file1.txt file2.txt

 #!/bin/bash file1=`md5 $1` file2=`md5 $2` if [ "$file1" = "$file2" ] then echo "Files have the same content" else echo "Files have NOT the same content" fi 

对于不相同的文件,任何方法都需要完全读取两个文件,即使读取过去也是如此。

没有替代。 因此,在某个时间点创build哈希或校验和需要读取整个文件。 大文件需要时间。

文件元数据检索比读取大文件要快得多。

那么,是否有任何文件元数据可以用来确定这些文件是不同的? 文件大小 ? 或甚至只读取文件的一小部分的文件命令的结果?

文件大小示例代码片段:

  ls -l $1 $2 | awk 'NR==1{a=$5} NR==2{b=$5} END{val=(a==b)?0 :1; exit( val) }' [ $? -eq 0 ] && echo 'same' || echo 'different' 

如果这些文件大小相同,那么您将被完整的文件读取卡住。

也尝试使用cksum命令:

 chk1=`cksum <file1> | awk -F" " '{print $1}'` chk2=`cksum <file2> | awk -F" " '{print $1}'` if [ $chk1 -eq $chk2 ] then echo "File is identical" else echo "File is not identical" fi 

cksum命令将输出文件的字节数。 见'男人'。