Как вы отличаете каталог только для файлов определенного типа?


у меня есть вопрос о команде diff если мне нужен рекурсивный каталог diff, но только для определенного типа файла, как это сделать?

Я попытался использовать опцию exclude, но могу использовать только один шаблон:

$ diff /destination/dir/1 /destination/dir/2 -r -x *.xml

С помощью команды я могу исключить только тип файла xml, даже если в папке есть файлы типа изображения (png,gif,jpg),txt,php, etc

как различать только определенные типы файлов.

8 64

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

Если вы хотите, чтобы различные источники и держать его простым:

diff -rqx "*.a" -x "*.o" -x "*.d" ./PATH1 ./PATH2 | grep "\.cpp " | grep "^Files"

удалите последний grep, если вы хотите получить файлы, которые существуют только в одном из путей.

я использовал следующую команду, чтобы найти дифференциалов всех *.tmpl файлы между DIR1 и DIR2. В моем случае это не дало никаких ложных срабатываний, но это может быть для вас, в зависимости от содержимого ваших Дир.

diff --brief DIR1 DIR2 | grep tmpl