web-dev-qa-db-ja.com

md5sumのリストを簡単に更新するにはどうすればよいですか?

信頼性の低いメディア(フラッシュ)を使用して大量のデータを保存することがあります。少なくともビットフリップを認識するために、md5sumsと一緒にファイルを保存します。このファイルは通常、find -type f -exec "{}" \; >MD5SUMのバリエーションによって作成されます。後でさらにいくつかのファイルをコピーし、古いファイルを再計算せずに新しいファイルのチェックサムを追加したいと思います。残念ながら、私が使用している一部のマシンの時間はねじ込まれているため、find -newer <file> -exec md5sum "{}"\; >>MD5SUMを使用することはできません。基本的には、find -type fで作成したファイルリストとMD5SUMファイルのリストの違いを知りたいと思います。

簡単でエレガントな方法でこれを行う方法はありますか?前もって感謝します!

3
antje-m

これが進行中のプロセスになる場合は、古いファイルと新しいファイルの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を削除する」ことを示し、古い行だけではなく、両方に共通ではない行のみを残します。残念ながら、ファイルのタイムスタンプを信頼できない場合、これは大きなディレクトリツリーにとって非常に集中的なプロセスになります。

2
Arcege

最も簡単な方法は、ファイルのチェックサムを保存することだと思います_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し、ファイルリストを並べ替え、チェックサムファイルをファイル名で並べ替えたままにすることで最適化できますが、この最適化が必要ない場合は、なぜその複雑さに悩まされるのでしょうか...

2
jfg956

タイムスタンプを信頼できない場合は、変更されたファイルのみを処理する方法は実際にはありません。元のfindコマンドを繰り返すだけです。

新しいMD5SUMファイルを一時的な場所に保存し、次にdiff古いファイルと新しいファイルを保存して、更新されたファイルをフラッシュにコピーする前に何が変更されたかを確認します。有用な差分を取得するために、ファイルをソートする必要がある場合があります。

0
cjm