Как вы различаете каталог только для файлов определенного типа? - PullRequest
78 голосов
/ 23 сентября 2010

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

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

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

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

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

Ответы [ 8 ]

84 голосов
/ 23 сентября 2010

Вы можете указать -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'.

19 голосов
/ 23 сентября 2010

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

-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
7 голосов
/ 25 апреля 2016

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

cd /destination/dir/1
find . -name *.xml -exec diff {} /destination/dir/2/{} \;
4 голосов
/ 22 августа 2015

Отсутствие дополняющего --include ....

Мы можем сделать один обходной путь, исключить файл со всеми файлами, кроме того, что мы хотим включить. Таким образом, мы создаем 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 
2 голосов
/ 24 июля 2018

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

diff --brief DIR1 DIR2 | grep tmpl

2 голосов
/ 29 октября 2013

Если вам это удобно, вы можете использовать следующее 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
1 голос
/ 19 мая 2014

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

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

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

1 голос
/ 06 декабря 2013

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...