2つのディレクトリツリーがある場合、どのファイルがコンテンツによって異なるかをどのようにして見つけることができますか?


786

2つのディレクトリツリーの違いを見つけたい場合は、通常は次のように実行します。

diff -r dir1/ dir2/

これにより、対応するファイル間の違いが正確に出力されます。内容が異なる対応ファイルのリストを取得したいだけです。これは単にコマンドラインオプションをに渡すだけのことdiffだと思いましたが、マニュアルページには何も見つかりませんでした。

助言がありますか?



1
ディレクトリの1つに関して、他に余分なファイル/ディレクトリのみを取得する方法は?
Sandeepan Nath

dircmpUNIX ではコマンドを使用(Linuxではない)
roblogic

回答:


1119

あなたはLinuxを言ったので運が良かった(少なくともそれは利用できるはずであり、いつ追加されたかはわからない):

diff --brief --recursive dir1/ dir2/ # GNU long options
diff -qr dir1/ dir2/ # common short options

必要なことを行う必要があります。

どちらのディレクトリにも存在しない可能性のあるファイルの違いも確認したい場合:

diff --brief --recursive --new-file dir1/ dir2/ # GNU long options
diff -qrN dir1/ dir2/ # common short options

12
いいね。しかし、より短くdiff -qr dir1/ dir2/、私の拡張バージョンはdiff -qr dir1/ dir2/ | grep ' differ'
sobi3ch

1
@skvなんで?回答と同じコマンドです。--briefショートカットだけに変更しました-q
sobi3ch

2
@skv元の質問が正確に何を要求したかではありませんが、この質問にも対応できるように回答を更新します。
Mark Loeser、2015

3
@MikeMaxwellそれはする必要があります--brief-brief-b -r -i -e -f、つまり、単一のオプションとしてではなく、フラグのセットとして解釈されます。
daboross

2
@daboross:うわー、私はずっとUnix / Linuxを使ってきましたが、 '-'と '-'の違いがあることに気づきませんでした。(私が始めたとき「-」が存在したとは思わない。)説明をありがとう!
マイクマクスウェル

287

私が使用するコマンドは:

diff -qr dir1/ dir2/

それはマークのそれとまったく同じです:)しかし、彼の答えはそれが異なるタイプのフラグを使用するので私を悩ませました、そしてそれは私を二度見させました。Markのより詳細なフラグを使用すると、次のようになります。

diff  --brief --recursive dir1/ dir2/

他の回答が完全に受け入れられる場合は、投稿をお詫び申し上げます。自分を止めることができませんでした...


3
一貫性を完全に理解してください。Markの回答にも賛成しました;)
Gerard ONeill

10
..だから、異なる味だけで異なる答えを出すのは理にかなっていますか?私見!両方の回答を1つの一貫した回答に組み合わせることは意味がありますか?はい!;)
sobi3ch 2015

1
ただの質問です。何のq略ですか?それは何かの略語ですか?私は背後にある任意のロジック見つけることができませんq...
kramer65

3
@ kramer65-これは「--brief」と同じですが、なぜqなのでしょうか。たぶん早く?「-b」は、manページによると、「空白の量の変更を無視する」によって取得されます。
FPC

4
@ kramer65私は信じているqためですquiet一般的にはあまり冗長意味します。
Gogeta70 2017

105

git diff --no-index dir1/ dir2/色の違いを表示できるため(git設定でそのオプションを設定している場合)、「less」を使用して長いページ出力ですべての違いを表示できるため、私はを使用するのが好きです。


25
きちんと。gitがそのファイルに対するリポジトリだけでなく、任意のディレクトリを比較できると誰が推測したでしょうか?
Dan Dascalescu 2014年

2
Perlスクリプトcolordiffはここで非常に便利です。svnと通常のdiffで使用できます。
フェリペアルバレス2014年

4
(私のように)2つのディレクトリを別々のgitプロジェクト/リポジトリとして比較する場合は--no-indexstackoverflow.com /a/1792477/473390にさらに追加する必要があります。@ alan-porterの回答を更新しました。
sobi3ch

私はこれが好きです。--name-status コマンドラインに追加すると、変更/追加/削除ステータスの「M / A / D」フラグが付いたファイル名リストが表示されるだけです。
gzh

これは、両方のディレクトリに実際に.gitフォルダーが含まれているために発生します。比較から除外するにはどうすればよいですか?
Muhamed Cicak

35

これらの2つのコマンドは、基本的に次のことを要求します。

diff --brief --recursive --no-dereference --new-file --no-ignore-file-name-case /dir1 /dir2 > dirdiff_1.txt

rsync --recursive --delete --links --checksum --verbose --dry-run /dir1/ /dir2/ > dirdiff_2.txt

どちらを選択するかは、dir1とdir2の場所によって異なります。

ディレクトリが2つの別々のドライブにある場合、diffはrsyncよりもパフォーマンスが優れています。ただし、比較した2つのディレクトリが同じドライブ上にある場合、rsyncの方が高速です。これは、diffが両方のディレクトリにほぼ等しい負荷を並列にかけ、2つのドライブの負荷を最大化するためです。

