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


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поиска, отфильтрует файлы с нулевыми результатами и распечатает только файлы с ненулевыми результатами.


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

0

grep -rin "whatToFind" locationToFInd

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

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



0

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

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


-2
 grep -rli trim \` find . -name *.q \` 

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.