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.

G-Man говорит: «Восстанови Монику»
источник
5
find /path -iname "*.h" -exec grep -inH "string" "{}" \;
Ипор Сирсер
источник
1
-exec... +тоже хорошо.
G-Man говорит: «Восстановите Монику»
1
Я просто заметил - ты забыл включить "string"в свой ответ!
G-Man говорит: «Восстановите Монику»
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, это спецификатор конца команды
Dominique
источник
1
Как "*.h"работает? Я бы подумал, что это нужно'*.h'
Джо
Я всегда работаю с двойными кавычками, я не думаю, что это имеет значение.
Доминик
0

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

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

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

plnu
источник