ファイルが存在するか確認する

ファイルが存在するか確認する

数千 (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

これを行う。

  • 「to-check」フォルダ内の各画像の md5 サムを計算し、テキスト ファイルに書き込みます。

  • 「to-search」フォルダ内の各画像の md5 サムを計算し、最初のファイルに追加します。

  • この巨大なファイルを新しいファイルに分類します。

  • uniq -c各行が重複している回数をカウントするには、次のようなものを使用します。

コマンドを正しく理解していれば (正しくない可能性もあります)、現時点ではmd5sum合計 X * Y 回実行されていると思いますが、上記では X + Y 回に短縮されます。

答え2

mtree同じ/異なるタイムスタンプや同じ/異なる MD5/SHA256 ハッシュを探して 2 つのファイル階層を比較する必要があるときに便利なユーティリティです。

簡単なテスト階層を設定しましょう:

$ 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/checkimage-001には から までのファイルがあり-010、 にはから までのファイルfolder/to/searchがあります。すべてのファイルは同一 (長さ 0 バイト) ですが、タイムスタンプが異なります。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.jpgfolder/to/searchfolder/to/checkmissingimage-001.jpgfolder/to/checkfolder/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 ハッシュが対応するファイルと異なる場合は、そのファイルが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ハッシュを計算することになります一度サイズで区別できないファイルにのみ適用されます。

もちろん、これは既存のファイル間または新しいファイル間に重複がないことを前提としています (ただし、これを確認するために簡単に調整することもできます)。

関連情報