我必須將80個同一文件副本的md5sum相互比較,並報告不匹配的失敗。我如何在bash中有效地做到這一點?我正在尋找一個優雅的算法來做到這一點。如何在bash中對80個md5sums進行比較
回答
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-
這將打印非多數文件的文件名。
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
'sed's /。* $ //''不像'cut -d''-f1'那麼隱寫,而是+1。 – 2012-02-14 21:20:05
或者更不明顯:'awk'{print $ 1}'' – 2012-02-14 21:27:43
我正在研究一個更大的解決方案,它將識別具有不同總和的文件,但它可能不值得在您的一個班輪上進行大量的額外工作。除此之外,你總是可以使用「md5sum FILES | grep BADSUM」來查找文件,然後用壞的數字 – 2012-02-14 21:29:30
的輸出:
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
得到的遞減順序計數的,所以異常文件最後出現)。您將重複文件的名稱連同一個計數告訴您每個重複有多少個。你接下來做什麼取決於你。
一個真實的生產腳本當然會使用臨時文件名而不是硬編碼的名字,並且會在其自身之後進行清理。
- 1. 比較Linux中多個文件的文件名和md5sums
- 2. 如何在git中進行此比較?
- 3. curdate()如何在MySQL中進行比較
- 4. 如何在Bash中比較字符串
- 5. 如何在R中進行特定的配對比較
- 6. 如何在c中將對象與null進行比較#
- 7. 如何在SQL Server中對日期表進行比較?
- 8. 在Java中比較兩個日期,不進行比較
- 9. 在bash中比較日期
- 10. 比較在bash中的PID
- 11. 在另一個比較中使用bash比較的結果
- 12. 如何在python中映射2個列表並進行比較
- 13. 如何比較bash中的兩件事?
- 14. 在命令行中進行比較
- 15. 如何與Riot中的json對象進行比較?
- 16. 如何將Java中的文檔對象與XERCES進行比較?
- 17. 如何在特定目錄上對git進行比較
- 18. Bash比較
- 19. 比較兩個bash變量
- 20. bash比較兩個tar.gz
- 21. 如何在Python中進行安全的二進制比較?
- 22. 如何將對象與NHibernate代理對象進行比較?
- 23. 如何按月對銷售額進行彙總並對它們進行比較
- 24. 與bash中的變量進行浮點比較
- 25. 比較對象幷包含未在輸出中進行比較的屬性
- 26. 使用Enthought進行比較和對比並安裝單個庫
- 27. 在矩陣中進行不對稱配對比較
- 28. TF同時對一整套文件進行比較,而不是一次對一個文件進行比較
- 29. 如何將數組的值與bash腳本中的變量進行比較?
- 30. DATEADD - 我如何進行比較
那麼所有這些文件應該是相同的,你試圖找到那些不是? – 2012-02-14 21:17:27