Есть ли способ, которым я могу выполнить рекурсивный анализ двух каталогов, но сравнивать только (в соответствующих местах) файлы, которые соответствуют определенному имени файла или предикату типа файла?
Например, я хотел бы сделать что-то вроде
diff -r dir-a dir-b -filenames *.java, ivy.xml, build.xml
... или даже лучше:
diff -r dir-a dir-b -filetype text
Ясно, что это не обязательно использовать, так diff
как я предполагаю, что заклинание с find
и -exec diff
может также сделать свое дело (я просто не знаю, как генерировать дополнительные пути к файлам в последнем случае).
command-line
find
diff
Маркус Юний Брут
источник
источник
Ответы:
Shellscript
differ-r
Этот шеллскрипт может выполнять рекурсивный анализ двух каталогов, но сравнивать только (в соответствующих местах) файлы, которые соответствуют определенному имени файла или шаблону типа файла.
демонстрация
файлы:
Применение:
Бег
differ-r
:Выполненные
diff
командные строки печатаются зеленым текстом, а выходные данные, если нет совпадений, печатаются с текстом по умолчанию (белым на черном на следующем снимке экрана).rsync
с фильтромЕсли вам не нужно получать какие-либо выходные данные, описывающие разницу, знать только, какие файлы отличаются или отсутствуют (чтобы их
rsync
можно было скопировать), вы можете использовать следующую командную строку.демонстрация
Если вы хотите чистый вывод без комментирования строк и без каталогов, вы можете сделать
grep
вывод следующим образом:Shellscript
rsync-diff
Этот однострочник может быть превращен в основную команду шеллскрипта
rsync-diff
.источник
Поскольку вы упомянули «Понятно, что не обязательно использовать diff»,
Это должно сделать работу для вас сливаться легко настраиваются для каких типов файлов игнорировать:
более того, другой альтернативой было бы написать простой скрипт, который перенесет из белого списка в черный список, а затем черный список будет передан в diff с
--exclude
опцией.источник
С поддержкой команд подстановки оболочки вы можете использовать следующую однострочную строку (как уже отмечалось @JammingThebBits):
Это работает так:
find
ищите файлы, которые вас не интересуют,sed
извлекают базовое имя (работаетbasename
очень медленно, если у вас много файлов) и помещают их во временный файл; такой файл затем передается наdiff
указание исключить их из сравнения (двойное исключение = включение).Если у вас нет подстановки команд, поместите
sed
вывод в файл и явно передайте егоdiff
.В примере, который я искал только для файлов XML и JAVA, измените их при необходимости, разделив их OR.
источник