フォルダにMD5(または同様の)はありますか?2つのフォルダーが等しいかどうかを確認するにはどうすればよいですか?


10

md5sumアーカイブに圧縮せずに、フォルダーの(または同様の計算)を見つけたいのですが。

たとえば、フォルダ内にあればMyFolder、私たちは、ファイルを持っている1.txt2.txtそして3.txt、含みます:


1.txt

1.txtへのテキスト

2.txt

2.txtへのテキスト

3.txt

3.txtへのテキスト


md5sumこの全体のをどのように計算できMyFolderますか?方法はありますか?これを使用して、2つのフォルダの内容が同じかどうかを確認します。

これは、2つのCDまたはフォルダが等しいかどうかを確認するために使用できます。簡単な方法でお願いします。

回答:


15

md5deepのツールは、まさにこの目的のために開発されました。多くのLinuxディストリビューションでは、パッケージ形式で提供しています。


1
どうも!それは私にはうまくいきました。これを好きになる同じ問題を持つ他のユーザーへ: sudo apt-get install md5deep md5deep -rel /path/to/your/directory/ > directory_hash.md5 md5deep -X directory_hash.md5 -r /path/to/your/second/direcotory Thxたくさん。
GarouDan、2011年

@GarouDan。表示したコマンドはシンボリックリンクをたどります。この-oオプションを使用して、ファイルタイプを処理できます。
Peter.O、2011年

ああthx ...それを知らない...本当に役立つ。覚えておきます!
GarouDan、2011年

4

アーカイブしたくない場合は、次のようにすることができます

diff <(find folder1) <(find folder2)

findより正確になるようにコマンドを調整する必要がある場合があります。

編集-execファイルの内容を比較 するために、検索呼び出しに追加できます。これに似たもの:

diff <(find folder1 -type f -exec md5sum {} \; | sort) <(find folder2 -type f -exec md5sum {} \; | sort)

これを採用することをお勧めします。


それは興味深い点です。これは、各フォルダーのすべてのファイルをリストします...しかし、本当に大量のアーカイブがある場合...各フォルダーに同じファイル(データ付き-おそらくmd5sumツールを使用)があることをどのように確認できますか?
GarouDan、2011年

1
次に、各ファイルのMD5SUM出力のdiffを実行します。find、md5sum、diffコマンドを別の方法でつなぎ合わせる必要があるだけです。
sybreon、2011年

あなたのアイディアについてもThx、cya ...私はこれらのfindコマンドを使って面白いことを試します...ありがとう。
GarouDan、2011年

3

テストする1つの方法は、フォルダーとそのサブフォルダー内のすべてのファイルの連結に基づいてmd5sumを生成することです。これには、ファイルが同じ名前である必要があることも覚えておいてください(それらは同じソート順でなければなりません)。次のコードが機能するはずです。

#!/bin/bash

