時には、大量のデータを保存するために信頼できないメディア(フラッシュ)を使用することがあります。少なくともビットフリップを識別するために、md5sumをファイルと共に保存します。ファイルは通常find -type f -exec "{}" \; >MD5SUM
。残念ながら、私が使用したいくつかのマシンの時間が混乱していたので、それを使用することはfind -newer <file> -exec md5sum "{}"\; >>MD5SUM
オプションではありません。基本的に、MD5SUMファイルで作成されたファイルのリストとMD5SUMファイルのリストのfind -type f
違いを理解したいと思います。
シンプルでエレガントな方法でこれを行う方法についてのアイデアはありますか?よろしくお願いします!
答え1
このプロセスが続行される場合は、古いファイルと新しいファイル(次回は古いファイルになる)の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
(「共通」の略)、最初のファイル(列1)、2番目のファイル(列2)、または2つのファイル(列3)の行を表示します。この-13
オプションは「最初と3番目の列の削除」を意味し、前の列に属さず、両方の列に共通しない行のみを残します。残念ながら、ファイルのタイムスタンプを信頼できない場合、これは大規模なディレクトリツリーにとって非常に集約的なプロセスになります。
答え2
_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
複数のチェックサムファイルであり、ファイルリストを並べ替え、チェックサムファイルをファイル名で並べ替えることで最適化できますが、これらの最適化が不要な場合は複雑さを心配する理由はありません。
答え3
タイムスタンプを信頼できない場合は、変更されたファイルのみを処理する方法はありません。元のfind
コマンドを繰り返すだけです。
MD5SUM
新しいファイルを一時的な場所に保存し、更新されたファイルをdiff
フラッシュにコピーする前に、以前のファイルと新しいファイルを保存して変更を確認しました。有用な違いを得るには、ファイルをソートする必要があるかもしれません。