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