Выполнение:
diff -r -X <ignore-list> <src-dir> <dest-dir>
кажется, не делает diff
игнорировать записи, <ignore-list>
если они имеют форму <dir>/<file>
.
Записи в форме <file
> все же учитываются. Это проблема, поскольку у меня может быть несколько файлов с именами <file>
в разных подкаталогах, некоторые из которых я не хочу игнорировать.
Похоже, в справочной странице не так много информации о синтаксисе шаблонов diff
. Из того, что я могу сказать, это просто базовое имя файла, который рассматривается diff (см. Http://forums.gentoo.org/viewtopic-t-889788-start-0.html, если вам интересно).
diff
«s--exclude
вариант так хреново ...Ответы:
Списки каталогов должны работать; например, вот что я использовал в сценарии (при условии, что GNU diff),
... который игнорирует содержимое
.svn
и.git
dirs, но также и отдельные файлы с именем*.zip
/*.gz
/ etc.Редактировать: чтобы отфильтровать пути формы,
dir_a/file1
но все жеdiff
файлы с одинаковым базовым именем, например,dir_b/file1
илиdir_a/b/file1
, необходимо создать список файловdiff
(например, с помощьюfind
) и файл для сравнения, полученный из этих путей; например, учитываявы генерируете список файлов для сравнения, исключая, например,
*/a/2.txt
но сравнивая другие файлы с именами2.txt
. Просто "найдите" все файлы, кромеONE/a/2.txt
(здесь также можно использовать регулярное выражение, например.*/a/2.txt
)который фактически игнорирует
ONE/a/2.txt
(иTWO/a/2.txt
), но сравнивает другие файлы с именем2.txt
:Редактировать: Или, более весело с
find
(дополнительное удовольствие оставлено как упражнение для читателя), выберите файлы или каталоги для исключения, а затемdiff
все остальное:Приведенный выше пример исключает конкретный файл "{top} /a/2.txt", любой каталог с именем "b" и все остальное diff'd. (Вместо простого "
-name b
" вы также можете использовать "-regex '.*/b'
" - обратите внимание, без трейлинга "/".)источник
exclude
шаблоны сопоставляются с базовым именем файла (согласно gnu.org/software/diffutils/manual/html_node/… ); пути не будут работать (как вfoo/bar.txt
). Для этого вам, вероятно, придется запуститьfind
список имен файлов и определить путь к файлу для сравнения.diff
, вместо того, чтобы просто использоватьbasename
find
, если входные данныеdiff
содержат каталог, он будет проходить и сравнивать файлы в этом каталоге, и некоторые из этих файлов, возможно, придется игнорировать .... так что вы обратно на площадь 1.У меня была такая же проблема, поэтому я создал патч для
diff
. Патч еще не принят, но вы можете создать свою собственную версиюdiff
с патчем или установить на Arch Linux с пакетом AUR .Вот это
diff
патч.источник
Чтобы исключить каталог
directory/sub-directory
, я используюОднако, хотя это должно работать для одного исключения, это не должно быть возможным для длинного списка игнорирования, как у вас.
источник
источник