フォルダーをアーカイブに圧縮せずに、フォルダーのmd5sum
(または同様の計算)を見つけたいのですが。
たとえば、フォルダMyFolder
に、次のものを含むファイル1.txt
、2.txt
、および3.txt
があるとします。
1.txtへのテキスト
2.txtへのテキスト
3.txtへのテキスト
このMyFolder
全体のmd5sum
を計算するにはどうすればよいですか?方法はありますか?これを使用して、2つのフォルダーの内容が同じかどうかを確認します。
これは、2つのCDまたはフォルダーが等しいかどうかを確認するために使用できます。簡単な方法が欲しいのですが。
md5deep ツールは、まさにこの目的のために開発されました。多くのLinuxディストリビューションは、パッケージ形式で提供しています。
あなたがそれをアーカイブしたくないなら、多分あなたはこのようなことをすることができます
diff <(find folder1) <(find folder2)
より正確にするために、find
コマンドを調整する必要がある場合があります。
[〜#〜] edit [〜#〜]ファイルの内容を比較するためにfind呼び出しに-exec
を追加できます。これに似たもの:
diff <(find folder1 -type f -exec md5sum {} \; | sort) <(find folder2 -type f -exec md5sum {} \; | sort)
これを採用することをお勧めします。
テストする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とそのサブディレクトリ内のファイル数をチェックします)。
元の投稿はかなり古いことに気づきましたが、この情報は、ファイルが正しくコピーされていることを確認するための解決策を探している人にとっては、依然として価値があると思います。 Rsyncはデータをコピーするための最良の方法であり、このスレッドで与えられた答えは良いですが、Linuxの経験がない人のために、より詳細な説明をしようと思います。
シナリオ:たくさんのサブディレクトリとファイルを使用して、ディスクから別のディスクにデータをコピーしたところです。すべてのデータが正しくコピーされていることを確認します。
まず、コマンドmd5deep -v
を発行して、md5deepがインストールされていることを確認します。
「コマンドが見つかりません」などのメッセージが表示された場合は、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
は、すべての出力を/tmp/checksums.md5
にリダイレクトするようにmd5deepに指示します。
以前のバージョンの/tmp/checksums.md5
のコンテンツを上書きする場合は、>
ではなく>>
を使用してください。
Io-speedとデータのサイズによっては、このコマンドにかなりの時間がかかる場合があることに注意してください。ニースやイオニスを試してmd5deepのパフォーマンスを向上させることもできますが、それはこの回答の範囲外です。
チェックサムの作成が完了すると、次のようなエントリを持つファイルが作成されます。
69c0a826b29c8f40b7ca5e56e53d7f83 ./oldconfig-11-09-2013/etc2/apm/event.d/20hdparm 651f3c7f79a14332f9fa7bb368039210 ./oldconfig-11-09-2013/etc2/apm/event.d/anacron 50d89ffb97bb96bb969596f68f68f86f68b97c98b98c98f98f68f97c98f98c98fc98fc98fc98f68f97c98f97f9fbf95f95f9f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f6e7e7f7f7f7f7f97f64f97f64fd64ff64f64f64f64f64f6464台以下フォームの取り付け方法: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
チェックサムを作成したときとの唯一の違いは、checksums.md5ファイルのエントリがnot一致した場合に、ファイルの現在のハッシュを表示する-Xです。したがって、テストの終わりまでに、/tmp/compare.result
が空白の場合、チェックサムが一致するため、すべてのファイルが正しくコピーされていると信頼できます。
/tmp/checksums.md5
ファイルにリストされているファイルのみが正しいチェックサムについてチェックされることに注意してください。/mnt/backup
ディレクトリに追加のファイルがある場合、md5deepはこれらについて通知しません。
ノート:
出力ファイルを保存するために、必ずしもリダイレクトを使用する必要はありません。詳細については、md5deepのマニュアルを参照してください。
処理するファイルの権限によっては、rootとしてmd5deepコマンドを実行する必要がある場合があります。
確認したい場合再帰的に 2つのディレクトリの違い/path1
と/path2
なしmd5deep
を使用:
diff <(cd /path1 && find . -type f |xargs md5) <(cd /path2 && find . -type f |xargs md5)
説明:
path1
に入って、find
によって出力されるすべての行をpath1
(cd /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