「diff -X」でファイル名ではなく特定のパスを無視するにはどうすればよいですか?


28

やること: diff -r -X <ignore-list> <src-dir> <dest-dir>

それらがフォームdiffである<ignore-list>なら、エントリーを無視するように思われません<dir>/<file>

<fileただし、フォームのエントリは考慮されます。これは問題です。複数のファイル<file>が異なるサブディレクトリに名前が付けられている可能性がありますが、その一部は無視したくないものです。

diffどちらのマンページにも、パターン構文に関する多くの情報がないようです。私が知ることができることから、それはdiffによって考慮されるファイルのベース名にすぎません(興味がある場合はhttp://forums.gentoo.org/viewtopic-t-889788-start-0.htmlを参照してください)。


男、diff--excludeオプションであるくだらないので...
Elouan Keryell-でも

回答:


30

ディレクトリのリストは機能するはずです。たとえば、スクリプトで使用したもの(gnu diffを想定)、

diff -r \
   --exclude="*~" \
   --exclude=".svn" \
   --exclude=".git" \
   --exclude="*.zip*" \
   --exclude="*.gz" \
   --exclude="*.tar" \
   ...etc

... .svnおよび.gitdirsの内容を無視しますが、*.zip/ *.gz/ etc という名前の個々のファイルも無視します。

編集:フォームのフィルタパスするためにはdir_a/file1依然としてdiff同じ基本名を持つファイル、などdir_b/file1またはdir_a/b/file1、その後するファイルのリストdiff(使用、例えば、生成されなければならないfind)、及びこれらのパスに由来比較するファイル。例えば、与えられた

$ find ONE TWO -type f -print 
ONE/a/1.txt
ONE/a/2.txt
ONE/a/b/2.txt
TWO/a/1.txt
TWO/a/2.txt
TWO/a/b/2.txt

比較するファイルのリストを生成し*/a/2.txtます2.txt。たとえば、除外しますが、という名前の他のファイルを比較します。を除くすべてのファイルを「検索」するだけですONE/a/2.txt(正規表現はのようにここでも使用できます.*/a/2.txt)。

$ find ONE -type f \( ! -regex 'ONE/a/2.txt' \) \
    -exec bash -c 'diff -q "${1}" "${2/ONE/TWO}"' - {} {} \;  

これは実際には無視ONE/a/2.txt(およびTWO/a/2.txt)しますが、次の名前のファイルを比較します2.txt

diff -q ONE/a/1.txt TWO/a/1.txt
diff -q ONE/a/b/2.txt TWO/a/b/2.txt

編集:それとも、ともっと楽しいfind(追加の楽しみは、読者の練習として残し)、ファイルまたはディレクトリを選択除外して、diff他のすべて:

$ find ONE \( -regex 'ONE/a/2.txt' -o -name b  -prune \)  \
    -o -type f -exec bash -c 'echo diff -q "${1}" "${2/ONE/TWO}"' - {} {} \

上記の例では、特定のファイル「{top} /a/2.txt」、「b」という名前のディレクトリ、および他のすべてが差分になっています。(単純な「-name b」の代わりに、「」を使用することもできます-regex '.*/b'-注、末尾の「/」はありません。)


2
感謝しますが、私はあなたがポイントを逃していると思います。唯一のサポートは、「ベース名」を使用する場合です。それは、ディレクトリまたはファイルの名前です。どちらの場合でも、diffはあなたが要求したものを無視します。パスを使用すると問題が発生します。たとえば、diffで/ an / absolute / path / to / a / fileまたは./a/relative/path/to/a/fileを無視することはできません。
アッシュ

2
diff --exclude = "/ this / specific / file / that / im / explicitly / pleading / you / to / ignore"。動作しません。
アッシュ

3
正しい、excludeパターンはファイルのベース名と一致します(gnu.org/software/diffutils/manual/html_node/…による)。パスは機能しません(のようにfoo/bar.txt)。そのためには、実行findしてファイル名のリストを生成し、比較するファイルへのパスを導出する必要があります。
マイケル

diffを使用する代わりに、からファイルパスを除外する例を含めるように回答を更新しましたbasename
マイケル

さて、あなたが提案していることはわかりましたが、問題があるようです。ファイルだけでなく、ディレクトリも考慮する必要があります(つまり、-type f)。これで、regexpを使用して特定のファイルを整理することができますがfind、への入力にdiffディレクトリが含まれている場合、そのディレクトリ内のファイルを調べて比較し、これらのファイルの一部を無視する必要があるかもしれません...正方形1に戻る
アッシュ


1

ディレクトリを除外するにはdirectory/sub-directory、使用します

diff -r <src-dir> <dest-dir> | grep -v directory/sub-directory

ただし、1回の除外で機能するはずですが、長い無視リストを使用することはできません。


-2
$ diff -rq foo.orig foo | grep -vP 'ignore1/|exclude2/' | awk '{print $2}' | cut -d'/' -f2- | xargs -I{} diff -u foo.orig/{} foo/{}

1
これは質問に答える可能性がありますが、なぜそうするのかの説明を提供できれば、より良い答えになるでしょう。
DavidPostill
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.