Execut următoarea comandă, dar nu este executată recursiv:
find . -name *.java
Știu că există fișiere java mai jos în directorul curent, dar acesta efectuează find
numai în directorul curent. Folosesc OS X, 10.9.
Răspuns
Problema este că nu v-ați citat -name
parametru. Faceți acest lucru în schimb:
find . -name "*.java"
Explicație
Fără ghilimele, shell-ul interpretează *.java
ca un model glob și îl extinde la orice nume de fișiere care corespund globului înainte de a-l trece la find
. În acest fel, dacă ați avea, spuneți, foo.java
în directorul curent, find
ar fi:
find . -name foo.java
care evident ar fi listat fișierul numai în directorul curent (cu excepția cazului în care aveți unele nume similare) fișiere mai jos în copac).
Citarea împiedică extinderea globului și trece linia de comandă la find
așa cum este.
De altfel, dacă globul nu a reușit să se potrivească (nu există fișiere *.java
în direcția curentă tory), veți obține unul dintre cele două comportamente, în funcție de modul în care shell-ul dvs. este configurat pentru a gestiona globuri care nu se potrivesc (aceasta este guvernată de opțiunea nullglob
din Bash, de exemplu ):
- Dacă un glob care nu se potrivește nu este extins de shell,
find
va prezenta (din greșeală, atenție) un comportament corect. - Dacă un glob care nu se potrivește este extins într-un șir gol de către shell,
find
se va plânge că lipsește un argument pentru-name
.
Răspuns
Am avut o situație similară în care înconjurau -numește valoarea în ghilimele, dar tot nu obținea toate accesările de căutare pe care le speram. Am conjecturat că a fost din cauza legăturilor simbolice și a fost destul de sigur că a fost cazul. Dacă doriți să forțați căutarea pentru a căuta prin link-uri simbolice, puteți modifica comanda la următoarele:
find -L . -name "*.java"
Comentarii
Răspuns
Evadare *
find . -name \*.java
-follow
este un sinonim mai lizibil pentru-L
, atâta timp cât îl puneți în fața celorlalți parametri.