実行中: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を参照してください 興味がある場合)。
ディレクトリのリストは機能するはずです。たとえば、これは私がスクリプトで使用したものです(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/file1
やdir_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'
」を使用することもできます-末尾に「/」がないことに注意してください。)
同じ問題があったので、diff
へのパッチを作成しました。パッチはまだ受け入れられていませんが、独自のバージョンのdiff
をパッチまたは AURパッケージにAURパッケージでインストール でビルドできます。
ここ はdiff
パッチです。
ディレクトリを除外するにはdirectory/sub-directory
、 私が使う
diff -r <src-dir> <dest-dir> | grep -v directory/sub-directory
ただし、単一の除外に対しては機能するはずですが、長い無視リストの場合は可能ではありません。