最快的方法来判断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命令将输出文件的字节数。 见'男人'。