列出目录应该起作用;例如,这是我在脚本中使用的(假设gnu diff),
diff -r \
--exclude="*~" \
--exclude=".svn" \
--exclude=".git" \
--exclude="*.zip*" \
--exclude="*.gz" \
--exclude="*.tar" \
...etc
...将忽略.svn
和.git
目录的内容,也忽略名为*.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
(除了regexp也可以在这里使用,例如.*/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
的--exclude
选择是如此低劣的...