我有一個shell腳本,我需要檢查兩個文件是否相同。我爲很多文件做了這個,並且在我的腳本中,diff
命令似乎是性能瓶頸。最快的方法來判斷Unix/Linux中的兩個文件是否相同?
這裏的行:
diff -q $dst $new > /dev/null
if ($status) then ...
莫不是比較的文件,可能是自定義算法,而不是默認diff
更快的方法?
我有一個shell腳本,我需要檢查兩個文件是否相同。我爲很多文件做了這個,並且在我的腳本中,diff
命令似乎是性能瓶頸。最快的方法來判斷Unix/Linux中的兩個文件是否相同?
這裏的行:
diff -q $dst $new > /dev/null
if ($status) then ...
莫不是比較的文件,可能是自定義算法,而不是默認diff
更快的方法?
相信cmp
將在第一個字節的區別停止:
cmp --silent $old $new || echo "files are different"
如何添加更多的命令而不僅僅是一個?我想複製一個文件和roboot。 –
@DanielBrunner:您可以使用'tee'命令從標準輸入複製到文件和標準輸出。 –
請注意,在我的'cmp'中,我不必將其快捷方式回顯,如果它們不同則會打印一條消息,如果不相同則會保持沉默。 – eresonance
爲什麼你不能得到兩個文件內容的散列?
試試這個腳本,調用它例如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
抱歉不知道你指的是什麼,我沒有把腳本編寫太久。 – JDS
如果兩個文件相同,那麼它們將具有相同的散列值。例如,如果'file1.txt'的內容是'aaa'和'file2.txt',那麼當你得到md5 hash:md5 file1.txt時,你會得到:5c9597f3c8245907ea71a89d9d39d08e,它將和md5 file2.txt輸出相同,if你工作了兩個哈希,他們是相同的,你可以保證他們都有相同的內容:) – jabaldonedo
哦,像某種檢查總和。我認爲這是一種可能性;有沒有一個簡單的UNIX命令呢? – JDS
對於不相同的文件,任何方法都需要完全讀取兩個文件,即使讀取過去也是如此。
沒有其他選擇。因此,在某個時間點創建哈希或校驗和需要閱讀整個文件。大文件需要時間。
文件元數據檢索比讀取大文件要快得多。
那麼,有什麼文件元數據可以用來確定文件是不同的嗎? 文件大小?或甚至只讀取文件的一小部分的文件命令的結果?
文件大小示例代碼片段:
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'
如果文件是相同的大小,然後你被卡住完整的文件讀取。
如果用戶名或組名有空白,可以使用'ls -n'來避免問題。 – tricasse
我喜歡@Alex Howansky爲此使用了'cmp --silent'。但我需要正反兩方面的迴應,所以我使用:
cmp --silent file1 file2 && echo '### SUCCESS: Files Are Identical! ###' || echo '### WARNING: Files Are Different! ###'
然後我就可以在終端或用SSH運行此檢查的文件對一個恆定的文件。
如果您的'echo success'命令(或其他您放置在其位置的命令)失敗,則會運行您的「否定響應」命令。你應該使用「if-then-else-fi」結構。例如,像[這個簡單的例子](http://stackoverflow.com/a/16034851/5419599)。 – Wildcard
替換請在腳本中輸入''' –
嘗試也使用校驗和命令:
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'。
這是我的第一個想法,然而,如果你必須多次比較相同的文件,哈希值纔有意義,因爲哈希值只計算一次,如果只比較一次,那麼'md5'無論如何都會讀取整個文件,所以'cmp',在第一個區別時停下來,會更快。 –
這真的很挑剔,但你並沒有要求看看兩個文件是否相同,你問的是兩個文件是否有相同的內容。相同的文件具有相同的inode(和相同的設備)。 – Zano