完全なディレクトリ構造を比較 (diff) する最適な方法は何ですか?

完全なディレクトリ構造を比較 (diff) する最適な方法は何ですか?

ディレクトリ構造を比較する最良の方法は何ですか?

私はバックアップユーティリティを使用していますrsyncソースとバックアップ間の正確な違い(ファイル サイズと最終変更日に関して)を知りたいです。

何かのようなもの:

Local file                   Remote file                         Compare
/home/udi/1.txt (date)(size)   /home/udi/1.txt (date)(size)     EQUAL
/home/udi/2.txt (date)(size)   /home/udi/2.txt (date)(size)     DIFFERENT

もちろん、ツールは既成のものでも、Python スクリプトのアイデアでも構いません。

どうもありがとう!

ウディ

答え1

あなたが探しているツールはrdiffrsync と diff を組み合わせたような動作をします。比較したり配布したりできるパッチ ファイルを作成します。

答え2

さまざまな理由でファイルシステムを比較したい人もいるため、ここでは私が何を望んでいたか、どのように比較したかを記述します。

私は欲しかった:

  • 比較すると同じファイルシステムそれ自体、すなわち、スナップショット変更を加えるスナップショット比較する
  • 追加または削除されたファイルのリスト。内部ファイルの変更は考慮されません。

私がしたこと:

最初のスナップショット(before.shスクリプト):

find / -xdev | sort > fs-before.txt

2 番目のスナップショット (after.shスクリプト):

find / -xdev | sort > fs-after.txt

比較するには(diff.shスクリプト):

diff -daU 0 fs-before.txt fs-after.txt | grep -vE '^(@@|\+\+\+|---)'

良い点は、これがデフォルトのシステム バイナリをほぼ使用していることです。コンテンツに基づいて比較するには、ファイル パスとその後の MD5 をエコーするパラメーターfindを渡す必要があります。-exec

答え3

別のツールをインストールしたくない場合は...

for host in host1 host2
do
  ssh $host ' 
  cd /dir &&
  find . |
  while
    read line
  do
    ls -l "$line"
  done ' | sort  > /tmp/temp.$host.$$
done
diff /tmp/temp.*.$$ | less
echo "don't forget to clean up the temp files!"

そして、はい、for ループで find を使用するのと同じくらい簡単に、find と exec または find と xargs で実行できます。また、diff の出力を「このファイルは host1 にありますが、host2 にはありません」などのように表示するように設定することもできますが、その時点では、他のみんなが話しているツールをインストールしたほうがよいでしょう...

答え4

diff -r実際にはかなりうまく機能します。ファイルが異なるかどうかだけを知りたい場合、違いの実際の内容ではなく、次のようにします。diff -qr

関連情報