web-dev-qa-db-ja.com

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

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

261
Sudar

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

diff -bur folder1/ folder2/

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

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

異なるファイルを見ることだけに興味がある場合は、次のようにします。

diff -qr dir_one dir_two | sort

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

101
Suresh

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

diff -r dir1 dir2

18
CodeRain

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

$ man diff

...

-r  --recursive
        Recursively compare any subdirectories found.

...
10
miku

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

そうでなければ、使用してみてください

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

N.B.コメントセクションでDennisによって指摘されたように、あなたは実際にlsの上でコマンド置換をする必要はありません。私はオートパイロットでこれをやっていて、比較のために私のファイルのリストを得るために必要なコマンドを代用しているので、私は長い間これをしてきました。

また、GNU lsによって返されたリストからカラーフォーマット情報が失われるように、l [私のエイリアス_ GNU lsを一時的に無効にするために '\ ls'を実行することを忘れていました。

3
Rob Wells

これは、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
Evgeny Karpov