2012-02-14 35 views
1

我必須將80個同一文件副本的md5sum相互比較,並報告不匹配的失敗。我如何在bash中有效地做到這一點?我正在尋找一個優雅的算法來做到這一點。如何在bash中對80個md5sums進行比較

+1

那麼所有這些文件應該是相同的,你試圖找到那些不是? – 2012-02-14 21:17:27

回答

0
md5sum FILES > MD5SUMS.md5 
cut -c1-32 < MD5SUMS.md5 | sort | uniq -c | sort -n 

將返回這樣的事情:

1 485fd876eef8e941fcd6fc19643e5e59 
    1 585fd876eef8e941fcd6fc19643e5e59 
    5 385fd876eef8e941fcd6fc19643e5e59 

閱讀:5 fi les具有相同的校驗和,另外兩個具有「個體」校驗和。我認爲,大多數是正確的,所以額外的

| tail -1 | cut -c 9- 

返回最後一行的校驗和。現在過濾其他所有內容(並將這些部分放在一起):

md5sum FILES > MD5SUMS.md5 
grep -v "$(cut -c1-32 < MD5SUMS.md5 | sort | uniq -c | sort -n | tail -1 | cut -c 9-)" MD5SUMS.md5 | cut -c35- 

這將打印非多數文件的文件名。

3
md5sum FILES | sed 's/ .*$//' | sort -u 

如果您獲得多行輸出,則表示不匹配。

(這不會告訴你的錯配。)

將其組合在一起,並用少了幾分簡潔awk命令替換sed命令:

count=$(md5sum "[email protected]" | awk '{print $1}' | sort -u | wc -l) 
if [ $count -eq 1 ] ; then 
    echo "Everything matches" 
else 
    echo "Nope" 
fi 
+0

'sed's /。* $ //''不像'cut -d''-f1'那麼隱寫,而是+1。 – 2012-02-14 21:20:05

+0

或者更不明顯:'awk'{print $ 1}'' – 2012-02-14 21:27:43

+0

我正在研究一個更大的解決方案,它將識別具有不同總和的文件,但它可能不值得在您的一個班輪上進行大量的額外工作。除此之外,你總是可以使用「md5sum FILES | grep BADSUM」來查找文件,然後用壞的數字 – 2012-02-14 21:29:30

0

的輸出:

md5sum $files | sort -k 1,2 

是有序的校驗和列表,之後相應的文件名。如果你需要眼球的結果,這可能就足夠了。如果您需要識別奇數球的結果,您必須決定演示文稿。你說你有80份「同一份文件」。假設實際上有8個版本的「文件」每個都有10個副本。你如何決定哪個是正確的,哪個是假的?如果你有41個哈希和39個哈希,你會發現39個是錯的,41個是正確的?顯然,它可能會佔主導地位,但你必須擔心那些討厭的邊界條件。

你也可以做票友的東西,如:

md5sum $files | sort -k 1,2 > sorted.md5 
sed 's/ .*//' sorted.md5 | uniq -c | sed 's/^ *\([0-9][0-9]*\) \(.*\)/\2 \1/' > counted.md5 
join -j 1 -o 1.1,2.2,1.2 sorted.md5 counted.md5 

這給你,包括MD5校驗,重複計數和文件名的輸出。如果您願意,可以用awk '{print $1}'代替第一個sed腳本。第二個將被替換爲awk '{printf "%s %s\n", $2, $1}',這可能更清晰(並且是更短的)。之所以這樣做是爲了擺脫uniq -c輸出中的領先空間,這些空間混淆了join

md5sum $files | sort -k 1,2 > sorted.md5 
awk '{print $1}' sorted.md5 | uniq -c | awk '{printf "%s %s\n", $2, $1}' > counted.md5 
join -j 1 -o 1.1,2.2,1.2 sorted.md5 counted.md5 

我創造了一些文件x1.h,x2.h和x3.h通過複製dbatools.h,並設置files=$(ls *.h)。輸出是:

0763af91756ef24f3d8f61131eb8f8f2 1 dblbac.h 
10215826449a3e0f967a4c436923cffa 1 dbatool.h 
37f48869409c2b0554d83bd86034c9bf 4 dbatools.h 
37f48869409c2b0554d83bd86034c9bf 4 x1.h 
37f48869409c2b0554d83bd86034c9bf 4 x2.h 
37f48869409c2b0554d83bd86034c9bf 4 x3.h 
5a48695c6b8673373d30f779ccd3a3c2 1 dbxglob.h 
7b22f7e2373422864841ae880aad056d 1 dbstringlist.h 
a5b8b19715f99c7998c4519cd67f0230 1 dbimglob.h 
f9ef785a2340c7903b8e1ae4386df211 1 dbmach11.h 

這可以進一步加工成所需的(例如,與sort -k2,3nr得到的遞減順序計數的,所以異常文件最後出現)。您將重複文件的名稱連同一個計數告訴您每個重複有多少個。你接下來做什麼取決於你。

一個真實的生產腳本當然會使用臨時文件名而不是硬編碼的名字,並且會在其自身之後進行清理。