как выполнить операцию grep для всех файлов в каталоге


219

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

Я четко знаю, какую команду я хочу использовать, и как вывести строку (строки) по мере необходимости.

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

Ответы:


228

grep $PATTERN *было бы достаточно. По умолчанию grep пропускает все подкаталоги. Тем не менее, если вы хотите просмотреть их, grep -r $PATTERN *это так.


37
"grep -r $ PATTERN." достаточно. Для рекурсивного grep вам не нужно указывать все файлы
Cougar

1
Как включить несколько расширений? Например. "* .cpp", "* .h"?
Томаш Зато - Восстановить Монику

1
@ Томаш Zato, просто поставить все ваши шаблоны файлов вместо *: grep $PATTERN *.cpp *.h. Если вам нужны более конкретные правила, какие файлы должны быть обработаны, используйте findкоманду (проверьте ответ Роба).
Umi

@umi Если я запускаю grep -r x .результаты приходят из всех файлов всех расширений. Если я бегу, grep -r x *.scssя не получаю результатов.
Крис

1
@ Крис, возможно, у вас нет *.scssфайлов в текущем каталоге, но где-то глубже в подкаталогах, поэтому grep не просматривает все нужные вам файлы. Вы должны использовать --includeопцию, чтобы сказать grep рекурсивно искать файлы, которые соответствуют определенным шаблонам: grep -r x --include '*.scss' . (обратите внимание на кавычки, они предотвращают расширение шаблона оболочкой). Или просто используйте find(см. Ответ Роба).
Umi

169

В Linux я обычно использую эту команду для рекурсивного поиска определенного текста в директории

grep -rni "string" *

где,

r = рекурсивный, т. е. поиск в подкаталогах в текущем каталоге
n = для вывода номеров строк в стандартный вывод
i = поиск без учета регистра


32

Используйте поиск. Серьезно, это лучший способ, потому что тогда вы действительно можете увидеть, над какими файлами он работает:

find . -name "*.sql" -exec grep -H "slow" {} \;

Обратите внимание, что -H специфичен для mac, он показывает имя файла в результатах.


7
Если вы решите использовать поиск, передача по выводу, xargsа не использование -execэтого будет намного быстрее, потому что -execпорождает новый процесс для каждого grep, и накладные расходы становятся значительными с большим количеством файлов. Стандартные предупреждения о пробелах в именах файлов применяются к xargs.
Бартон Читтенден

2
Как это будет выглядеть точно? Я всегда забываю xargsсинтаксис.
Брайан Петерсон

3
@BrianPeterson это было бы что-то вроде этого:find . -iname "*.sql" -print0 | xargs -0 grep "slow"
MediaVince

4

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

Например, рекурсивный поиск в текущем каталоге для текста в * .yml и * .yaml:

grep "text to search" -r . --include=*.{yml,yaml}

1

Если вы хотите сделать несколько команд, вы можете использовать:

for I in `ls *.sql`
do
    grep "foo" $I >> foo.log
    grep "bar" $I >> bar.log
done
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.