web-dev-qa-db-ja.com

Linux:ファイルを比較せずにディレクトリ構造を比較する

実際にファイル内のデータを比較せずに2つのディレクトリ構造を比較するための最良かつ最も簡単な方法は何ですか?これはうまくいきます:

diff -qr dir1 dir2_

ただし、ファイルの比較も行うため、非常に時間がかかります。これを行うためのdiffまたは別の簡単なcliツールのスイッチはありますか?

56
Jonah

次の場合(最初のディレクトリをdirectory1に、2番目のディレクトリをdirectory2に置き換えた場合)は、探していることをすばやく実行できます。

find directory1 -type d -printf "%P\n" | sort > file1
find directory2 -type d -printf "%P\n" | sort | diff - file1

基本的な原則は、ベースのdirectoryNディレクトリに対する相対サブディレクトリパスを含むすべてのディレクトリを出力することです。

一部のディレクトリ名にキャリッジリターンがあり、他のディレクトリ名にキャリッジリターンがない場合、これは失敗する可能性があります(奇妙な出力が生成されます)。

37
Slartibartfast
vimdiff <(cd dir1; find . | sort) <(cd dir2; find . | sort)

共通セクションが折りたたまれた2つのディレクトリ階層を並べて表示します。

34
garyjohn

通常、このタスクにはrsyncを使用します。

rsync -nav --delete DIR1/ DIR2

非常に注意してください常に-n、別名--dry-run、オプションを使用するか、オプションを同期(内容を変更)しますディレクトリ。

これは、ファイルの変更時間とサイズに基づいてファイルを比較します... Ithinkそれが本当に欲しいものです、または少なくともそれが気になっていませんあれ?ファイルの内容の違いを無視する必要はなく、速く発生させたいという感覚を得ました。同じ名前の異なるファイルをリストしないようにしたい場合は、--ignore-existingオプションを追加するとそうなると思います。

また、/DIR1の最後に配置しないと、ディレクトリーDIR1が比較されることに注意してください。 DIR2の内容

出力は少し冗長になりますが、どのファイル/ディレクトリが異なるかが表示されます。 DIR2ではなくDIR1にあるファイル/ディレクトリの前には、Word deletingが付けられます。

状況によっては、@ slartibartfastの回答がより適切な場合がありますが、ディレクトリ以外のファイルのリストを有効にするには、-type dオプションを削除する必要があります。比較するファイル/ディレクトリの数が多い場合、rsyncはより高速になります。

23
intuited

Lsの回答に似ていますが、treeをインストールすると、次のことができます

tree dir1 > out1
tree dir2 > out2
diff out1 out2
19
digit

私はこの問題の解決策を探していました。私が最も気に入った解決策は:

comm <(ls DIR1) <(ls DIR2)

それはあなたに3つの列を与えます:1-DIR1のみのファイル、2-DIR2のみのファイル、3-DIR3のみのファイル詳細については、これを見てください ブログ投稿

3
kyrisu

これは最適なソリューションです

diff --brief -r dir1 dir2

--briefスイッチは、ファイルの違いのみを報告し、違いの詳細は報告しません。

2
jkshah
ls > dir1.txt

ls > dir2.txt

次に、2つのリストを比較します。

2
MDMarra

これは、一致すると予想されるツリーで欠落しているファイルを見つけるという特定のニーズに役立ちました。

diff <( cd dir1; find * |sort ) <(cd dir2; find * | sort)
1
amhest

"diff -qr"を使用して異なるファイルを取得し、grepを使用してファイル比較を除外して、ディレクトリの1つにのみ存在するファイル名のみを取得します。

diff -qr dir1 dir2 | grep -v "Files.*differ" 
1
Anonymous