ディレクトリの2つのコピー(作業とバックアップなど)で同じ名前のすべてのファイル間でdiff
sを見つけようとしています。たとえば、両方で同じ名前の2つのファイルをdiff
できます:
> diff d1/f.cpp d2/f.cpp
または、ディレクトリ全体で違いを見つけることができます:
> diff d1 d2
しかし、どのようにして*.cpp
ファイルのみの違いを見つけることができますか?
> diff d1/*.cpp d2/*.cpp
動作しないようです(明らかな理由のため)。
[おそらくループで解決するのは簡単かもしれませんが、もっとエレガントな方法を見つけようとしています]
各ファイルに対して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など)を使用すると、この種の差分処理がはるかに簡単になります。
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ファイルを無視します。引用符が必要であることに注意してください。
質問をしてからしばらくして、 meld
diffユーティリティを見つけ、それ以来使用しています。これは、ファイルとディレクトリ間の比較とマージを非常に簡単な作業にするGUIベースのプログラムのすばらしい部分です。双方向または3者間比較を行います。
具体的には、ディレクトリの内容の色分けされた比較を表示し、ファイル名をダブルクリックして特定のファイルを比較できるという点で、私の元の質問に答えます。
3者間比較よりも多く必要な場合は、gvimdiff
(vim
エディターに基づく)もこの機能を提供する素晴らしいツールです。
そのための軽量なソリューションがあります:
diff dir1 dir2 | vim -R -
を実行変更されたファイルの折り畳みと横並び比較を追加します。