web-dev-qa-db-ja.com

UNIXを使用してリモートサーバー上の2つのディレクトリの内容を比較する

私はunixが初めてなので、ここで助けが必要です。 2つの異なるサーバーに2つのディレクトリがあります。両方のディレクトリに同じファイルが含まれています。次に、両方のディレクトリですべてのファイルが同期しているかどうかを確認します。ファイルが同期していない場合、それらのファイルの名前のみを表示したいです。ディレクトリが同じサーバー上にある場合、私はそれを行うことができます。ディレクトリが2つの異なるサーバーに存在する場合、これを行う方法を理解できません。

eg:
server1 /abc/home/sample1/
server2 /abc/home/sample2/

ここでは、同期していないときにファイル名のみを表示したいです。

前もって感謝します

25
DSD

Rsyncを-nフラグとともに使用して、実際に同期を実行せずにファイルが同期しているかどうかを確認できます。

たとえば、from server1

rsync -n -avrc /abc/home/sample1/* server2:/abc/home/sample2/

これにより、-rserver1:/abc/home/sample1/の間で異なるすべてのファイルの名前(再帰的、server2:/abc/home/sample2/フラグ付き)が出力されます。

rsync使用パラメーターの説明

-n, --dry-run-変更を加えずに試運転を実行します

-a, --archive-アーカイブモード。 -rlptgoDと等しい(-H、-A、-Xなし)

-v, --verbose-冗長性を高める

-r, --recursive-ディレクトリへの再帰

-c, --checksum-mod-timeおよびsizeではなく、チェックサムに基づいてスキップ

63
kielni

Server1で:

cd /abc/home/sample1/ && diff --side-by-side --suppress-common-lines <(find . -type f|xargs stat --printf "%s\t%n\n"|sort -n) <(ssh server2 "cd /abc/home/sample2/ && find . -type f|xargs stat --printf \"%s\t%n\n\"|sort -n")

これは非常に高速ですが、コンテンツのハッシュではなくファイルサイズを使用するため、rsyncほど正確ではないでしょう。また、server2にserver1よりも多くのファイルがある場合、kielniの答えからのrsyncは何も表示しません。代わりにこれを試してください:

rsync -n -avr --size-only --delete /abc/home/sample1/ server2:/abc/home/sample2/
6
AXE-Labs

2つのサーバー間に接続性がないシナリオでは、「tree」コマンドを使用してファイルのディレクトリ構造を取得し、2つのファイルを比較します。

0
gopuvp

私はいつもそのようなタスクにrsync -avcnを使用しています-私はCLIファンです。アイデアは、「ドライラン」(-n)を実行することです。これは、実際にファイルをコピーしたり、変更を加えたりせずに行われたことを示します。 -cスイッチの使用は、変更日やファイルサイズではなくチェックサムを使用してファイルが異なるかどうかを判断するため、非常に重要です。 -aは、比較がより徹底的であることを確認し、プログラムがサブディレクトリに飛び込むことを強制します。最後に、-vは冗長性のレベルを上げます。これは、異なるファイルが見つかった場合に役立ちます。

したがって、考えられる解決策は次のようになります。

rsync -avcn source_dir/ dest_dir/

rsyncは、2つのディレクトリ間で異なるファイルの名前を出力します。末尾のスラッシュに注意してください-それらは必須です。

ただし:

  1. 多数の異なるファイルがある場合、リストはすぐに端末画面をいっぱいにし、読みにくくなります。この場合、出力をファイルにリダイレクトすることをお勧めします:rsync -avcn source_dir/ dest_dir/ > diffs.txt
  2. これはばかげて聞こえるかもしれませんが、ソースディレクトリまたは宛先ディレクトリにスペースがある場合はスペースをエスケープすることを忘れないでください。または、引用符で囲むことができます。 rsync -avcn /src/My Dir/ dest/My dir/はあなたが望むものではありません。むしろ、rsync -avcn /src/My\ Dir/ dest/My\ Dir/またはおそらくrsync -avcn /src/"My Dir"/ dest/"My Dir"/を使用する必要があります。この点は、Windowsマウントを扱う場合に特に有効です。
0
data.dude