находить и отображать имена файлов только с найденным шаблоном
16
Я много использовал это, улучшение, которого я пытаюсь достичь, - это избегать имен эхо-файлов, которые не совпадают в grep. Лучший способ сделать это?
for file in `find . -name "*.py"`; do echo $file; grep something $file; done
будет печатать имя файла перед каждой соответствующей строкой (мы добавляем /dev/nullдля случая, когда есть только один соответствующий файл, поскольку grepон не печатает имя файла, если передается только один файл для просмотра. В реализации GNU grepесть -Hопция для этого как альтернатива).
find .-name '*.py'-exec grep -l something {}+
будет печатать только имена файлов, которые имеют хотя бы одну совпадающую строку.
Чтобы напечатать имя файла перед соответствующими строками, вы можете использовать вместо этого awk:
Или вызовите grepдважды для каждого файла - хотя это было бы менее эффективно, так как при этом выполнялась бы как минимум одна grepкоманда и до двух для каждого файла (и дважды читалось содержимое файла):
В зависимости от версии GNU grep, grepможет или не может заглянуть внутрь символических ссылок или пройти символические ссылки на каталоги. Вы также можете найти некоторые вариации в обработке других типов нестандартных файлов.
Стефан
5
Вы можете указать grep включить имя файла в вывод. Так что, если есть совпадение, оно будет показано на консоли; если в файле нет совпадений, для этого файла не будет напечатано ни одной строки.
find . -name "*.py" | xargs grep -n -H something
Из man grep:
-H Always print filename headers with output lines
-n, --line-number
Each output line is preceded by its relative line number in the file, starting at line 1. The line number counter is reset for each file processed.
This option is ignored if -c, -L, -l, or -q is specified.
Если в ваших файлах могут быть имена с пробелами, вам нужно переключить канал, чтобы использовать символы NUL в качестве разделителя. Полная команда теперь будет выглядеть так:
Существуют grepальтернативы, которые по умолчанию выводят свои результаты в нужном формате. 2 самых популярных из них, которые я знаю ag(ака "серебряный искатель") и ack. agрекламируется как более быстрая альтернатива ack.
Я не могу показать вам здесь, но результат аккуратно раскрашен. Я получаю имена файлов оливково-зеленого цвета, номера строк - золотисто-желтого цвета, а соответствующие фрагменты в каждой строке - кроваво-красного цвета. Цвета настраиваются, хотя.
Ответы:
напечатает имя файла после соответствующих строк.
будет печатать имя файла перед каждой соответствующей строкой (мы добавляем
/dev/null
для случая, когда есть только один соответствующий файл, посколькуgrep
он не печатает имя файла, если передается только один файл для просмотра. В реализации GNUgrep
есть-H
опция для этого как альтернатива).будет печатать только имена файлов, которые имеют хотя бы одну совпадающую строку.
Чтобы напечатать имя файла перед соответствующими строками, вы можете использовать вместо этого awk:
Или вызовите
grep
дважды для каждого файла - хотя это было бы менее эффективно, так как при этом выполнялась бы как минимум однаgrep
команда и до двух для каждого файла (и дважды читалось содержимое файла):В любом случае, вы не хотите зацикливаться на выводе
find
подобного, и не забывайте заключать в кавычки ваши переменные .Если вы хотите использовать цикл оболочки с инструментами GNU:
(также работает на FreeBSD и его производных).
источник
Если вы используете GNU grep, вы можете использовать его
-r
или--recursive
опцию, чтобы сделать этот простой поиск для вас:Вам нужно только
find
если вам нужны более продвинутые предикаты.источник
grep
,grep
может или не может заглянуть внутрь символических ссылок или пройти символические ссылки на каталоги. Вы также можете найти некоторые вариации в обработке других типов нестандартных файлов.Вы можете указать grep включить имя файла в вывод. Так что, если есть совпадение, оно будет показано на консоли; если в файле нет совпадений, для этого файла не будет напечатано ни одной строки.
Из
man grep
:Если в ваших файлах могут быть имена с пробелами, вам нужно переключить канал, чтобы использовать символы NUL в качестве разделителя. Полная команда теперь будет выглядеть так:
источник
Вы можете попробовать что-то вроде:
Эта команда exec grep для каждого файла, обнаруженного командой find и ее стандартной функцией find
источник
Используйте
-l
аргумент.Более находчивое использование будет:
источник
Существуют
grep
альтернативы, которые по умолчанию выводят свои результаты в нужном формате. 2 самых популярных из них, которые я знаюag
(ака "серебряный искатель") иack
.ag
рекламируется как более быстрая альтернативаack
.Я не могу показать вам здесь, но результат аккуратно раскрашен. Я получаю имена файлов оливково-зеленого цвета, номера строк - золотисто-желтого цвета, а соответствующие фрагменты в каждой строке - кроваво-красного цвета. Цвета настраиваются, хотя.
источник