Поиск в каталоге и подкаталогах по шаблону в файле - PullRequest
2 голосов
/ 03 июня 2011

В linux я хочу найти заданный директой и ее подпапки / файлы для определенного шаблона включения и исключения.

find /apps -exec grep "performance" -v "warn" {} /dev/null \;

Это повторяет множество строк, из которых идет поиск.Я не хочу этого, я хотел бы найти файлы, содержащие производительность, которые не содержат предупреждение.Как мне это сделать?

Ответы [ 4 ]

3 голосов
/ 03 июня 2011

Чтобы найти файлы, содержащие performance, но не warn, перечислите файлы, содержащие performance, а затем отфильтруйте те, которые содержат warn.Вам нужны отдельные вызовы на grep для каждого фильтра.Используйте параметр -l для grep, чтобы он печатал только имена файлов, а не совпадающие строки.Используйте xargs для передачи имен файлов из первого прохода в командную строку второго прохода grep.

find /apps -type f -exec grep -l "performance" /dev/null {} + | 
sed 's/[[:blank:]\"'\'']/\\&/g' |
xargs grep -lv "warn"

(вызов sed в середине происходит потому, что xargsожидает странно заключенный в кавычки формат ввода, который не соответствует тому, что производит любая другая команда.)

3 голосов
/ 03 июня 2011

Очень близко к тому, что у вас уже есть:

find /apps -exec grep "performance" {} /dev/null \; | grep -v "warn"

Просто перенаправьте вывод через второй вызов на grep.

1 голос
/ 03 июня 2011

Использование опции -exec команды find менее эффективно, чем ее конвейеризация на xargs:

find /apps -print0 | xargs -0 grep -n -v "warn" | grep "performance"

Это, вероятно, также решает вашу проблему с печатью нежелательного вывода.Вы также, вероятно, захотите использовать опцию -name для фильтрации определенных файлов.

find /apps -name '*.ext' -print0 | xargs -0 grep -n -v "warn" | grep "performance"
0 голосов
/ 03 июня 2011

Если вы хотите найти файлы, которые вообще не содержат «warn», то grep -v - это не то, что вам нужно - он печатает все строки, не содержащие «warn», но не сообщит вам, что файл (какцелом) не содержит "предупреждение"

find /apps -type f -print0 | while read -r -d '' f; do
    grep -q performance "$f" && ! grep -q warn "$f" && echo "$f"
done
...