檢查文件是否存在

檢查文件是否存在

我有一個包含數千個(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/searchimage-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

此輸出仍然顯示相同的extramissing行,以及許多 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 哈希值一次並且僅適用於無法區分大小的檔案。

當然,這假設現有文件或新文件之間沒有重複項(但也可以輕鬆進行調整以檢查這一點)。

相關內容