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

  • Bun la includerea notei de versiune. Cu BSD grep produce: grep: warning: recursive search of stdin

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 cu grep -r foo * este că shell glob * nu ' t extindeți pentru a include directoare / fișiere ascunse, cu excepția cazului în care dotglob a fost setat cu shopt -s dotglob. Încercați cu grep -r foo . și dvs. ' Voi vedea directoarele ascunse sunt traversate de grep. Sau încercați cu shopt -s dotglob și apoi cu grep -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

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" {} \+ 

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *