Grep в файлах с определенным расширением в каталоге


11

Есть ли команда, которая позволяет искать ключевое слово в файлах в каталоге с определенным расширением?

Строка grep -irn "string" ./pathдает рекурсивный поиск всех файлов в каталоге ./path. Мое конкретное требование - искать во всех файлах ./pathс таким расширением, как*.h

Ответы:


11

После некоторых испытаний, я думаю, grep -irn 'string' --include '*.h'это более удобно


1
Если вы собираетесь сделать это, не забудьте поставить "*.h"в кавычки.
G-Man говорит: «Восстановите Монику»

Это работает с и без кавычек
Джину Джейкоб

3
Теперь это так. Попробуйте создать файл с именем foobar.hв текущем каталоге и повторите попытку.
G-Man говорит: «Восстанови Монику»

10

S и др (включить) ш ELL неавтоматического ионов globstarс помощью команды

    shopt -s globstar

Это приведет к тому, **что компонент имени файла будет означать все здесь и ниже. Так path/**значит все в pathкаталоге и его подкаталогах . (Вам не нужно вводить ./здесь.) Тогда вы можете использовать

grep -in "string" path/**/*.h

искать все .hфайлы в и под path.


Вы можете у nПравильно установите опции с shopt -u.



3

Если вы можете установить что-то на свою машину, я предлагаю использовать ack .

Вы можете делать именно то, что вам нужно, и многое другое. Для вашего случая использования вы можете сделать:

# Depending of your system, you have to use one or the other
ack --hh -i string path
ack-grep --hh -i string path
  • --hh фильтрует файлы h
  • игнорирует дело

Чтобы узнать, какие фильтры файлов поддерживаются изначально, выполните команду ack --help=type.


Есть также ag , бывший клон Ack. Бывший, потому что их наборы функций несколько разошлись.
8bittree

Я не знал, аг. Спасибо, что поделился.
нашей эры

3

Как насчет этого?

find -L ./path -name "*.h" -exec grep -in "string" {} \;

Объяснение:

  • -L: следовать символическим ссылкам
  • -name: используя звездочку, вы можете описать расширения
  • -in: то же, что и ваше предложение, но 'r' заменяется findкомандой
  • {}: это означает результат findкоманды
  • \; : в случае, если вы объединяете findс -exec, это спецификатор конца команды

1
Как "*.h"работает? Я бы подумал, что это нужно'*.h'
Джо

Я всегда работаю с двойными кавычками, я не думаю, что это имеет значение.
Доминик

0

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

grep -irn --include=\*.h "string" path

хотя я не думаю, что это доступно в других greps.

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