Поиск строки рекурсивно, пока в текущем каталоге

15

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

Я старался

grep -r -i my_string

и я попробовал это в тестовой папке с двумя крошечными файлами, но это не нашло строку.

Кроме того, есть ли какой-то особый способ определения «содержит» вместо сопоставления всего слова?

Дэвид
источник
3
Попробуйте grep -r -o -i "your_string" *(с "кавычками).
pl1nk
я получаю несколько сообщений об отказе в разрешении, он просто игнорирует эти файлы, но продолжает проверять остальные?
Дэвид
Да, эти файлы игнорируются.
pl1nk

Ответы:

27

Вы ищете имя файла или слово внутри файла? grep ищет в файлах, что, кажется, то, что вы хотите.

grep использует регулярные выражения - фактически это то, что означает часть re. Таким образом, он не использует обычные символы подстановки bash; то есть, abc*он не найдет слова, начинающиеся с abc, он найдет слова, начинающиеся с ab, затем ноль или более с. Но да, если вы просто дадите ему образец, он найдет его где угодно, без знания целых слов. Если вы хотите найти целые слова, вам нужно создать регулярное выражение, чтобы сказать это.

Но, как и большинство команд, вам нужно поставить имя файла (ов) в конце команды, так что ваш пример будет просто сидеть и ждать имя файла.

Как сказал @plink, используйте

grep -r -o -i "your_string" *

(или *.*, или другие спецификации файлов). Ошибки могут быть проигнорированы. Если вы получаете много ошибок, вы можете добавить 2>/dev/nullв конец, что перенаправит stderr на нулевое устройство.

Марти Фрид
источник
6
Для любопытных: -r означает рекурсивный (то есть он просматривает текущую папку и ВСЕ папки в текущей папке И все папки в этой папке ..... до бесконечности), -o означает, что не показывает всю строку, и -i игнорировать регистр.
BKSpurgeon
@johnsnails Бэктик не нужен. Скорее всего, это ошибка форматирования в Stack Exchange при публикации в виде встроенного блока кода.
tom_mai78101
Да, это имеет смысл.
Johnsnails