Како да се користи grep рекурзивно во одредени екстензии на датотеки


grep е одлична алатка за пребарување низ датотеки и стандардно внесување во Linux и може да одговара на стринг и Regex обрасци. Сепак, понекогаш е неопходно да се контролира какви видови датотеки пребарува grep, и има вградени знаменца за да го прави тоа.

Вклучувајќи само одредени датотеки во grep пребарувањата

Стандардно, grep ќе ги пребарува сите датотеки во дадена папка и нејзините потпапки ако ја повикате со рекурзивното знаменце -r . Ова ќе собере сè, но ако сакате само одредени екстензии, опцијата што сакате да ја користите е --include.

Знамето --include му кажува на grep да вклучува само датотеки што одговараат на одредена шема. Ако е наведено, grep ќе ги третира сите ознаки за вклучување како бела листа. Можете да го користите ова со сите знаци на глоб на Linux, како што се џокерите за да одговараат на сè, вклучително и одредена екстензија:

grep -inr --include \*.txt "foo" ~/folder

Имајте предвид дека ова е избегнато со обратна црта \, бидејќи е можно имињата на датотеките да имаат ѕвездички во нив. Можете исто така да наведете повеќе знаменца --include, на пример, пребарување на сите изворни датотеки HTML, JS и CSS во wwwroot:

grep -inr --include \*.html --include \*.css --include \*.js "foo" ~/folder

Можете исто така да исклучите одредени имиња на датотеки, кои сепак ќе одговараат на сè, освен на глобот, делувајќи како црна листа на врвот на постоечката конфигурација:

grep -inr --exclude \*.txt "foo" ~/folder

Исто така, постои знаме за исклучување на цели директориуми одеднаш:

grep -inr --exclude-dir config "foo" ~/folder

Наместо тоа, се користи Find

Алтернативно, ако претпочитате да ја користите алатката find  за пребарување низ датотеки, можете да ја поврзете со grep со помош на цевки и xargs. find може да пребарува со обрасци и Regex и има голем број предности, вклучително и можност за лесно филтрирање на датотеките врз основа на метаподатоци како што се големината, датумот на креирање и изменување и други идентификатори на Linux.

Командата е малку тапа, бидејќи ќе треба да користите -print0 на крајот од find за да испечатите листа со една линија, а потоа да ја пренесете на xargs -0 и grep од таму.

 find ./ -type f -iname "*.txt" -print0 | xargs -0 grep "foo"