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