2013-07-02 09:24:45 +0000 2013-07-02 09:24:45 +0000
83
83

Поиск файлов, содержащих определенную строку, с помощью find (1) и grep (1)

Команда find . -type f -print -exec cat {} \; | grep some string

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

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

Ответы (5)

117
117
117
2013-07-02 12:01:16 +0000

Я использую

grep "some string" . -R

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

p.s.

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

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

Читать параметр i объяснение

grep --help | grep -- -i
98
98
98
2013-07-02 10:02:41 +0000

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

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"
14
14
14
2014-09-26 13:24:22 +0000

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

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

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

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

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

Давайте отобразим содержимое файла с помощью 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

Как видно из вывода, у нас есть filename:hit row:search string

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

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

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

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

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

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

2
2
2
2015-10-28 19:03:56 +0000

Я предпочитаю

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

найдите / -type f -exec grep ‘some string’ {} \; -exec echo {} \;

0
0
0
2018-10-22 16:15:38 +0000

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

Для решения вашей проблемы команда серебряного поиска будет выглядеть так….

ag 'some string' -l

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