web-dev-qa-db-ja.com

ハッシュでファイルを探す

あるディレクトリ(d1)にファイルx1があり、同じファイルが別のディレクトリ(d2)にすでにコピーされている(x2)かどうかはわかりません(ただし、アプリケーションによって自動的に名前が変更されます)。

ディレクトリd1のファイルx1のハッシュがディレクトリd2に存在するファイルx2のハッシュと等しいかどうかを確認できますか?

3
xralf

これは良いアプローチですが、適切なサイズのファイルのハッシュのみを計算すると、検索がはるかに高速になります。 GNU/BusyBoxユーティリティの使用:

wanted_size=$(stat -c %s d1/x1)
wanted_hash=$(sha256sum <d1/x1)
find d2 -type f -size "${wanted_size}c" -execdir sh -c 'test "$(sha256sum <"$0")" = "$1"' {} "$wanted_hash" \; -print

ディレクトリ内の既知のMD5ダイジェストを含むファイルを検索するには(bashまたはksh93を使用):

x1digest="$( md5sum d1/x1 | cut -d ' ' -f 1 )"

for x2 in d2/*; do
    if [[ ! -f "$fpath" ]]; then
      continue
    fi

    x2digest="$( md5sum "$fpath" | cut -d ' ' -f 1 )"

    if [[ "$x2digest" == "$x1digest" ]]; then
      printf '"%s" has the same hash as d1/x1\n' "$fpath"
    fi
done

BSDシステムでは、md5sum filename | cut -d ' ' -f 1md5 -q filenameに置き換えることができます。

1
Kusalananda