web-dev-qa-db-ja.com

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

実行中:diff -r -X <ignore-list> <src-dir> <dest-dir>

<ignore-list>の形式の場合、diff<dir>/<file>のエントリを無視しないようです。

ただし、<file>という形式のエントリは考慮されます。 <file>という名前の複数のファイルが異なるサブディレクトリにある可能性があるため、これは問題です。一部のファイルは無視したくありません。

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

29
Ash

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

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

...これは、.svnおよび.gitディレクトリの内容を無視しますが、*.Zip/*.gz /などの名前の個々のファイルも無視します。

編集:dir_a/file1という形式のパスをフィルタリングするために、dir_b/file1dir_a/b/file1などの同じベース名を持つdiffファイル次に、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'」を使用することもできます-末尾に「/」がないことに注意してください。)

30
michael

同じ問題があったので、diffへのパッチを作成しました。パッチはまだ受け入れられていませんが、独自のバージョンのdiffをパッチまたは AURパッケージにAURパッケージでインストール でビルドできます。

ここdiffパッチです。

2
Dave Parrish

ディレクトリを除外するにはdirectory/sub-directory、 私が使う

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

ただし、単一の除外に対しては機能するはずですが、長い無視リストの場合は可能ではありません。

1