Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

-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

Ответ 3

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

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

Ответ 4

Отсутствие дополнительного --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 

Ответ 5

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

diff --brief DIR1 DIR2 | grep tmpl

Ответ 6

Если вы считаете это удобным, вы можете использовать следующий 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

Ответ 7

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

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

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

Ответ 8

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

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

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