Поиск файлов, содержащих определенную строку, с помощью find (1) и grep (1)
Команда find . -type f -print -exec cat {} \; | grep some string
выше не печатает путь к файлу.
Я использую: Ubuntu, bash 4
.
Команда find . -type f -print -exec cat {} \; | grep some string
выше не печатает путь к файлу.
Я использую: Ubuntu, bash 4
.
Я использую
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
Это потому, что вы подаете 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"
Я часто ищу исходный код в сложных структурах папок и нахожу полезным его использование:
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) (см. Другие опции).
Я предпочитаю
| найдите файл |make grep ont find file | покажите полный путь к файлу
найдите / -type f -exec grep ‘some string’ {} \; -exec echo {} \;
Silver Searcher очень быстро и удобно используется для поиска файлов и контента.
Для решения вашей проблемы команда серебряного поиска будет выглядеть так….
ag 'some string' -l
-l
Печатайте только имена файлов, которые содержат совпадения (не печатайте совпадения строк).