私は持っています:
checksum.txt
マウント後に接続が切断され、不完全なままの大規模ディレクトリのマウントポイントにある単一ファイルの複数行チェックサムを含むファイル(checksum.txt
部分チェックサム)localchecksums.txt
数千行のSHA256チェックサム、ファイル名などを含む完全なチェックサムリスト
私の考えでは:
- リモートインストールチェックサムをローカルチェックサム
sha256sum -c checksum.txt localchecksum.txt
または同様のものと比較します。ただし、次のようにしてください。
- 残りのハッシュを取得するために再びギガバイトのデータを処理したくありません。
- プロセス全体を再起動したくありません。
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
原則として、
sort
チェックサムを含むファイル名のリストfind
sort
ファイル名の完全なリストcomm
まだ処理されていないファイルセットを取得するために使用されます(あるグループのファイルは別のグループにはありません).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