shopt -s nullglob
shopt -s globstar || { printf '%s\n' 'Bash 4 is required for globstar.' ; exit 1 ; }
(( $# == 2 )) || { printf '%s\n' "Usage: ${0##*/} olddir newdir" ; exit 2 ; }

for _file in "$1"/**/*; do [[ -f ${_file} && ! -L ${_file} ]] && _files_in_old_dir+=( "${_file}" ); done
for _file in "$2"/**/*; do [[ -f ${_file} && ! -L ${_file} ]] && _files_in_new_dir+=( "${_file}" ); done

(( ${#_files_in_old_dir[@]} )) || { printf '%s\n' 'No files in old dir.' ; exit 3 ; }
(( ${#_files_in_new_dir[@]} )) || { printf '%s\n' 'No files in new dir.' ; exit 4 ; }

_md5_old_dir=$(cat "${_files_in_old_dir[@]}" | md5sum)
_md5_new_dir=$(cat "${_files_in_new_dir[@]}" | md5sum)

{ [[ ${_md5_old_dir} == "${_md5_new_dir}" ]] && (( ${#_files_in_old_dir[@]} == ${#_files_in_new_dir[@]} )) ; } && printf '%s\n' 'Folders are identical.' || { printf '%s\n' 'Folders are not identical.' ; exit 3 ; }

あなたが本当にファイル名などを気にする場合は、中にあるものを比較するためにループを使用することができます${_files_in_old_dir}し、${_files_in_new_dir}。これはほとんどの場合に機能します(少なくとも、dirとそのサブディレクトリ内のファイル数をチェックします)。


これは素晴らしいスクリプトです... thx @Chris。しかし、問題があります... catを使用すると、サブフォルダーがエラーでクラッシュします...それを解決するアイデアはありますか?ありがとう。
GarouDan、2011年

それは私にとってはうまくいきます。シェルがをサポートしていることを確認してくださいglobstar。エラーは何ですか?
Chris Down、

1
「動作する」(+1)...しかし、bash 4のglobstarはディレクトリのシンボリックリンク従いますが、どちらかのディレクトリにシンボリックリンクが含まれている場合にのみ問題になります。
Peter.O、2011年

@feredグッドコール、テストに追加しました。
クリスダウン

0

元の投稿はかなり古いことに気づきましたが、この情報は、ファイルが正しくコピーされていることを確認するための解決策を探している人にとって、まだ価値があると思います。Rsyncはデータをコピーするための最良の方法である可能性があり、このスレッドで与えられた回答は適切ですが、Linuxの経験がない人のために、より詳細な説明を提供しようと思います。

シナリオ:たくさんのサブディレクトリとファイルを使用して、ディスクから別のディスクにデータをコピーしたところです。すべてのデータが正しくコピーされていることを確認します。

まず、コマンドを発行して、md5deepがインストールされていることを確認しmd5deep -vます。

「コマンドが見つかりません」のようなメッセージが表示された場合は、md5deepをでインストールしてくださいapt-get install md5deep

通常のファイルのみを処理することを想定しています。他のタイプのファイルを扱いたい場合は、md5deepマニュアルの-oフラグを参照してください。(man md5deep

これで準備は完了です。ファイルをから/mnt/orginalにコピーしたと想定し/mnt/backup、使用しているディレクトリをこれらのファイルに置き換えます。

最初にソースディレクトリに変更します。これは、コピーまたはバックアップしたファイルの元のソースです。

cd /mnt/orginal

次に、各ファイルのチェックサムを作成します。

md5deep -rel -o f . >> /tmp/checksums.md5

このコマンドの説明:

-r 再帰モードを有効にします

-e 進行状況インジケーターを表示します

-l 相対ファイルパスを有効にします。

-o f 通常のファイルでのみ機能します(ブロックデバイス、名前付きパイプなどではありません)

. 現在のディレクトリから開始するようにmd5deepに指示します。

>> /tmp/checksums.md5すべての出力をにリダイレクトするようにmd5deepに指示し/tmp/checksums.md5ます。

注意、あなたは、以前のバージョンのコンテンツ上書きしたい場合は/tmp/checksums.md5、使用>していないが>>

io-speedとデータのサイズによっては、このコマンドにかなり時間がかかる場合があることに注意してください。niceやioniceを使ってmd5deepのパフォーマンスを向上させることもできますが、それはこの回答の範囲外です。

チェックサムの作成が完了すると、次のようなエントリを持つファイルが作成されます。

69c0a826b29c8f40b7ca5e56e53d7f83 ./oldconfig-11-09-2013/etc2/apm/event.d/20hdparm 651f3c7f79a14332f9fa7bb368039210 ./oldconfig-11-09-2013/etc2/apm/event.d/anacron 50d89ffb97bb96bb9695bf9595f68f98f98c98f98c98f98f98c98f98f68f97c98f95f81f7f7f7f7fd9f80f64f97f95f68f7f7f7f7f7f7f7f7c7f80f64f8f8f8f64f8f8f8f8f8f8f8f8f8fbfbfbfbfbfb台オートコンベンション69c0a826b29c8f40b7ca5e56e53d7f83 ./oldconfig-11-09-2013/etc2/apm/event.d/20hdparm /etc2/apm/scripts.d/alsa e9b9131660a8013983bc5e19d7d669eb ./oldconfig-11-09-2013/etc2/ld.so.cache

最初の列はmd5チェックサムで、2番目の列はチェックサムが属するファイルへの相対パスです。

チェックサムファイルに存在するファイルの数を確認するには、次のコマンドを発行します。

wc /tmp/checksums.md5 -l

次に、コピーしたデータが正しいことを確認します。

cd /mnt/backup

md5deep -o f -reX /tmp/checksums.md5 . >> /tmp/compare.result

チェックサムを作成したときとの唯一の違いは、-Xで、checksums.md5ファイルのエントリが一致しない場合にファイルの現在のハッシュを表示します。したがって、テストの終わりまでに、/tmp/compare.resultが空の場合、チェックサムが一致するため、すべてのファイルが正しくコピーされていると信頼できます。

ファイルにリストされている/tmp/checksums.md5ファイルのみが正しいチェックサムについてチェックされることに注意してください。/mnt/backupディレクトリに追加のファイルがある場合、md5deepはそれらについて通知しません。

ノート:

  • 出力ファイルを保存するために、必ずしもリダイレクトを使用する必要はありません。詳細については、md5deepのマニュアルを参照してください。

  • 処理しているファイルの権限によっては、md5deepコマンドをrootとして実行する必要がある場合があります。


0

2つのディレクトリの違いを再帰的にチェックしたい場合は/path1、以下/path2 使用しmd5deepます。

diff <(cd /path1 && find . -type f |xargs md5) <(cd /path2 && find . -type f |xargs md5)

説明:

  • 入ったpath1ことにより、印刷されたすべてのラインを作るためfindに相対的でpath1cd /path1
  • 現在のパスにあるすべてのファイルを再帰的にリストします&& find . -type f
  • ()のfind入力として出力される各行を使用するmd5| xargs md5

違いがある場合、出力は次のようになります。

< MD5 (./index.html) = 36b01762f0329b2c12a5186520c7d78a
< MD5 (./inline.js) = ce99823a4b2c24839a727c5781f59a36
< MD5 (./main.js) = 3a597404d3ba7f0a6e3cb093ef57ebb2
---
> MD5 (./index.html) = 3a3d7663a7b2871ff37b9081a53593f9
> MD5 (./inline.js) = 1bbd0ecfc75b578413105c6b9009f9b3
> MD5 (./main.js) = 0f44abe5084add3cabdc39feec0c699878c78
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.