Как использовать grep для поиска в текущем каталоге любых файлов, содержащих строку «hello», и отображения только файлов .h и .cc?
Как использовать grep для поиска в текущем каталоге любых файлов, содержащих строку «hello», и отображения только файлов .h и .cc?
Ответы:
grep -r --include=*.{cc,h} "hello" .
Это гласит: рекурсивный поиск (также во всех подкаталогах) всех файлов .cc ИЛИ .h, содержащих "hello" в этом .
(текущем) каталоге.
Вы можете использовать подстановочные знаки вместо указания имен файлов или использования стандартного ввода.
grep hello *.h *.cc
-R
сожалению, добавление не работает. Он расширяет *
до рекурсивного выполнения.
find . -name \*.cc -print0 -or -name \*.h -print0 | xargs -0 grep "hello"
.
Проверьте страницы руководства find
и xargs
для деталей.
-print0
после, '*.cc'
иначе у вас не будет действия для этой части поиска. Или вы должны вставить скобки там: find . \( -name '*.cc' -or -name '*.h' \) -print0
.
find -exec +
синтаксис вместо xargs
-exec grep "hello" {} +
пара скобок представляет имя (имена) файла. Хорошее предложение.
Если вам нужен рекурсивный поиск, у вас есть множество вариантов. Вы должны подумать ack
.
В противном случае, если у вас есть GNU find
и xargs
:
find . -name '*.cc' -print0 -o -name '*.h' -print0 | xargs -0 grep hello /dev/null
Использование /dev/null
гарантирует, что имена файлов будут напечатаны; -print0
и -0
сделок с именами файлов , содержащих пробелы (символы перевода строки и т.д.).
Если у вас нет громких имен (с пробелами и т. Д.), Вы можете использовать:
find . -name '*.*[ch]' -print | xargs grep hello /dev/null
Это может привести к появлению нескольких имен, которые вы не планировали, потому что сопоставление с образцом нечеткое (но более простое), но в остальном работает. И он работает с версиями find
и, отличными от GNU xargs
.
find ... -exec grep "hello" {} +
Если я внимательно прочитал ваш вопрос, вы просите «grep искать в текущем каталоге все файлы, содержащие строку« hello », и отображать только файлы .h и .cc». Итак, чтобы удовлетворить ваши точные требования, вот мое заявление:
Это отображает имена файлов:
grep -lR hello * | egrep '(cc|h)$'
... и это отобразит имена и содержимое файлов:
grep hello `grep -lR hello * | egrep '(cc|h)$'`
grep -l hello **/*.{h,cc}
Возможно, вы захотите shopt -s nullglob
избежать сообщений об ошибках, если нет файлов .h или .cc.
Самый простой способ: grep -Ril "Ваш текст" /
grep -si "hello" --include=*.{cc,h} ./* ./.*
(также ищет скрытые файлы). Вот общая версия для поиска строки во всех файлах / скрытых:grep -s "hello" * .*
. Может быть , наиболее вообще полезно (и самый простой), это поиски все не-скрытые файлы «привет»:grep -si "hello" ./*
Благодаря этому сообщению: askubuntu.com/a/777456