指定されたファイルからディレクトリツリーチェックサムを続行する

指定されたファイルからディレクトリツリーチェックサムを続行する

私は持っています:

  • checksum.txtマウント後に接続が切断され、不完全なままの大規模ディレクトリのマウントポイントにある単一ファイルの複数行チェックサムを含むファイル(checksum.txt部分チェックサム)
  • localchecksums.txt数千行のSHA256チェックサム、ファイル名などを含む完全なチェックサムリスト

私の考えでは:

  • リモートインストールチェックサムをローカルチェックサムsha256sum -c checksum.txt localchecksum.txtまたは同様のものと比較します。ただし、次のようにしてください。
  1. 残りのハッシュを取得するために再びギガバイトのデータを処理したくありません。
  2. プロセス全体を再起動したくありません。checksum.txt

find再帰を使用して単一のファイルを見つけてsha256sum実行することによってリストを生成します。

残りのハッシュは、2つのファイルを比較することによって取得するか、ファイルをchecksum.txt読み取り、未確認ファイルのチェックサムのみを計算することによってチェックサムをチェックし続けることができます。最初のアプローチの問題は、ファイルの順序が異なることです。 2番目の方法は良いと思いますが、どのように始めるべきかわかりません。

チェックサムファイルの例:

8e2931cc1ad3adc07df115456b36b0dbd6f80f675e0a9813e20ad732ae5d4515  ./folder/8ggSHp5I7hNEl3vDCbWv6Q/wA-KzXIh1Ce3G93s20X24v_4vUeywBe3mXPhGjPt_Lg/cRf8KgbqIsqwbon3DX3PN1-oV6_Nr9Baeymaw-ZJw00
37d2dfe2315cc401536329e3fbe421384bbb50c656c3dbeb42798e5666822e6c  ./folder/8ggSHp7I7hHEl3vDCbWv6Q/wA-KzXIh1Ce3G93s2oX24v_4vUeywBe3mXPhGjPt_Lg/V02s6HKhyJ9Nyd2jQtSjWg
d0e9b95065a264db0d372ccace5d3a72f38f74ca7b44da4794dae23c91e18e57  ./folder/8ggSHp7I7hNxl3vDCbWv6Q/wA-KzXIh1Ce3G93s2oX24v_4vUeywBe3mXPhGjPt_Lg/U3fhBugX6pexYzh6qGKlW7lYWsFShWH7JwN9fmU8ay2lLZkciH2sXsiGbmIc97iJ
44a5fe29063e472857bb9a1929af06a32bb4b2394630f80c2dc732fd662620bc  ./folder/8ggSHp7I7hNEc3vDCbWv6Q/wA-KzXIh1Ce3G93s2oX24v_4vUeywBe3mXPhGjPt_Lg/gTrqUL4ZjWTWMl6BcjfwUe5bBDatscwUoYY9IFQDztc

答え1

原則として、

  1. sortチェックサムを含むファイル名のリスト
  2. findsortファイル名の完全なリスト
  3. commまだ処理されていないファイルセットを取得するために使用されます(あるグループのファイルは別のグループにはありません).
  4. sha256sum結果リストのファイルのチェックサムの生成

デモ(bashないsh):

based=/etc                      # Directory base
csums=/tmp/etc_checksums.txt    # Checksums file

# EXAMPLE ONLY
# TAKE CARE NOT TO OVERWRITE YOUR REAL DATAFILE WHILE TESTING !!
# Generate a partial set of 30 checksums
find "$based" -type f |
    head -n30 |
    while IFS= read -r f; do sha256sum "$f"; done >"$csums"


# USEFUL WORK
# Identify the set of differences
LC_ALL=C comm -13 <(sed 's/^[^ ]*  //' "$csums" | LC_ALL=C sort) <(find "$based" -type f | LC_ALL=C sort) |
    # For each missing item
    while IFS= read -r f
    do
        # Generate a new checksum and append it to the checksums file
        printf '%s' "$f" >&2
        sha256sum -- "$f" >>"$csums" && echo >&2
    done

このコードは、スペースを含むファイル名には機能しますが、改行やその他の印刷できない文字を含む病理学的なファイル名には機能しません。 (本当に必要に応じて他の人がコードを防弾する方法を提案できることは間違いありません。)

元のチェックサムファイルを変更する前に慎重にテストしてください。重複した項目が正しくフィルタリングされる$basedように、元の開始点と一致していることを確認してください。comm

関連情報