3

Как мне рекурсивно просмотреть список файлов, в которых есть одна строка и, в частности, нет другой строки? Кроме того, я имею в виду поиск внутри файлов, а не имен файлов.

2 ответа2

2

Вы можете использовать найти:

find . -type f -name "$fileglob" -exec grep -q $word1 {} \; -not -exec grep -q $word2 {} \; -print
0

Предполагая, что вы действительно хотите строку, а не регулярное выражение, то есть fgrep , тогда:

fgrep -rl --null desired_string . | xargs -0 fgrep -lv undesired_string --

Рекурсивно (-r) grep для desired_string в текущем каталоге, печать имен файлов (-l) и использование имен файлов из этого, многократно вызывать fgrep (чтобы не переполнять пространство для аргументов командной строки при его вызове), с помощью -v инвертируя смысл матча.

При этом используется --null для использования символа ASCII NUL после каждого имени файла вместо новой строки, чтобы можно было обрабатывать имена файлов с пробелами в и т. П .; это погружается в -0 данный xargs. В зависимости от варианта Unix (Linux, BSD и т.д.) Может быть короткая опция --null , но она менее переносима. Строго говоря, --null не является переносимым, но она должна быть у любой современной системы (f).

-- В конце второго (f)grep останавливает (f)grep поиск параметров в любых следующих параметрах, поэтому даже если у вас есть имя файла, начинающееся с - , оно все равно будет обрабатываться как имя файла.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .