2つの異なるディレクトリにある差分ファイル


303

ファイルの同じリストを持つ2つのディレクトリがあります。diffコマンドを使用して、両方のディレクトリにあるすべてのファイルを比較する必要があります。それを行う簡単なコマンドラインオプションはありますか、またはファイルリストを取得してそれらを繰り返すためにシェルスクリプトを書かなければなりませんか?

回答:


422

diffそのためのコマンドを使用できます。

diff -bur folder1/ folder2/

これは、スペースを無視する再帰的な差分を、統一されたコンテキストで出力します。

  • bフラグは空白を無視することを意味します
  • uフラグは統一されたコンテキストを意味します(前後3行)
  • rフラグは再帰を意味します

9
Win32用diffGNUユーティリティをダウンロードして、コマンドにアクセスできます。
Laurent Etiemble 2013

7
--briefオプションが役立つこともわかりました。変更されたファイルのリストが表示され、それらを個別に処理できます
Dariusz

27
不思議に思う人のために、-b空白の変更を無視して-u3行のバッファーを提供します。
ラットトレイ2014

28
burの代わりにrub ieを使用すると、このコマンドを覚えやすくなりますdiff -rub folder1/ folder2/
SomeGuyOnAComputer

11
私は想像する-burあなたは寒冷な気候に住んでいたならば覚えやすいでしょう。
AlanH

126

異なるファイルのみを表示したい場合は、以下を使用できます。

diff -qr dir_one dir_two | sort

オプション "q"は異なるファイルのみを表示しますが、異なるコンテンツは表示しません。 "sort"は出力をアルファベット順に並べます。


1
それは素晴らしいです!また、効率的に機能します。つまり、サブディレクトリ全体がディレクトリの1つにのみ存在する場合、そのディレクトリへの反復は停止し、サブディレクトリ自体のみ(後続コンテンツなし)を報告します。非常に素晴らしい!!
SomethingSomething

これは本当に良い最初のステップです:どちらかといえば、何を、見異なっており、その後、詳細なんdiff異なるファイルの各ペアに。1つまたは2つのファイルのみが異なる場合と数十のファイルが異なる場合のアプローチは大きく異なります。diff一度に数十のファイルを処理すると、出力が失われる可能性があります。
jvriesem

また、-x PATTERN特定のサブディレクトリを除外するコマンドに含めることができます。たとえば、diff -qr repo1 repo2 -x ".git"2つのディレクトリ(repo1とrepo2)を比較しますが、それぞれのディレクトリの.gitフォルダー内のファイルは除外します。
ViFI

20

Diffには、-rそれを行うためのオプションがあります。

diff -r dir1 dir2


11

diff2つのファイルを比較できるだけでなく、-rオプションを使用して、ディレクトリツリー全体をウォークし、各ツリーの比較可能なポイントで発生するサブディレクトリとファイルの違いを再帰的にチェックできます。

$ man diff

...

-r  --recursive
        Recursively compare any subdirectories found.

...

3

GNU diffの場合は、2つのディレクトリを指定して、-rオプションを使用できます。

それ以外の場合は、

for i in $(\ls -d ./dir1/*); do diff ${i} dir2; done

注:Dennisがコメントセクションで指摘したように、実際にはlsでコマンド置換を行う必要はありません。私はこれを長い間行ってきたので、オートパイロットでこれをほぼ実行し、比較のためにファイルのリストを取得するために必要なコマンドを置き換えています。

また、「ls」を使用してGNU lsに対するlsのエイリアスを一時的に無効にし、GNU lsによって返されたリストからカラーフォーマット情報を失うことを忘れてしまいました。


2
それは使用する必要はありませんlsfor i in ./dir1/*
追って通知があるまで一時停止。

1
@デニス、ファンキーなショートカット。+1。自動でコマンドを置き換えるのに慣れているので、必要なコマンドを使用するだけです。たとえば、findを使用することもあります。lsを使用すると、dirのリストをもっと試すこともできます。たとえば、デフォルトのシーケンスではなく時間ベースのリバースです。
Rob Wells

0

2つのフォルダー内のファイルの違いを表示するスクリプトを次に示します。再帰的に動作します。dir1とdir2を変更します。

(search() { for i in $1/*; do [ -f "$i" ] && (diff "$1/${i##*/}" "$2/${i##*/}" || echo "files: $1/${i##*/}   $2/${i##*/}"); [ -d "$i" ] && search "$1/${i##*/}" "$2/${i##*/}"; done }; search "dir1" "dir2" )

0

特にファイルの内容を比較せず、どちらのディレクトリにも存在しないもののみを確認する場合は、別のコマンドで生成されたファイルのリストを比較できます。

diff <(find DIR1 -printf '%P\n' | sort) <(find DIR2 -printf '%P\n' | sort) | grep '^[<>]'

-printf '%P\n'find出力パスの前にルートディレクトリを付けないように指示します。

またsort、の両方の呼び出しでファイルの順序が同じになるように追加しましたfind

grep終了時には、同一の入力ラインについての情報を除去します。


-4

これを試して:

diff -rq /path/to/folder1 /path/to/folder2      

2
これは既存の回答を複製し、新しいコンテンツを追加しません。あなたが実際に貢献する何か新しいものがない限り、答えを投稿しないでください。
Toby Speight 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.