web-dev-qa-db-ja.com

ファイル名(およびサイズと日付)に関するディレクトリツリーを比較する

バックアップからの復元結果を確認したい。これは、MacOSのTimeMachineで奇妙なエラーと警告が表示され、復元後にすべてが元の場所に戻っていることを確認したいためです。私はTimeMachineがすべてのファイルを元に戻すことを信頼していませんが、正しいコンテンツで復元するすべてのファイルを元に戻すことを信頼しています。

私はdiff -rについて考えましたが、およそ300 GiB=は永遠にかかる場合があります。少なくともファイルの存在を比較することは問題ありませんが、同じ実行でサイズと日付を比較することはさらに優れています。

私は次のような解決策を知っています

diff <(ls -R $PATH1) <(ls -R $PATH2)

しかし、出力は読み取るためのdiffishです。ファイルごとに1行だけを見つけたいと思っています。また、私はlsが両側で同じ順序でツリーを進むことに依存する必要があります。ファイルシステムが異なる場合があるため、これは異なる場合があります。

私は、2つのパスをたどり、Macports以外の目的の検査レベルまでの差異を出力する、怠惰なツールを入手したいのですが。しかし、私は十分なバシズムを恐れません。

あなたが言及する「解決策」は本当に悪いものであり(たとえば、奇妙なファイル名を処理することはできません)、完全に不要です。 diffを直接使用するだけです:

diff -r "$PATH1" "$PATH2"

これは再帰的に行われます(-r)ディレクトリを比較し、ファイルが存在するか欠落しているかを報告します。例えば:

$ tree
.
├── dirA
│   ├── file1
│   └── file2
└── dirB
    └── file{1}

$ diff -qr dirA dirB
Files dirA/file1 and dirB/file1 differ
Only in dirA: file2
Only in dirB: file3

-qオプションは「静か」であることを意味し、ファイルに違いがあるかどうかを報告するだけで、違いは出力されません。上記の例では、ファイルdirA/file1およびdirB/file1は内容が異なります。このフォーマットは、予想できるほど簡単で、大規模なディレクトリでもかなり高速です。

3
terdon

これがあなたの解決策です:

rsync -nrv --delete dirA/ dirB/

2つのフォルダーを同一にする代わりに、rsyncを使用して、その内容のみを表示しますwouldを実行します。それが-nの効果です。注意して、このオプションを追加することを忘れないでください!

-rは再帰的なスキャンを意味し、-vは必要な詳細リストを提供します。別の-vを追加して、すべてのイコールをリストすることもできます。

--deleteは、ソースに存在しないターゲットファイルの削除をシミュレートするようにrsyncに指示します。 -nフラグがない場合、dirBフォルダーはdirAと同じになります。

デフォルトでは、rsyncはファイルの名前とタイムスタンプのみをチェックします。これは、まさに求めていた高速なオプションです。 diff動作などの同様の動作が必要な場合は(同様に遅い)、-cフラグを追加してチェックサム比較を強制できます。

rsync -nrvc --delete dirA/ dirB/

dirA/dirB/の末尾のスラッシュの使用に注意してください。これらはrsyncで重要です。詳細については、rsyncのmanページをご覧ください。この強力なコマンドに慣れるのは非常に理にかなっています。

18