Jeg vil gjerne liste opp filene rekursivt og unikt som inneholder det gitte ordet.
Eksempel : Å sjekke om ordet «sjekk», jeg gjør normalt sett en grep
$ grep check * -R
Men da det er mange forekomster av dette ordet, får jeg mye utgang. Så jeg trenger bare å liste opp filnavnene som inneholder det gitte søkeordet. Jeg antar at noe triks med find
og xargs
vil være tilstrekkelig her, men ikke sikker.
Noen ideer?
Svar
Bruk -l
eller --files-with-matches
alternativ som er dokumentert som følger:
Undertrykk normal utgang; i stedet skriver du ut navnet på hver inndatafil som utdata normalt ville blitt skrevet ut fra. Skanningen stopper ved første kamp. (
-l
er spesifisert av POSIX.)
Så for eksempelet ditt kan du bruke følgende:
$ grep check * -lR
Kommentarer
Svar
find . -type f -exec grep -l check {} +
Du vil sannsynligvis ikke bruke alternativet -R
som med moderne versjoner av GNU grep
følger symlenker når kataloger synker. Bruk alternativet -r
i stedet der som siden versjon 2.12 (april 2012) ikke lenger følger symlinker.
Hvis grep ikke er GNU-en, eller er eldre enn versjon 2.12, eller hvis du trenger koden din for å være bærbar til ikke-blødende GNU-systemer, bruk find
kommando ovenfor.
Ellers kan du gjøre:
grep -rl check .
Ikke bruk *
(da det ville utelate skjulte filer i den gjeldende katalogen (og bare i den gjeldende katalogen) og ville forårsake problemer for filer hvis navn starter med en -
), unngå å sende alternativer etter argumenter som det ikke er garanti tenkt å jobbe avhengig av miljøet og er ikke bærbar.
Svar
Prøv dette:
find . -type f | xargs grep -c check $1 | grep -v ":0"
Når det gjelder grep
flaggene …
-c
vil returner et filnavn etterfulgt av: og et tall som indikerer hvor mange ganger søkestrengen vises i den gitte filen.
-v
tar utdata fra den første grep
søk, filtrer ut filene med null resultater, og skriv ut bare filene med resultater som ikke er null.
Kommentarer
- Dette får en falsk negativ hvis du har fil (er) (eller regissør (er)) hvis navn inneholder
:0
. Det ' er bedre å gjøregrep -v ':0$'
. Selv det vil kveles av stienavn som inneholder nye linjer.
Svar
grep -lR "text-to-find" <where-to-find>
fungerer også bra.
f.eks. grep -lR "NAVIGATE" .
der vi finner ordet NAVIGATE
i .
i gjeldende katalog.
Svar
grep -rin «whatToFind» locationToFInd
f.eks $ grep -rin «vihaan».
vil rekursivt søke og liste opp filnavn og de tilsvarende linjene som har «vihaan» i seg, «.» refererer til gjeldende katalog.
Svar
find . -type f | grep "keyword" *
søk i gjeldende katalog. For å slå opp fra roten, spesifiser /
i stedet for .
Svar
grep -rli trim \` find . -name *.q \`
Gi deg listen over .q
filer inneholder nøkkelordet trim
grep -rl "text to find" "/usr/share"
og det fungerte bra!