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

我有一个shell脚本,其中我需要检查两个文件是否相同。我对很多文件进行检查,在我的脚本中,diff命令似乎是性能的瓶颈。

下面是这一行:

diff -q $dst $new > /dev/null

if ($status) then ...

能否有一种更快的方法来比较文件,也许是一种自定义算法,而不是默认的`diff'?

解决办法

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

cmp --silent $old $new || echo "files are different"
评论(10)

你为什么不获取两个文件内容的哈希值?

试试这个脚本,比如叫它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
评论(23)

对于没有差异的文件,任何方法都需要完全读过这两个文件,即使读的是过去的文件。

没有其他选择。 因此,在某个时间点上创建哈希值或校验值需要读取整个文件。大文件需要时间。

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

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

文件大小的例子代码片段:

  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'  

如果文件大小相同,那么你就只能进行全文件读取。

评论(1)