ディレクトリ内のすべてのファイルのmd5チェックサムを生成します


75

ディレクトリ内のすべてのファイルのmd5チェックサムリストを作成したいと思います。

したいcat filename | md5sum > ouptput.txt。ディレクトリ内のすべてのファイルに対して、1ステップでこれを実行したいです。

どんな援助も素晴らしいでしょう。


特定のバックアップファイルのmd5sum(チェックサム)を見つけるにはどうすればよいですか?-私のスクリプトはどのように見えますか

回答:


110

md5sum複数のファイル名またはbash拡張を渡すことができます。

$ md5sum * > checklist.chk  # generates a list of checksums for any file that matches *
$ md5sum -c checklist.chk   # runs through the list to check them
cron: OK
database.sqlite3: OK
fabfile.py: OK
fabfile.pyc: OK
manage.py: OK
nginx.conf: OK
uwsgi.ini: OK

凝ったものにしたい場合はfind、ファイルをドリルダウンしてフィルターするなど、再帰的に作業するなどの方法を使用できます。

find -type f -exec md5sum "{}" + > checklist.chk

1
♦取得するため、上記の使用方法をmd5sumサブディレクトリ内のファイルを、上記md5sum *...と言って、サブディレクトリレベルに入る放射ディレクトリがある
Kasun Siyambalapitiya

実行find -type f -exec md5sum '{}' +して「find -type f -exec md5sum '{}'」で問い合わせてすみませんが、それを取得できました。ありがとう:)
カスン・シヤンバラピティヤ

この出力の外観をより好む:openssl md5 * > checklist.txt
アシュリー

1
あなたが評価することが幸せだシェル使用している場合**(例えばzshのような)を再帰的に、それも簡単です:md5sum **/* 2>/dev/null
ヨースト

12

すばらしいチェックサム作成/検証プログラムはrhashです。SFV互換ファイルも作成し、それらもチェックします。

md4、md5、sha1、sha512、crc32、その他多くの多くをサポートしています。

さらに、md5deepやsha1deepなどの再帰的な作成(-rオプション)を実行できます。

最後に、チェックサムファイルの出力をフォーマットできます。例えば:

rhash --md5 -p '%h,%p\n' -r /home/

/homeディレクトリから再帰的にファイルのフルパスを含むCSVファイルを出力します。

-eオプションを使用しても、crc32 sumをnameに挿入することでファイルの名前を変更できます。

PhoenixNL72の例では、「md5sum」を「rhash」に変更できます。


1
ここで '/ home /'は正確に何をしますか?このツールはかなり良いようです。
アンディアイバニーズ

それは間違いだと思います。間違いなく私にとっては間違いです。-pは出力の形式です。訂正します。
pbhj

7

次に、さらに2つの例を示します。

  1. まだ存在しない各ディレクトリに、絶対パスでmd5ファイルを作成します。

    find "$PWD" -type d | sort | while read dir; do [ ! -f "${dir}"/@md5Sum.md5 ] && echo "Processing " "${dir}" || echo "Skipped " "${dir}" " @md5Sum.md5 already present" ; [ ! -f "${dir}"/@md5Sum.md5 ] &&  md5sum "${dir}"/* > "${dir}"/@md5Sum.md5 ; chmod a=r "${dir}"/@md5Sum.md5;done 
    
  2. まだ1つも存在しない各フォルダーにmd5ファイルを作成します:パスなし、ファイル名のみ:

    find "$PWD" -type d | sort | while read dir; do cd "${dir}"; [ ! -f @md5Sum.md5 ] && echo "Processing " "${dir}" || echo "Skipped " "${dir}" " @md5Sum.md5 allready present" ; [ ! -f @md5Sum.md5 ] &&  md5sum * > @md5Sum.md5 ; chmod a=r "${dir}"/@md5Sum.md5 ;done 
    

1と2で異なるのは、結果のmd5ファイルでのファイルの表示方法です。

コマンドは次のことを行います。

  1. 現在のフォルダーのディレクトリ名のリストを作成します。(木)
  2. フォルダーリストを並べ替えます。
  3. ファイル@ md5sum.md5が存在する場合は、各ディレクトリをチェックインします。存在する場合は出力をスキップし、存在しない場合は出力を処理します。
  4. @ md5Sum.md5ファイルが存在しない場合、md5Sumは、フォルダー内のすべてのファイルのチェックサムを含むファイルを生成します。5)生成された@ md5Sum.md5ファイルを読み取り専用に設定します。

このスクリプト全体の出力は、ファイル(.....; done> test.log)にリダイレクトするか、別のプログラム(grepなど)にパイプで送ることができます。出力は、スキップされたディレクトリと処理されたディレクトリのみを示します。

正常に実行されると、現在のディレクトリの各サブディレクトリに@ md5Sum.md5ファイルが作成されます。

ファイルに@ md5Sum.md5という名前を付けたため、samba共有のディレクトリの最上部にリストされます。

すべての@ md5Sum.md5ファイルを確認するには、次のコマンドを実行します。

find "$PWD" -name @md5Sum.md5 | sort | while read file; do cd "${file%/*}"; md5sum -c @md5Sum.md5; done > checklog.txt

その後、grep -v OKを使用してchecklog.txtをgrepし、異なるすべてのファイルのリストを取得できます。

特定のディレクトリで@ md5Sum.md5を再生成するには、たとえばファイルを変更または追加したときに、@ md5Sum.md5ファイルを削除するか、名前を変更して再度generateコマンドを実行します。


フルパスを使用するコマンド#1:md5sum "$ {dir}" / *は、ドットで始まる隠しファイルを選択しません。救済策はありますか?
user14654 14

パーティーに遅れましたが、md5sumはファイル名を必要とするため(ディレクトリを指定するとuhappyのようです)、findに問い合わせるのが最も簡単かもしれません。$ md5sum $(find "$ dir" -maxdepth 0 -type f) type f "は通常のファイルと.hiddenファイルをプルします(また、findには多くのオプションがありますが、非常に役立ちます)。すべてを再帰的に使用する場合は、「-maxdepth 0」の部分を省略します。注:ファイル名にスペースが埋め込まれている場合、これは脆弱です
。xargs

0

私はこの問題にぶつかり、上記の解決策はエレガントですが、この状況に迅速で汚いハックが必要でした。つまり、1つのディレクトリとその1レベル下のサブディレクトリです。

そのため、シェルにディレクトリを入力して実行します:

md5sum * */* 2>/dev/null > md5sum.md5

これにより、最上位ディレクトリのすべてのファイルが取得され、サブディレクトリがディレクトリであるというエラー警告が削除され、サブディレクトリの内容に対してmd5sumsが実行されます。利点:覚えやすく、本来の動作を正確に実行します。私は常にfind構文に戸惑い、頭の外では決して覚えられないため、ディレクトリ名のスペースを処理するなどループする必要はありません。このライナーはうまく機能しました。堅牢で強力なソリューションではなく、1レベル以上のサブディレクトリには適していませんが、問題をすばやく簡単に修正できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.