Как вы отличаете каталог только для файлов определенного типа?
у меня есть вопрос о команде diff если мне нужен рекурсивный каталог diff, но только для определенного типа файла, как это сделать?
Я попытался использовать опцию exclude, но могу использовать только один шаблон:
$ diff /destination/dir/1 /destination/dir/2 -r -x *.xml
С помощью команды я могу исключить только тип файла xml, даже если в папке есть файлы типа изображения (png
,gif
,jpg
),txt
,php
, etc
как различать только определенные типы файлов.
8 ответов:
вы можете указать
-x
несколько раз.diff -x '*.foo' -x '*.bar' -x '*.baz' /destination/dir/1 /destination/dir/2
из раздела сравнение каталогов
info diff
(на моей системе, я должен сделатьinfo -f /usr/share/info/diff.info.gz
):чтобы игнорировать некоторые файлы при сравнении каталогов, используйте ' - x PATTERN' или '--exclude=PATTERN ' опция. Этот параметр игнорирует любые файлы или подкаталоги, базовые имена которых соответствуют шаблону оболочки. В отличие от оболочки, точка в начале базы имени файла соответствует шаблону в начало картины. Вы должны вложить Шаблон в кавычках, чтобы оболочка не расширяла его. Например, вариант - x'*.[АО]' игнорирует любой файл, имя которого заканчивается '.А ' или '.o'.
эта опция накапливается, если вы указываете ее более одного раза. Для например, с помощью опции - x ' RCS '- x'*, v' игнорирует любой файл или подкаталог, базовое имя которого 'RCS' или заканчивается ',v'.
взято из (версии) man-страницы:
-x PAT --exclude=PAT Exclude files that match PAT. -X FILE --exclude-from=FILE Exclude files that match any pattern in FILE.
так это выглядит
-x
принимает только один шаблон, как вы сообщаете, но если вы поместите все шаблоны, которые вы хотите исключить в файл (предположительно по одному на строку) , вы можете использовать второй флаг следующим образом:$ diff /destination/dir/1 /destination/dir/2 -r -X exclude.pats
где исключить.пэц это:
*.jpg *.JPG *.xml *.XML *.png *.gif
отсутствие дополнительного --включить ... .
мы можем сделать один обходной путь, исключить файл со всеми файлами, но то, что мы хотим включить. Поэтому мы создаем file1 с поиском всех файлов, которые не имеют расширений, которые мы хотим включить, sed поймать имя файла и просто : diff --exclude-from=file1 PATH1 / PATH2/, пример:
find PATH1/ -type f | grep --text -vP "php$|html$" | sed 's/.*\///' | sort -u > file1 diff PATH1/ PATH2/ -rq -X file1
вы также можете использовать find with-exec для вызова diff:
cd /destination/dir/1 find . -name *.xml -exec diff {} /destination/dir/2/{} \;
отсутствие комплементарного -- include делает необходимым использование таких запутанных эвристических шаблонов, как
*.[A-Zb-ik-uw-z]*
чтобы найти (в основном) java файлы!
Если вам удобно, вы можете использовать следующее
Makefile
. Просто запустите: "make patch"#Makefile for patches #Exlude following file endings SUFFIX += o SUFFIX += so SUFFIX += exe SUFFIX += pdf SUFFIX += swp #Exlude following folders FOLDER += bin FOLDER += lib FOLDER += Image FOLDER += models OPTIONS = Naur patch: rm test.patch diff -$(OPTIONS) \ $(foreach element, $(SUFFIX) , -x '*.$(element)') \ $(foreach element, $(FOLDER) , -x '$(element)*') \ org/ new/ > test.patch unpatch: rm test.unpatch diff -$(OPTIONS) \ $(foreach element, $(SUFFIX) , -x '*.$(element)') \ $(foreach element, $(FOLDER) , -x '$(element)*') \ new/ org/ > test.unpatch