信頼性の低いメディア(フラッシュ)を使用して大量のデータを保存することがあります。少なくともビットフリップを認識するために、md5sumsと一緒にファイルを保存します。このファイルは通常、find -type f -exec "{}" \; >MD5SUM
のバリエーションによって作成されます。後でさらにいくつかのファイルをコピーし、古いファイルを再計算せずに新しいファイルのチェックサムを追加したいと思います。残念ながら、私が使用している一部のマシンの時間はねじ込まれているため、find -newer <file> -exec md5sum "{}"\; >>MD5SUM
を使用することはできません。基本的には、find -type f
で作成したファイルリストとMD5SUMファイルのリストの違いを知りたいと思います。
簡単でエレガントな方法でこれを行う方法はありますか?前もって感謝します!
これが進行中のプロセスになる場合は、古いファイルと新しいファイルの2つのファイルが必要になります(次回は古いファイルになります)。
#!/bin/sh
# change directory to either first argument or to current directory
cd ${1:-"."} || exit 1 # if cannot cd, then exit
# get the md5 values for all the files in the directory tree
find . -type f -not -name .md5sum.last -exec md5sum {} \; | sort > .md5sum.tmp
# if called before, then get only the differences in the newer
if [ -f .md5sum.last ]; then
comm -13 .md5sum.last .md5sum.tmp
else # otherwise show all the output
cat .md5sum.tmp
fi
# replace the older with the current for next time
mv .md5sum.tmp .md5sum.last
sort
およびcomm -13
が鍵です。並べ替えは明らかですが、comm
( "common"の略)は、最初のファイル(列1)、2番目のファイル(列2)、またはその両方(列3)にある行を表示します。 -13
オプションは、「列1と3を削除する」ことを示し、古い行だけではなく、両方に共通ではない行のみを残します。残念ながら、ファイルのタイムスタンプを信頼できない場合、これは大きなディレクトリツリーにとって非常に集中的なプロセスになります。
最も簡単な方法は、ファイルのチェックサムを保存することだと思います_my_file_
ファイル内_my_file_.md5
すべてのチェックサムを単一のファイルに保存することは避けてください。このように、チェックサムが以前にコンピュータであったかどうかを知ることははるかに簡単です。
ただし、フラッシュドライブにファイルを追加するだけの場合(変更しない、削除する可能性がありますが、以前に存在したファイルを追加しない)、次のことができます。
find _your_drive_path_ -type f |
while read file; do
grep -q $file _your_md5_file_ || md5sum $file >> _your_md5_file_
done
これはチェックサムファイルを何度もgrep
し、ファイルリストを並べ替え、チェックサムファイルをファイル名で並べ替えたままにすることで最適化できますが、この最適化が必要ない場合は、なぜその複雑さに悩まされるのでしょうか...
タイムスタンプを信頼できない場合は、変更されたファイルのみを処理する方法は実際にはありません。元のfind
コマンドを繰り返すだけです。
新しいMD5SUM
ファイルを一時的な場所に保存し、次にdiff
古いファイルと新しいファイルを保存して、更新されたファイルをフラッシュにコピーする前に何が変更されたかを確認します。有用な差分を取得するために、ファイルをソートする必要がある場合があります。