2012-10-15 48 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',在第一個區別時停下來,會更快。 –

相關問題