ディレクトリ間で複数のファイルを比較する方法は?


19

diffディレクトリの2つのコピー(作業用とバックアップ用)で同じ名前のすべてのファイル間でs を見つけようとしています。たとえばdiff、同じ名前の2つのファイルを両方で使用できます。

> diff d1/f.cpp d2/f.cpp

または、ディレクトリ全体で違いを見つけることができます:

> diff d1 d2

しかし、どうすれば*.cppファイル間の違いを見つけることができますか?

> diff d1/*.cpp d2/*.cpp

動作しないようです(明らかな理由のため)。

[おそらくループで解決するのは簡単かもしれませんが、よりエレガントな方法を見つけようとしています]

回答:


13

各ファイルに対してdiffを実行するシェルループを使用できますが、d2にはファイルが含まれるが、d1には含まれない場合はキャッチされません。しかしそれで十分かもしれません。

for file in d1/*.cpp; do
    diff "$file" "d2/${file##*/}"
done

またはすべてを1行で:

for file in d1/*.cpp; do diff "$file" "d2/${file##*/}"; done

この${file##*/}部分は、特別なパラメーター拡張です。

ファイル変数にが含まれている場合、(file の値ですが、最後の/削除されたものまですべてが含まれますd1/hello.cpp"${file##*/}"に展開されhello.cppます。

そう"d2/${file##*/}"になりd2/hello.cpp、得られるdiffコマンドは、このようにありますdiff d1/hello.cpp d2/hello.cpp

bashでの文字列操作の詳細については、http://mywiki.wooledge.org/BashFAQ/100を参照してください

ちなみに、バージョン管理システム(subversion、git、mercurialなど)を使用すると、この種の差分処理がはるかに簡単になります。


2つの素晴らしい答えのうち、これは複数のファイルタイプがある場合はより簡単であると思います(質問ではループなしのソリューションを探していると述べましたが)、私はそれを受け入れました。追加される1つecho "${file##*/}";diffコマンドの前にあるため、実際に比較されるファイルがわかります。また、@ Rinzwindの答えで述べたように、この方法は、両方のディレクトリでファイルリストがまったく同じでない場合には対応していません。
ysap

52

diff -qr {DIR1} {DIR2} 両方のディレクトリのすべてのファイルを実行します。

  • q 違いのみを表示
  • r再帰的です。必要ない場合は省いてください

diffワイルドカードを使用するように直接指示することはできませんが、以下を追加できます。

-x PAT  --exclude=PAT
    Exclude files that match PAT.

-X FILE    --exclude-from=FILE
   Exclude files that match any pattern in FILE.

ファイルを除外します。したがって*.cpp、最も簡単な方法だけが必要な場合は、そうでないすべてのファイルをリストするテキストファイルを作成することです*.cpp。:あなたは、次のコマンドでこれを行うことができ 、引数がすべての.cppファイルを無視します。引用符が必要であることに注意してください。ls -I "*.cpp" > excluded_files-I "*.cpp"


シンプルで、問題なく動作します。
ホセ・ゴメス・

4

質問をしてからしばらくして、melddiffユーティリティを見つけ、それ以来使用しています。これは、ファイルとディレクトリの比較とマージを非常に簡単な作業にするGUIベースのプログラムのすばらしい部分です。双方向または3者間比較を行います。

具体的には、ディレクトリの内容の色分けされた比較を表示し、ファイル名をダブルクリックして特定のファイルを比較できるという点で、私の元の質問に答えます。

3者間比較以上が必要な場合は、この機能を提供するgvimdiffvimエディターに基づく)も素晴らしいです。


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