web-dev-qa-db-ja.com

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

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

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

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

> diff d1 d2

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

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

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

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

19
ysap

各ファイルに対して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##*/}部分は特別なパラメーター拡張です。

ファイル変数に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/1 を参照してください。

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

13
geirha

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以外のすべてのファイルをリストするテキストファイルを作成することです。これを行うには、次のコマンドを使用します。ls -I "*.cpp" > excluded_files引数の-I "*.cpp"は、すべての.cppファイルを無視します。引用符が必要であることに注意してください。

50
Rinzwind

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

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

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

4
ysap

そのための軽量なソリューションがあります:

  1. この小さなプラグインをセットアップします http://www.vim.org/scripts/script.php?script_id=5309
  2. シェルでdiff dir1 dir2 | vim -R -を実行

変更されたファイルの折り畳みと横並び比較を追加します。

1
Yuriy Ershov