Как мне рекурсивно просмотреть список файлов, в которых есть одна строка и, в частности, нет другой строки? Кроме того, я имею в виду поиск внутри файлов, а не имен файлов.
2 ответа
Вы можете использовать найти:
find . -type f -name "$fileglob" -exec grep -q $word1 {} \; -not -exec grep -q $word2 {} \; -print
Предполагая, что вы действительно хотите строку, а не регулярное выражение, то есть 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 поиск параметров в любых следующих параметрах, поэтому даже если у вас есть имя файла, начинающееся с -
, оно все равно будет обрабатываться как имя файла.