Linuxで、2つの別々のディレクトリがまったく同じ内容であることを簡単に確認するにはどうすればよいですか?


8

CentOS 5.x

MQの質問はこれに似ているようですが、よくわかりません...

私は2つのサーバー(互いに完全に分離されています)を使用しており、それぞれに同じ内容のディレクトリとサブディレクトリがあります。

たとえば、ディレクトリレイアウトは次のようになります。

サーバーA-

/opt/foo/foob/1092380298309128301283/123.txt
/opt/foo/foob/5094380298309128301283/456.txt
/opt/foo/foob/5092380298309128301283/789.txt
/opt/foo/foob/1592380298309128301283/abc.txt

サーバーB-

/opt/foo/foob/1092380298309128301283/123.txt
/opt/foo/foob/5094380298309128301283/456.txt
/opt/foo/foob/5092380298309128301283/789.txt
/opt/foo/foob/1592380298309128301283/abc.txt

理想的には、再帰的なチェックを行い、すべてが一致することを確認する方法が欲しいです。

また、サードパーティのツールの使用も避けたいです。

何か案は?


2つのディレクトリを比較するだけですか、それとも実際に一方をもう一方の複製にしますか?
スコットパック

@ScottPack素晴らしい質問です。比較したいのですが、変更はしません。他の何かがディレクトリの複製を処理しています。私はそれがその仕事をしていることを確認したいだけです。
マイクB

1
この質問にタグを付けましたかrsync?だから...ええと、rsync-nオプションで)使用しますか?
偽物

@faker私はrsyncがオプションかもしれないと思いましたが、このユースケースにもっと良い、より簡単、またはより具体的なものがあるかどうかはわかりませんでした。ファイル名、日付、サイズ、相対位置が一致していることを知る必要があります。
Mike B

時間とサイズが一致する場合、rsyncはファイルの内容をチェックしません。これが心配な場合は--checksumオプションを参照してください
stew

回答:


9

1つの良い方法は、ツリー内のすべてのファイルでmd5sumsを使用することです。

これをserver1で実行します。

find /opt/foo/foob/ -type f -print0 | xargs -0 md5sum > report_from_server1.tx

これをserver2で実行します

find /opt/foo/foob/ -type f -print0 | xargs -0 md5sum > report_from_server2.tx

次に、2つのファイル(diffを使用)または好きなものを比較します。

それはあなたが探しているものに沿っていますか?

もちろん、必要に応じてSSHを使用してリモートでコマンドを実行することもできます。


カムデン、ありがとう。いや、これは私が探していたものだと思います。私はそれをテストし、うまくいくかどうかを確認します。
マイクB

2
またはmd5sum md5sums
dmourati

すばらしい-そうです、どのファイルが変更されるかを気にしない場合は、結果のファイルをmd5sumして、これら2つの合計を比較できます。
カムデンS.

また、あなたはおそらくこれをすでに知っていますが、SSH経由でそのコマンドをリモートで実行するには、次のようにしますssh user@servera 'find /opt/foo/foob/ -type f -print0 | xargs -0 md5sum'
Camden S.

1
MikeBは、再帰的な長いリストを実行してそれをmd5sumに渡すと、ファイルの内容を除外するディレクトリリストのmd5sumを取得します。両端のファイルシステムのiノードサイズが異なる場合は、ファイルサイズにも違いが生じる可能性があります。@CamdenSによって最初に提案されたようなコンテンツに対してmd5sumを実行します。優れている。
nearora 2012年

7

何が変わったのかを気にする必要がなく、何かが変わっただけの場合でも、rsyncはそのために本当に役立ちます。これが「servera」から実行されていると想定して、このコマンドを実行して、出力を少し見てください。

rsync -avcn /opt/foo/ serverb:/opt/foo

結果のリストは、実際に同期プロセスを実行した場合に変更されたファイルになります。タイムスタンプのみが変更された場合でもファイルはリストに表示されますが、内容は同じままです。-nフラグを追加したので、実際にはアクションは実行されず、報告されるだけです。


ありがとう。2つのボックスが互いに完全に分離されている場合はどうなりますか?出力を使用して比較するにはどうすればよいですか?
Mike B

rsyncはソースと宛先の両方がリモートであることをサポートしていないため、サーバーの1つで実行する必要があります
偽物

@faker:認めざるを得ない、これまで試したことがない、知っておくと良い。しかし、あなたが言うように、それは説明するのに十分簡単です。
スコットパック

+1。の賢い使い方rsync。ただし、完全に正しくするにrsyncは、を双方向で実行する必要があります。つまり、あなたはこれを追加する必要がありますrsync -avcn serverb:/opt/foo/ /opt/foo
スティーブン月曜日

5

ディレクトリ内の個々のファイルの個々のMD5ハッシュを計算する簡単なスクリプトを一緒にハッキングすることもできますが、より良い方法md5deepは、ディレクトリ内のすべてのファイルのハッシュを再帰的に計算して出力するというツールを使用することです。それらをファイルに。その後、別のディレクトリで使用でき、最初のハッシュファイルを入力として使用して、2つのディレクトリ間で異なるファイルのリストを提供します。

したがって、例を挙げれば、次のプロセスに従います。

  1. サーバーAの必要なディレクトリのハッシュを計算します。

    md5deep -r /opt/foo/ > file_hashes.txt

  2. file_hashes.txt比較のために、ファイルfileをサーバーBにコピーします。

  3. サーバーB上の必要なディレクトリのハッシュを計算しますが、-xフラグを使用して異なるファイルのみを表示することにより、サーバーAからのファイルハッシュを入力ファイルとして取得します。

    md5deep -x file_hashes.txt -r /opt/foo/

md5deepツールのセットは、ほとんどのディストリビューションのパッケージ管理システムの一部を形成しており、MD5だけでなく、多くの異なるハッシュアルゴリズムをサポートしているのが素晴らしいところです。したがって、衝突について偏執的である場合は、いくつかの選択肢があります。次のツールはmd5deepの一部を形成し、それぞれが代替ハッシュアルゴリズムを提供します。

   md5deep - Compute and compare MD5 message digests
   sha1deep - Compute and compare SHA-1 message digests
   sha256deep - Compute and compare SHA-256 message digests
   tigerdeep - Compute and compare Tiger message digests
   whirlpooldeep - Compute and compare Whirlpool message digests

0

@ scott-packと同様の手法を使用しました。これにより、双方向の相違がわかります。「削除」で始まるものはすべて、リモートサーバー上にあり、ローカルサーバー上にはないファイルです。ファイルの内容なしでリストされているすべてのディレクトリは、変更がないディレクトリです。リストされているすべてのファイルは、リモートサーバーに存在しないか、ローカルバージョンが「新しい」ファイルです。

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