web-dev-qa-db-ja.com

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

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

たとえば、フォルダMyFolderに、次のものを含むファイル1.txt2.txt、および3.txtがあるとします。


1.txt

1.txtへのテキスト

2.txt

2.txtへのテキスト

3.txt

3.txtへのテキスト


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

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

10
GarouDan

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

15
David Schwartz

あなたがそれをアーカイブしたくないなら、多分あなたはこのようなことをすることができます

diff <(find folder1) <(find folder2)

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

[〜#〜] edit [〜#〜]ファイルの内容を比較するためにfind呼び出しに-execを追加できます。これに似たもの:

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

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

4
rahmu

テストする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とそのサブディレクトリ内のファイル数をチェックします)。

3
Chris Down

元の投稿はかなり古いことに気づきましたが、この情報は、ファイルが正しくコピーされていることを確認するための解決策を探している人にとっては、依然として価値があると思います。 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コマンドを実行する必要がある場合があります。

0
NordicViking

確認したい場合再帰的に 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
0
david_p