Aș dori să listez fișierele recursiv și unic care conțin cuvântul dat.
Exemplu : Verificând cuvântul „verificare”, normal că este grep
$ grep check * -R
Dar, deoarece există multe apariții ale acestui cuvânt, obțin o mulțime de rezultate. Deci, trebuie doar să listez numele fișierelor care conțin cuvântul de căutare dat. Cred că un truc cu find
și xargs
ar fi suficient aici, dar nu sunt sigur.
Aveți idei?
Răspuns
Utilizați -l
sau --files-with-matches
care este documentată după cum urmează:
Suprimă ieșirea normală; imprimați în schimb numele fiecărui fișier de intrare din care ar fi fost tipărită în mod normal ieșirea. Scanarea se va opri în primul meci. (
-l
este specificat de POSIX.)
Deci, pentru exemplul dvs. puteți utiliza următoarele:
$ grep check * -lR
Comentarii
Răspunde
find . -type f -exec grep -l check {} +
Probabil că nu doriți să utilizați opțiunea -R
care cu versiunile moderne de GNU grep
urmărește legăturile simbolice atunci când coborâți directoare. Utilizați opțiunea -r
acolo, care din versiunea 2.12 (aprilie 2012) nu mai urmărește linkurile simbolice.
Dacă grep-ul dvs. nu este cel GNU sau este mai vechi decât versiunea 2.12 sau dacă aveți nevoie de codul dvs. pentru a fi portabil către sistemele GNU non-bleeding-edge, utilizați find
comanda de mai sus.
În caz contrar, puteți face:
grep -rl check .
Nu utilizați *
(deoarece acest lucru ar omite fișierele ascunse în directorul curent (și numai în directorul curent) și ar provoca probleme pentru fișierele al căror nume începe cu un -
), evitați trecerea opțiuni după argumente ca asta nu este o garanție a funcționat în funcție de mediu și nu este portabil.
Răspuns
Încercați acest lucru:
find . -type f | xargs grep -c check $1 | grep -v ":0"
În ceea ce privește steagurile grep
…
-c
returnează un nume de fișier urmat de: și un număr care indică de câte ori apare șirul de căutare în fișierul dat.
-v
va prelua ieșirea din primul grep
căutați, filtrați fișierele cu zero rezultate și tipăriți doar fișierele cu rezultate diferite de zero.
Comentarii
- Aceasta va primi un negativ fals dacă aveți fișiere (sau director (i)) ale căror nume conțin
:0
. Este ' mai bine să facețigrep -v ':0$'
. Chiar și asta se va sufoca cu nume de cale care conțin linii noi.
Răspuns
grep -lR "text-to-find" <where-to-find>
funcționează bine.
de exemplu, grep -lR "NAVIGATE" .
unde găsim cuvântul NAVIGATE
în .
în directorul curent.
Răspuns
grep -rin „whatToFind” locationToFInd
eg $ grep -rin „vihaan”.
va căuta și lista recursiv numele fișierelor și liniile corespunzătoare care au „vihaan” în ele, „.” se referă la directorul curent.
Răspuns
find . -type f | grep "keyword" *
căutare în directorul curent. Pentru a căuta din rădăcină, specificați /
în loc de .
Răspuns
grep -rli trim \` find . -name *.q \`
Vă oferă lista de fișiere .q
conține cuvântul cheie trim
grep -rl "text to find" "/usr/share"
și a funcționat excelent!