У меня есть вопрос о команде diff, если мне нужен рекурсивный каталог diff, но только для определенного типа файла, как это сделать?
Я пробовал использовать опцию exclude, но могу использовать только один шаблон:
$ diff /destination/dir/1 /destination/dir/2 -r -x *.xml
с помощью команды я могу исключить только тип XML - файл, даже если есть файлы типа папки изображений ( png
, gif
, jpg
), txt
, php
и т.д.
как различать только определенные типы файлов.
Ответы:
Вы можете указать
-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 PAT --exclude=PAT Exclude files that match PAT. -X FILE --exclude-from=FILE Exclude files that match any pattern in FILE.
Таким образом, похоже, что при
-x
отправке отчета принимается только один шаблон, но если вы поместите все шаблоны, которые хотите исключить, в файл (предположительно, по одному на строку), вы можете использовать второй флаг следующим образом:где exclude.pats - это:
источник
find . -type f -not -name '*.<my-ext>' | xargs -I% basename '%' | awk -F . 'NF > 1 { print "*." $NF}; NF == 1 { print $NF }' | sort | uniq > exclude.pats
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]"
- это нормально, но это не очень показательно)Вы также можете использовать find с -exec для вызова diff:
cd /destination/dir/1 find . -name *.xml -exec diff {} /destination/dir/2/{} \;
источник
Отсутствие дополнительного - включить ....
Мы можем сделать один обходной путь, исключить файл со всеми файлами, кроме того, что мы хотим включить. Итак, мы создаем
file1
с помощью поиска все файлы, у которых нет расширений, которые мы хотим включить,sed
перехватываем имя файла и просто:Например:
find PATH1/ -type f | grep --text -vP "php$|html$" | sed 's/.*\///' | sort -u > file1 diff PATH1/ PATH2/ -rq -X file1
источник
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
источник
Если вам это удобно, вы можете использовать следующее
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
источник
Отсутствие дополнительного --include заставляет использовать такие запутанные эвристические шаблоны, как
найти (в основном) файлы java!
источник
Если вы хотите использовать разные источники и не усложнять:
diff -rqx "*.a" -x "*.o" -x "*.d" ./PATH1 ./PATH2 | grep "\.cpp " | grep "^Files"
Удалите последний grep, если вы хотите получить файлы, которые существуют только в одном из путей.
источник
Хотя это не позволяет избежать фактического
diff
использования других файлов, если ваша цель - создать файл исправления или что-то подобное, вы можете использовать егоfilterdiff
изpatchutils
пакета, например, для исправления только ваших.py
изменений:diff -ruNp /path/1 /path/2 | filterdiff -i "*.py" | tee /path/to/file.patch
источник