Списки каталогов должны работать; например, вот что я использовал в сценарии (при условии, что GNU diff),
diff -r \
--exclude="*~" \
--exclude=".svn" \
--exclude=".git" \
--exclude="*.zip*" \
--exclude="*.gz" \
--exclude="*.tar" \
...etc
... который игнорирует содержимое .svn и .git , а также отдельные файлы с именем *.zip/*.gz/и т. д.
Редактировать: чтобы отфильтровать пути вида 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" и все остальное diff diff. (Вместо простого " -name b " вы также можете использовать " -regex '.*/b' " - примечание, без трейлинга "/".)