Jeg vil gerne liste de filer rekursivt og entydigt, der indeholder det givne ord.
Eksempel : At kontrollere ordet “check”, jeg normalt gør er en grep
$ grep check * -R
Men da der er mange forekomster af dette ord, får jeg en masse output. Så jeg skal bare liste de filnavne, der indeholder det givne søgeord. Jeg antager, at et trick med find
og xargs
ville være nok her, men ikke sikker.
Har du nogen ideer?
Svar
Brug -l
eller --files-with-matches
option, der er dokumenteret som følger:
Undertryk normal output; Udskriv i stedet navnet på hver inputfil, hvorfra output normalt ville være blevet udskrevet. Scanningen stopper ved den første kamp. (
-l
er specificeret af POSIX.)
Så for dit eksempel kan du bruge følgende:
$ grep check * -lR
Kommentarer
Svar
find . -type f -exec grep -l check {} +
Du vil sandsynligvis ikke bruge -R
som med moderne versioner af GNU grep
følger symlinks ved nedadgående mapper. Brug -r
i stedet der, som siden version 2.12 (april 2012) ikke længere følger symlinks.
Hvis din grep ikke er GNU-en, eller er ældre end version 2.12, eller hvis du har brug for din kode for at være bærbar til ikke-blødende GNU-systemer, skal du bruge find
-kommandoen ovenfor.
Ellers kan du gøre:
grep -rl check .
Brug ikke *
(da det ville udelade skjulte filer i den aktuelle mappe (og kun i den aktuelle mappe) og ville forårsage problemer for filer, hvis navn starter med en -
), undgå at sende muligheder efter argumenter, da det ikke er garanti teed til at arbejde afhængigt af miljøet og er ikke bærbar.
Svar
Prøv dette:
find . -type f | xargs grep -c check $1 | grep -v ":0"
Hvad angår grep
flag …
-c
returner et filnavn efterfulgt af: og et tal, der angiver, hvor mange gange søgestrengen vises i den givne fil.
-v
tager output fra den første grep
søg, filtrer filerne ud med nul resultater, og udskriv kun filerne med ikke-nul resultater.
Kommentarer
- Dette får en falsk negativ, hvis du har fil (er) (eller instruktør (er)), hvis navne indeholder
:0
. Det ' er bedre at gøregrep -v ':0$'
. Selv det vil kvæle stier, der indeholder nye linier.
Svar
grep -lR "text-to-find" <where-to-find>
fungerer også fint.
f.eks. grep -lR "NAVIGATE" .
hvor vi finder ordet NAVIGATE
i .
i den aktuelle mappe.
Svar
grep -rin “whatToFind” locationToFInd
f.eks. $ grep -rin “vihaan”.
søger og lister rekursivt på filnavne og de tilsvarende linjer, der har “vihaan” i sig, “.” henviser til den aktuelle mappe.
Svar
find . -type f | grep "keyword" *
søgning i den aktuelle mappe. For at slå op fra rod skal du angive /
i stedet for .
Svar
grep -rli trim \` find . -name *.q \`
Giv dig listen over .q
filer indeholder nøgleordet trim
grep -rl "text to find" "/usr/share"
og det fungerede godt!