Найти строку только в определенном файле внутри подкаталогов

10

Допустим, мне нужно найти функцию GetTypes()во всех исходных файлах C # ( .cs) в каталогах / подкаталогах.

Я использовал grep -rn GetTypes *.cs, но я получил ошибку с grep: *.cs: No such file or directory. Я должен был использовать grep -rn GetTypes *, но в этом случае он показывает все файлы не *.csтолько.

Какую команду мне нужно использовать, чтобы найти строку только в .csфайлах?

prosseek
источник
Возможен ли дубликат поиска подстроки в файлах в подкаталогах с помощью одной встроенной команды?
Жиль "ТАК - перестань быть злым"

Ответы:

12

Если ваша оболочка bash ≥4, вставьте shopt -s globstarвашу ~/.bashrc. Если ваша оболочка Zsh, вы в порядке. Тогда вы можете запустить

grep -n GetTypes **/*.cs

**/*.csозначает, что все файлы, совпадающие *.csв текущем каталоге или в его подкаталогах, рекурсивно.

Если вы не используете оболочку, которая поддерживает, **но ваш grep поддерживает --include, вы можете сделать рекурсивный grep и сказать, grepчтобы рассматривать только файлы, соответствующие определенным шаблонам. Обратите внимание на кавычки вокруг шаблона имени файла: он интерпретируется grep, а не оболочкой.

grep -rn --include='*.cs' GetTypes .

Только с переносными инструментами (некоторые системы вообще не имеют grep -r), используйте findдля части обхода каталога и grepдля части текстового поиска.

find . -name '*.cs' -exec grep -n GetTypes {} +
Жиль "ТАК - перестань быть злым"
источник
Для временного сета globstarвариант для текущей Баш 4+ оболочки, использование: shopt -s globstar.
tjanez
8

Вы должны проверить маленький добрый grep / найти замену, известную как ack. Это специально для поиска по каталогам файлов исходного кода.

Ваша команда будет выглядеть так:

ack --csharp GetTypes
Калеб
источник
4

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

grep --include '*.cs' -rn GetTypes .

(где последний период обозначает текущий рабочий каталог как корень обхода)

maxschlepzig
источник
4

Я использую комбинацию find и grep:

find . -name "*.cs" | xargs grep "GetTypes" -bn --color=auto

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

Для grep, -bnнапечатает позицию и номер строки и --colorпоможет вашим глазам, выделив то, что вы ищете.

Kevin
источник