Возможно, это не соответствует ожидаемым результатам из-за фильтра grep. Как насчет этого:find . -type f -fprint /dev/stderr -exec cat {} \; | grep some string
artistoex
Какую цель вы хотите достичь? На выходе вы получаете grep строки из файлов, вы хотите путь этих файлов?
Миркобранкович
Да, я хочу напечатать путь к файлам, которые содержат строку «некоторая строка». Предложение @artistoex выводит все пути к файлам.
Х.Раби
Вы можете просто захотеть использовать ackgrep для просмотра всех файлов в текущем каталоге, возможно, фильтруя только определенные типы файлов.
Яап Старейшина
Ответы:
87
Это потому, что вы передаете grepпоток текста, который просто содержит имена файлов. Так как вы не указали имена файлов в качестве аргументов для grep, нельзя ожидать, что из этого файла будет получена совпадающая строка. Используйте xargs:
find .-type f -print | xargs grep "some string"
Поскольку у вас есть GNU find / xargs, для xargs это более безопасный способ чтения имен файлов:
find .-type f -print0 | xargs -0 grep "some string"
Если вы хотите только имена файлов, которые имеют совпадающую строку, но не показывают совпадающую строку:
Как вы можете видеть в выводе, у нас есть имя файла: строка попаданий: искомая строка
Вот более подробное описание используемых параметров:
-r Для каждого операнда каталога рекурсивно читать и обрабатывать все файлы в этом каталоге. Перейдите по символическим ссылкам в командной строке, но пропустите символические ссылки, которые встречаются рекурсивно. Обратите внимание, что если файловый операнд не задан, grep ищет рабочий каталог. Это то же самое, что и опция --directories = recurse.
-i Распечатать имя файла для каждого совпадения. Это значение по умолчанию, когда для поиска требуется более одного файла.
-n Префикс каждой строки вывода с номером строки на основе 1 в своем входном файле. (-n определяется POSIX.)
-H Распечатать имя файла для каждого совпадения. Это значение по умолчанию, когда для поиска требуется более одного файла.
-o Печать только совпадающих (непустых) частей совпадающих строк, каждая из которых находится на отдельной выходной строке. В выходных строках используются те же разделители, что и для ввода, а разделители являются нулевыми байтами, если также используется -z (--null-data) (см. Другие параметры).
find . -type f -fprint /dev/stderr -exec cat {} \; | grep some string
ack
grep для просмотра всех файлов в текущем каталоге, возможно, фильтруя только определенные типы файлов.Ответы:
Это потому, что вы передаете
grep
поток текста, который просто содержит имена файлов. Так как вы не указали имена файлов в качестве аргументов для grep, нельзя ожидать, что из этого файла будет получена совпадающая строка. Используйтеxargs
:Поскольку у вас есть GNU find / xargs, для xargs это более безопасный способ чтения имен файлов:
Если вы хотите только имена файлов, которые имеют совпадающую строку, но не показывают совпадающую строку:
источник
sed '...' $(find ... | xargs grep -l ...)
я использую
и это работает быстрее
п.с.
Более сложный вариант использования
Читать параграф и объяснение
источник
-n
если вы хотите номера строк. +1 за упрощенный ответ.Я часто ищу исходный код в сложных структурах папок и считаю полезным использование:
С этими параметрами, не используя find , я получаю полный путь к файлу и номер строки, которая содержит указанную строку .
Это также легко запомнить, потому что это BASH проходит через ваш поиск как носорог :)
Я покажу, как это работает, на быстром примере.
Давайте отобразим содержимое файла, используя cat:
И давайте рекурсивно ищем все файлы, содержащие строку «iptables -P»:
Как вы можете видеть в выводе, у нас есть имя файла: строка попаданий: искомая строка
Вот более подробное описание используемых параметров:
источник
я предпочел
| найти файл | make grep ont find file | показать полный путь к файлу
find / -type f -exec grep 'some string' {} \; -exec echo {} \;
источник
Silver Searcher - это очень быстрый и удобный инструмент для поиска файлов и контента.
Чтобы решить вашу проблему, команда поиска серебра должна выглядеть следующим образом ...
ag 'some string' -l
-l
Печатать только имена файлов, содержащие совпадения (не печатать совпадающие строки)источник