Як поєднувати пошук і grep для рекурсивного пошуку str або str2 у файлах * .html та * .php з / home / smith / sourcecode?


2

Як я можу комбінувати findта grepшукати str1або str2рекурсивно у всіх * .html та * .php файлах, починаючи з каталогу з іменем / home / smith / source? У висновку потрібно лише перелічити файли (з контуром), а не фактично збігається рядок. Я пробував безліч варіантів без успіху. Існує маса прикладів того, як це зробити для одного шаблону файлів або однієї рядки, але не для декількох шаблонів файлів та декількох рядків - рекурсивно .

linux  bash  search  grep  find 

Відповіді:


4

Інші - все правильно, але в сучасній версії грепу, на мою думку, це надмірно. Далі буде рекурсивно сканувати лише файли з розширеннями .html або .php та повертати ім'я файлу з контуром кожного файлу, принаймні один рядок, який відповідає str1 або str2. Зауважте, що повторювані -eпараметри дозволяють конкретизувати декілька шляхів без використання синтаксису регулярних виразів.

grep -r --files-with-match --include ' .html' --include ' .php' -e str1 -e str2 / home / smith / source

Один інструмент, один процес, без зайвого розгортання чи сканування невідповідних файлів. Просто потрібна відносно недавня версія gnu grep для параметра --include, якщо цього не доведеться робити багатоступеневий греп, як запропоновано іншими.


3
egrep 'string1|string2' /home/smith/source/*.{html,php}

або реєструючись у будь-який тип файлу рекурсивно всередині каталогу,

egrep -R 'string1|string2' /home/smith/source

Ви можете поєднати це з іншим вибухом у трубі:

egrep -R 'string1|string2' /home/smith/source | egrep '.html|.php'

1

Використання egrepта використання | щоб вказати str1 або str2-:

find /home/smith/source -name \*.html -o -name \*.php -exec egrep -H 'str1|str2' {} \;

Це показує відповідність тексту, а не назви файлів, але це нормально (я зробив оновлення питань, ймовірно, поки ви відповідали на існуючий). Як я можу це узагальнити, якщо хочу шукати 3,4,5 або n шаблонів файлів?

-H варіант egrep, потім для виведення файлових шляхів. str1 | str2 | str3..etc працював би - це те, що ви маєте на увазі під узагальненням?
підозрюваний

Так, але я також мав на увазі узагальнити шаблон файлу (наприклад, * .php та * .html та * .txt та ...). Це здається, що це робиться:find /home/smiths/source -type f -regextype posix-egrep -regex ".*\.(php|html)$" -exec egrep -H -n "str1|str2|str3" '{}' \;

1

Якщо ви використовуєте ack(див. Http://beyondgrep.com ), ви можете це зробити:

ack --php --html -l 'str1|str2' /home/smith/source

Також повторно реалізовані як ag і rg . Я думаю, що це свідчення її твердості .
користувач2394284

Повторно доповнено кількома різними інструментами, багато з яких перераховані тут : yondgrep.com/more-tools
Енді Лестер

0

Не забувайте, що ваша оболонка набагато зручніша, ніж findякщо ви хочете знайти файли лише по імені!

Bash:

shopt -s nullglob globstar
grep -lE 'str1|str2' /home/smith/source/**/*.{html,php}

Риба:

grep -lE 'str1|str2' /home/smith/source/**.{html,php}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.