Как использовать 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