Лістинг каталогів повинен працювати; наприклад, ось що я використав у сценарії (припустимо, що gnu diff),
diff -r \
--exclude="*~" \
--exclude=".svn" \
--exclude=".git" \
--exclude="*.zip*" \
--exclude="*.gz" \
--exclude="*.tar" \
...etc
... який ігнорує вміст .svnта .gitdirs, а також окремі файли з ім’ям *.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", а все інше - розрізнено. (Замість простого " -name b" ви також можете використати " -regex '.*/b'" - зауважте, немає трейлінгу "/".)
diff«s--excludeваріант так хреново ...