
我有一個包含數千個(70G)圖像的資料夾folder/to/check/
,對於每個文件,我想要檢查它是否已經存在於另一個包含數千個圖像(414G folder/to/search/
)的目錄中。
這是我想出的腳本,但它需要很長時間才能運行,所以我認為該任務可以優化。
find folder/to/check/ -type f -exec md5sum {} + | awk -F" " '{ print $1,$2 }' | while read -r p1 p2; do find folder/to/search/ -type f -exec md5sum {} + | grep "^$p1" && echo "Found: $p1 $p2" || echo "Not found: $p1 $p2"; done > out.txt
有誰知道如何或可以為我指出如何優化腳本的正確方向?我的技能很基礎。
答案1
做這個。
計算「待檢查」資料夾中每個圖像的 md5 和,並將其寫入文字檔案。
計算「to-search」資料夾中每個影像的 md5 和,附加到第一個檔案。
將這個巨大的文件排序為一個新文件。
使用類似的方法
uniq -c
來計算每行重複的次數。
如果我的命令正確(我可能不會),我認為現在您md5sum
總共執行了 X * Y 次,但是通過上述操作,這減少到了 X + Y 次。
答案2
mtree
每當您需要比較兩個檔案層次結構以查找相同/不同的時間戳記或相同/不同的 MD5/SHA256 雜湊值時,這是一個方便的實用程式。
讓我們設定一個簡單的測試層次結構:
$ mkdir -p folder/to/check
$ mkdir -p folder/to/search
$ for N in $(jot -w %03d 10); do touch `/image-$N.jpg; done
$ for N in $(jot -w %03d 10 2); do touch folder/to/search/image-$N.jpg; done
folder/to/check
有文件image-001
通過-010
,而folder/to/search
有image-002
通過-011
。所有檔案都是相同的(零位元組長),但具有不同的時間戳記。
如果你僅有的想要檢查 MD5 雜湊值(以及每個檔案是否存在),那麼:
$ mtree -kmd5 -cp folder/to/check | mtree -p folder/to/search
extra: image-011.jpg
./image-001.jpg missing
該extra
行表示它image-011.jpg
存在於folder/to/search
但不是必需的(因為它不在folder/to/check
)中,並且該missing
行表示它image-001.jpg
在來源資料夾 ( ) 中找到folder/to/check
,但不在目標資料夾 ( folder/to/search
) 中找到。
如果除了 MD5 雜湊值之外還想檢查時間戳,那麼:
$ mtree -Kmd5 -cp folder/to/check | mtree -p folder/to/search
.: modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-010.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-008.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-006.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
extra: image-011.jpg
image-007.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-009.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-004.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-003.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-002.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-005.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
./image-001.jpg missing
此輸出仍然顯示相同的extra
和missing
行,以及許多 MD5 雜湊值相同但具有不同時間戳記的檔案。最後,如果任何檔案的 MD5 雜湊值與其對應檔案的 MD5 雜湊值不同,mtree
則會告訴您是哪些檔案:
$ date > folder/to/search/image-007.jpg
$ mtree -Kmd5 -cp folder/to/check | mtree -p folder/to/search
.: modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-010.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-008.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-006.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
extra: image-011.jpg
image-007.jpg:
size (0, 29)
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:25:05 2019)
md5digest (0xd41d8cd98f00b204e9800998ecf8427e, 0x6fd624d18a8fe0c096b19ff858a2acf7)
image-009.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-004.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-003.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-002.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-005.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
./image-001.jpg missing
答案3
有一些實用程式可以執行此操作,但如果您想自己執行:
- 取得所有檔案的大小(以位元組為單位),並列出所有大小完全相同的檔案。
- 對於包含多個元素的清單(不是很多,尤其是在大檔案中):
- 計算清單中所有元素的 MD5
- 檢查重複項
本質上,這讓您計算 MD5 哈希值一次並且僅適用於無法區分大小的檔案。
當然,這假設現有文件或新文件之間沒有重複項(但也可以輕鬆進行調整以檢查這一點)。