rsyncはチェックサムを実際に比較する前に大きなチャンクで計算します。これにより、I / O操作が大きなチャンクにグループ化され、単一のドライブで処理が行われる場合の処理​​がより効率的になります。


3
rsyncが単一のドライブ上のファイルのために高速であるだけでなく、例えば、サブディレクトリ内のファイルを比較するためのallowesは、rsync --options /usr /bin /var /sbin /lib /old_root効果的に現在のルートを比較します/(これですべてのサブディレクトリを指定することによって)と/old_root(例えば一部の古いバックアップを含む/何かである、)diff -r缶しません。また、同じサイズ、アクセス許可、およびタイムスタンプのファイルがおそらく変更されていないと想定した場合、除外--checksumすると、変更された可能性のあるファイルのチェックが非常に高速になります(そうでない場合)。
Matija Nalis 2017

1
--deletewith の目的は何rsyncですか?
トム・ヘイル

2
--deleteの目的は、source-dirに(もはや)存在しない、destination-dirの既存のファイルを削除することです
Thomas Munk

2
この場合、(と--dry-runフラグ)何も実際に削除されていない、rsyncファイルがDIR1ではなくDIR2にある唯一の版画
マタ

11
--dry-run誤って忘れないように、常に最初に置くことをお勧めします。
Dave Rager

22

Meldは、2つのディレクトリを比較するための優れたツールでもあります。

meld dir1/ dir2/

Meldには、ファイルまたはディレクトリを比較するための多くのオプションがあります。2つのファイルが異なる場合、ファイル比較モードに入り、正確な違いを確認するのは簡単です。


2
いいね。ツリーで比較を実行する単純なperlスクリプトを作成しましたが、制限に達しています。これがチケットのようです。
デビッドトンホーファー2017年

唯一の問題は、グラフィカルアプリであるため、スクリプトを作成できないことです。しかし、GUIを気にしなくてもいいです!ありがとう。
DeanM

meldただし、大きなディレクトリで使用すると、それがひどく遅くなることがわかります。大きなディレクトリをより適切に処理できるものはありますか?
ポップアップ

@Popup、私が知っていることではありません。あなたはかかわらず、このようなものと異なるファイル名を見つけることができる:find dir1 dir2 | cut -d/ -f2- | sort | uniq --unique
アレクサンダー

1
@Alexander-その場合meld <(find dir1 -ls ) <(find dir2 -ls)、bashプロセス置換を使用すると、それがかなりうまくいくことがわかります。(zshの=(command)動作はさらに優れています。)
ポップアップ

10

(freenode /#centos fameの)チャネルコンパトリオット 'billings'は彼の方法を私と共有しました:

diff -Naur dir1/ dir2

最終ディレクトリのスラッシュを含めることは重要ではありません。

また、それが表示されます -uオプションは一部の古い/サーバーバージョンのdiffでは使用できないようです。

差分の違い:

# diff -Nar /tmp/dir1 /tmp/dir2/
diff -Nar /tmp/dir1/file /tmp/dir2/file
28a29
> TEST

# diff -qr /tmp/dir1/ /tmp/dir2/
Files /tmp/dir1/file and /tmp/dir2/file differ

2
そのため、--new-file/-Ndiffは欠落しているファイルを空で--text/-aあると見なし、すべてのバイナリ入力をテキストであると見なします。この特定のユースケースの利点はわかりません。
16年

4

ディフスコープは、優れたコマンドラインベースのディレクトリツールです。

私は特にそれがdiffをできることそれについてのようファイル:

多くの種類のアーカイブを再帰的に展開し、さまざまなバイナリ形式を人間が読める形式に変換して比較します。2つのtarball、ISOイメージ、PDFを簡単に比較できます。

どのファイルが異なるかだけでなく、どのように異なるかもわかります。


4

diffを見つけるには、次のコマンドを使用します。

diff -qr dir1/ dir2/

-rはすべてのサブディレクトリも比較します -qはファイルが異なる場合にのみ報告するようにdiffに指示します。

diff  --brief dir1/ dir2/

--briefは、ディレクトリに存在しないファイルを表示します。

それとも

Meldを使用して、グラフィカルウィンドウに違いを簡単に見つけることができます。

meld  dir1/ dir2/

2
--brief-q同じオプションです。あなたの声明は、それらが異なっているように聞こえますが、そうではありません。
イライジャ・リン

2

および使用できます。の場合:Rsyncfindfind

find $FOLDER -type f | cut -d/ -f2- | sort > /tmp/file_list_$FOLDER

ただし、同じ名前で同じサブフォルダーにあり、内容が異なるファイルはリストに表示されません。

GUIのファンなら、@ Alexanderが言及したMeldをチェックできます。WindowsとLinuxの両方で正常に動作します。


1

dirAとdirBの違いを報告すると同時に、更新/同期します。

rsync -auv <dirA> <dirB>

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