57

find . -type f -print -exec cat {} \; | grep some string

Команда выше не печатает путь к файлу.

Я использую: Ubuntu, bash 4 .

5 ответов5

94

я использую

grep "some string" . -R

и это работает быстрее

п.с.

Более сложный вариант использования

grep -HiRE "some string|other string" . #H for file printing, i for case-insensitive, R for recursive search, E for regex 

Читать параграф и объяснение

grep --help | grep -- -i
72

Это потому, что вы подаете grep поток текста, который, как оказалось, содержит имена файлов. Так как вы не указали имена файлов в качестве аргументов для grep, нельзя ожидать, что он определит, из какого файла получена совпадающая строка. Используйте xargs:

find . -type f -print | xargs grep "some string"

Поскольку у вас есть GNU find/xargs, для xargs это более безопасный способ чтения имен файлов:

find . -type f -print0 | xargs -0 grep "some string"

Если вы хотите только имена файлов, которые имеют совпадающую строку, но не показывают совпадающую строку:

find . -type f -print0 | xargs -0 grep -l "some string"
9

Я часто ищу исходный код в сложных структурах папок и считаю полезным использование:

cd /your/folder/
grep -rHino "your string"

С этими параметрами, не используя find, я получаю полный путь к файлу и номер строки, которая содержит указанную строку.

Это также легко запомнить, потому что это BASH проходит через ваш поиск как носорог :)

Я покажу, как это работает, на быстром примере.

Давайте отобразим содержимое файла, используя cat:

jeeves ~ # cat fw.stop
#!/bin/sh
echo "Stopping firewall and allowing everyone..."
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

И давайте рекурсивно ищем все файлы, содержащие строку «iptables -P»:

jeeves ~ # grep -rinHo "iptables -P"
fw.stop:9:iptables -P
fw.stop:10:iptables -P
fw.stop:11:iptables -P

Как вы можете видеть в выводе, у нас есть имя файла: строка попаданий: искомая строка

Вот более подробное описание используемых параметров:

-r Для каждого операнда каталога рекурсивно читать и обрабатывать все файлы в этом каталоге. Перейдите по символическим ссылкам в командной строке, но пропустите символические ссылки, которые встречаются рекурсивно. Обратите внимание, что если файловый операнд не задан, grep ищет рабочий каталог. Это то же самое, что и опция --directories = recurse.

-i Распечатать имя файла для каждого совпадения. Это значение по умолчанию, когда для поиска требуется более одного файла.

-n Префикс каждой строки вывода с номером строки на основе 1 в своем входном файле. (-n определяется POSIX.)

-H Распечатать имя файла для каждого совпадения. Это значение по умолчанию, когда для поиска требуется более одного файла.

-o Печать только совпадающих (непустых) частей совпадающих строк, каждая из которых находится на отдельной выходной строке. В выходных строках используются те же разделители, что и для ввода, а разделители являются нулевыми байтами, если также используется -z (--null-data) (см. Другие параметры).

1

я предпочел

| найти файл | make grep ont find file | показать полный путь к файлу

find / -type f -exec grep 'some string' {} \; -exec echo {} \;

0

Silver Searcher - это очень быстрый и удобный инструмент для поиска файлов и контента.

Чтобы решить вашу проблему, команда поиска серебра должна выглядеть следующим образом ...

ag 'some string' -l

-l только имена файлов, содержащие совпадения (не печатать совпадающие строки)

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