2012-10-15 43 views
135

我有一个shell脚本,我需要检查两个文件是否相同。我为很多文件做了这个,并且在我的脚本中,diff命令似乎是性能瓶颈。最快的方法来判断Unix/Linux中的两个文件是否相同?

这里的行:

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

if ($status) then ... 

莫不是比较的文件,可能是自定义算法,而不是默认diff更快的方法?

+6

这真的很挑剔,但你并没有要求看看两个文件是否相同,你问的是两个文件是否有相同的内容。相同的文件具有相同的inode(和相同的设备)。 – Zano

回答

227

相信cmp将在第一个字节的区别停止:

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

如何添加更多的命令而不仅仅是一个?我想复制一个文件和roboot。 –

+0

@DanielBrunner:您可以使用'tee'命令从标准输入复制到文件和标准输出。 –

+0

请注意,在我的'cmp'中,我不必将其快捷方式回显,如果它们不同则会打印一条消息,如果不相同则会保持沉默。 – eresonance

12

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

试试这个脚本,调用它例如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 
+0

抱歉不知道你指的是什么,我没有把脚本编写太久。 – JDS

+0

如果两个文件相同,那么它们将具有相同的散列值。例如,如果'file1.txt'的内容是'aaa'和'file2.txt',那么当你得到md5 hash:md5 file1.txt时,你会得到:5c9597f3c8245907ea71a89d9d39d08e,它将和md5 file2.txt输出相同,if你工作了两个哈希,他们是相同的,你可以保证他们都有相同的内容:) – jabaldonedo

+0

哦,像某种检查总和。我认为这是一种可能性;有没有一个简单的UNIX命令呢? – JDS

4

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

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

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

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

文件大小示例代码片段:

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

如果用户名或组名有空白,可以使用'ls -n'来避免问题。 – tricasse

29

我喜欢@Alex Howansky为此使用了'cmp --silent'。但我需要正反两方面的回应,所以我使用:

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

然后我就可以在终端或用SSH运行此检查的文件对一个恒定的文件。

+11

如果您的'echo success'命令(或其他您放置在其位置的命令)失败,则会运行您的“否定响应”命令。你应该使用“if-then-else-fi”结构。例如,像[这个简单的例子](http://stackoverflow.com/a/16034851/5419599)。 – Wildcard

+0

替换请在脚本中输入''' –

2

尝试也使用校验和命令:

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 

的校验和命令将输出文件的字节数。参见'man cksum'。

+1

这是我的第一个想法,然而,如果你必须多次比较相同的文件,哈希值才有意义,因为哈希值只计算一次,如果只比较一次,那么'md5'无论如何都会读取整个文件,所以'cmp',在第一个区别时停下来,会更快。 –

相关问题