Urmând sfatul de la această întrebare, pot să recursiv grep pentru un șir string
în conținutul unui anumit director dir
după cum urmează
grep -r --exclude-dir=".*" string dir
Cu toate acestea, atunci când aplic acest lucru directorului curent, ca
$ grep -r --exclude-dir=".*" string . $
nu obțin rezultate, deoarece --exclude-dir=".*"
opțiunea omite directorul curent ca fiind ascuns, deoarece se potrivește cu ".*"
.
O soluție este să se schimbe în directorul părinte prin cd ..
, apoi executați comanda pe copilul corespunzător, apoi cd
din nou în acel director de lucru original. Trebuie să existe o singură comandă pe care să o pot folosi pentru a face acest lucru fără schimbarea directoarelor.
Ce este o singură comandă pentru conținutul grep din directorul curent, omițând conținutul directoarelor ascunse?
Răspuns
Dacă utilizați GNU grep 2.11 sau o versiune ulterioară, -r
va începe din directorul curent dacă nu este specificat niciun director:
grep -r --exclude-dir=".*" string
Comentarii
Răspuns
În shell glob (cunoscut și ca modele de nume de fișier), .
nu are o semnificație specială, *
înseamnă zero sau mai multe caractere și ?
înseamnă orice caracter unic.
Ce doriți să excludeți este un punct urmat de cel puțin unul caracter și apoi orice număr de caractere. Așadar, utilizați:
grep -r --exclude-dir=".?*" string .
Răspuns
Deoarece bash
nu va fi grep
traversat directoare ascunse în mod implicit (adică fără dotglob
activat:
$ tree -a . ├── .test │ ├── .file │ └── file ├── file └── test ├── .file └── file 2 directories, 5 files $ grep -r foo * file:foo test/.file:foo test/file:foo
Excludeți doar fișierele ascunse:
$ grep --exclude=".*" -r foo * file:foo test/file:foo
Comentarii
- Sunt curios cu privire la raționamentul din spatele votului negativ necomentat.
- Nu ' nu am votat în jos, dar ' nu este adevărat că
grep
nu ' nu traversează directoare ascunse. Ceea ce ' Vedeți cugrep -r foo *
este că shell glob*
nu ' t extindeți pentru a include directoare / fișiere ascunse, cu excepția cazului în caredotglob
a fost setat cushopt -s dotglob
. Încercați cugrep -r foo .
și dvs. ' Voi vedea directoarele ascunse sunt traversate de grep. Sau încercați cushopt -s dotglob
și apoi cugrep -r foo *
. - Punct corect; Am clarificat acest lucru în răspunsul meu.
- Aceasta va căuta în continuare fișiere în directoare ascunse cuprinse în argumentele din linia de comandă. Va funcționa . În majoritatea cazurilor, s-ar putea să fie în regulă, dar ' seamănă cu definirea " pi " ca " 3.1416 " mai bine cunoașteți avertismentele.
Răspuns
De asemenea, puteți specifica directorul curent folosind $(pwd)
like:
grep -r --exclude-dir=".*" string "$(pwd)"
Comentarii
- Citați înlocuirea comenzii:
"$(pwd)"
Vezi și De ce scriptul meu shell se îneacă de pe spațiul alb sau alte caractere speciale?
Răspuns
Pentru a recurse în interiorul unui unic director (fără a limita subdirectorii fișierele ascunse) utilizați:
Deoarece echo dir/*
va imprima toate fișierele din dir, acesta va funcționa pentru fișierele din unele dir:
$ grep -r "string" $(echo dir/*)
trebuie doar să schimbați dir
în .
(punct) și veți obține exact ceea ce doriți:
$ grep -r "string" $(echo ./*)
Dacă este necesar să nu existe fișiere ascunse în niciunul dintre subdirectoare, folosiți:
$ grep -r --exclude-dir=".*" "string"
Sau utilizați find:
find . -not -path "*/\.*" -type f -exec grep "string" {} \+
grep
produce:grep: warning: recursive search of stdin