Как вы различаете каталог только для файлов определенного типа?
У меня есть вопрос о команде diff
если я хочу рекурсивный каталог diff, но только для определенного типа файла, как это сделать?
Я попытался использовать опцию exclude, но могу использовать только один шаблон:
$ diff /destination/dir/1 /destination/dir/2 -r -x *.xml
с помощью команды я могу исключить только тип файла xml, даже если есть файлы в типе образа папки (png
, gif
, jpg
), txt
, php
и т.д.
как различать только определенные типы файлов.
Ответы
Ответ 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, если вы хотите получить файлы, которые существуют только в одном из путей.