Списки каталогов должны работать; например, вот что я использовал в сценарии (при условии, что 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'
" - примечание, без трейлинга "/".)