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

Включать только файлы, соответствующие данному шаблону, в рекурсивном режиме

Как вы можете выполнить рекурсивный diff файлов в двух каталогах (a и b):

$ diff -r a b

но посмотрите только файлы, имя которых соответствует заданному шаблону. Например, используя тот же синтаксис, доступный в команде find, это будет выглядеть так:

$ diff -r a b -name "*crazy*"

который будет показывать различия между файлами с тем же именем и путем в и b, которые имеют "сумасшедшие" в их имени.

Фактически, я ищу противоположную опцию --exclude, которая доступна в diff.

4b9b3361

Ответ 1

Возможно, это немного косвенно, но это должно сработать. Вы можете использовать find, чтобы получить список файлов, которые не соответствуют шаблону, а затем "исключить" все эти файлы:

find a b -type f ! -name 'crazy' -printf '%f\n' | diff -r a b -X -

-X - сделает diff прочитанным шаблоны из stdin и исключит все, что соответствует. Это должно работать, если в ваших файлах нет таких забавных символов, как * или ?. Единственный недостаток заключается в том, что ваш diff не будет включать команду find, поэтому указанная команда diff не так полезна.

(Я тестировал его только с GNU find и diff).

ИЗМЕНИТЬ

Поскольку только не-GNU find не имеет -printf, в качестве альтернативы можно использовать sed:

find a b -type f ! -name '*crazy*' -print | sed -e 's|.*/||' | diff -X - -r a b

Это также предполагает, что не-GNU diff имеет -X, который я не знаю.