Як я можу використовувати grep для пошуку в поточному каталозі будь-яких файлів, що містять рядок "привіт" та відображати лише файли .h та .cc?
Як я можу використовувати grep для пошуку в поточному каталозі будь-яких файлів, що містять рядок "привіт" та відображати лише файли .h та .cc?
Відповіді:
grep -r --include=*.{cc,h} "hello" .
Це означає: пошук рекурсивно (у всіх підкаталогах також) для всіх .cc АБО .h файлів, що містять "привіт" у цій .
(поточній) каталозі
Ви можете передавати підстановку замість вказівки імен файлів або використовувати stdin.
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
Це може вибрати кілька імен, які ви не мали наміру, оскільки відповідність шаблону нечіткіша (але простіша), але в іншому випадку працює. І це працює з не-GNU версіями find
та xargs
.
find ... -exec grep "hello" {} +
Якщо я уважно прочитав ваше запитання, ви попросите "grep шукати в поточному каталозі будь-які файли, що містять рядок" привіт ", і відображатимуть лише .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