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

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

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

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

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

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

 sancho.s13 окт. 2017 г., 13:38
 def25 июл. 2018 г., 21:31
Итак, вы пытаетесь различать файлы определенного типа или исключать эти файлы из различий? Вопрос не соответствует описанию ..

Ответы на вопрос(8)

Отсутствие дополнительного --include делает необходимым использование таких запутанных эвристических шаблонов, как

*.[A-Zb-ik-uw-z]*

найти (в основном) файлы Java!

Если вы хотите различать источники и делать это просто:

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

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

Взято из (версии) справочной страницы:

-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

где exclude.pats:

*.jpg
*.JPG
*.xml
*.XML
*.png
*.gif
 John16 янв. 2014 г., 17:19
Вы можете найти все расширения файлов в вашей папке, кроме расширения <my-ext>, с помощью следующей командной строки:find . -type f -not -name '*.<my-ext>' | xargs -I% basename '%' | awk -F . 'NF > 1 { print "*." $NF}; NF == 1 { print $NF }' | sort | uniq > exclude.pats
 eruve13 мая 2017 г., 04:29
Хотелось бы, чтобы я заметил комментарий Джона ранее, но на macOs / bash я пришел к аналогичному решению для создания файла исключения с несколькими шаблонами для сохранения:find . -not -name "*.c" -and -not -name "*.h" -and -type f -print0 | xargs -0 basename | grep -E '.*\..+' | sed 's/\./\//g' | xargs basename | xargs printf '*.%s\n' | sort | uniq > X-FILE Я хочу верить, что это помогает, может быть, и в Linux. (В этом примере один-name "*.[ch]" это нормально, но это не очень показательно)
Решение Вопроса

Вы можете указать-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». Эта опция игнорирует любые файлы или подкаталоги, базовые имена которых соответствуют шаблону оболочки PATTERN. В отличие от оболочки, точка в начале базы имени файла совпадает с подстановочным знаком в начале шаблона. Вы должны заключить PATTERN в кавычки, чтобы оболочка не расширяла его. Например, опция-x '*. [ao]' игнорирует любой файл, имя которого заканчивается на «.a» или «.o».

Эта опция накапливается, если вы укажете ее более одного раза. Например, используя параметры-x 'RCS' -x '*, v' игнорирует любой файл или подкаталог с базовым именем «RCS» или оканчивается на «, v».

 alumi30 дек. 2013 г., 11:46
Мой (Ubuntu 10.04) не имеет этих строк. Я тоже пытался, и это не сработало. Я думаю, это новая версия.

В случае, если вы считаете это удобным, вы можете использовать следующееMakefile, Просто запустите: «сделать патч»

#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

Отсутствие дополняющего - включает в себя ...

Мы можем сделать один обходной путь, исключить файл со всеми файлами, кроме того, что мы хотим включить. Таким образом, мы создаем 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 
 Sérgio22 авг. 2019 г., 15:26
спасибо за улучшение!
 mmacvicar04 мая 2016 г., 20:21
Супер полезный однострочник, спасибо. На Mac OSX grep немного отличается и становитсяfind PATH1/ -type f | grep --text -v -e "php$" -e html$" | sed 's/.*\///' | sort -u > file1 diff PATH1/ PATH2/ -rq -X file1

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

diff --brief DIR1 DIR2 | grep tmpl

Вы также можете использовать find с -exec для вызова diff:

cd /destination/dir/1
find . -name *.xml -exec diff {} /destination/dir/2/{} \;

Ваш ответ на вопрос