Перечислите файлы, содержащие определенное слово в их тексте

30

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

Пример : проверяя слово 'check', я обычно выполняю команду grep

$ grep check * -R

Но так как это слово встречается много раз, я получаю много информации. Поэтому мне просто нужно перечислить имена файлов, которые содержат данное слово для поиска. Я предполагаю, что какой-то трюк findи xargsбудет достаточно здесь, но не уверен.

Любые идеи?

холодный морской тропический воздух
источник

Ответы:

39

Используйте параметр -lили, --files-with-matchesкоторый задокументирован следующим образом:

Подавить нормальный выход; вместо этого напечатайте имя каждого входного файла, из которого обычно выводился бы вывод. Сканирование остановится при первом совпадении. ( -lопределяется POSIX.)

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

$ grep check * -lR
Н.Н.
источник
Работает на MSYS тоже. Большой!
Кос,
2
Я использовал, grep -rl "text to find" "/usr/share"и это работало отлично!
Shrout1
18
find . -type f -exec grep -l check {} +

Вы, вероятно, не хотите использовать -Rопцию, которая в современных версиях GNU grepследует по символическим ссылкам при спуске каталогов. -rВместо этого используйте параметр, который начиная с версии 2.12 (апрель 2012 г.) больше не следует символическим ссылкам.

Если ваш grep не является GNU-версией или старше версии 2.12, или если ваш код должен быть переносимым на системы без кровотечения-GNU, используйте приведенную findвыше команду.

В противном случае вы можете сделать:

grep -rl check .

Не используйте *(так как это исключит скрытые файлы в текущем каталоге (и только в текущем каталоге) и вызовет проблемы для файлов, имя которых начинается с a -), избегайте передачи параметров после аргументов, так как это не гарантированно будет работать в зависимости от среда и не является переносимым.

Стефан Шазелас
источник
1

Попробуй это:

find . -type f | xargs grep -c check $1 | grep -v ":0"

Что касается grepфлагов ...

-c вернет имя файла с последующим: и число, указывающее, сколько раз строка поиска появляется в данном файле.

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

brightwellcd
источник
Это приведет к ложному отрицанию, если у вас есть файл (ы) (или директор (ы)), чьи имена содержат :0. Это лучше сделать grep -v ':0$'. Даже это захлебнется путями, которые содержат символы новой строки.
Скотт
0

grep -rin "whatToFind" locationToFInd

например, $ grep -rin "vihaan".

будет рекурсивно искать и перечислять имена файлов и соответствующие строки, в которых есть "vihaan", "." ссылается на текущий каталог.

Вихан Верма
источник
0
find . -type f | grep "keyword" *

поиск в текущем каталоге. Для поиска из корня укажите /вместо.

Манираж Джориге
источник
0

grep -lR "text-to-find" <where-to-find> тоже отлично работает.

например, grep -lR "NAVIGATE" .где мы находим слово NAVIGATEв .в текущем каталоге.

imsrgadich
источник
-2
 grep -rli trim \` find . -name *.q \` 

Дайте вам список .qфайлов, содержащий ключевое словоtrim

Митхун
источник