Suoritan seuraavaa komentoa, mutta sitä ei suoriteta rekursiivisesti:
find . -name *.java
Tiedän, että nykyisessä hakemistossa on alaspäin Java-tiedostoja, mutta se suorittaa find
vain nykyisessä hakemistossa. Käytän OS X: ää, 10.9.
Vastaa
Ongelmana on, ettet lainannut -name
-parametri. Tee tämä sen sijaan:
find . -name "*.java"
Selitys
Ilman lainausmerkkejä kuori tulkitsee *.java
glob-malliksi ja laajentaa sen kaikkiin globaalia vastaaviin tiedostonimiin ennen sen välittämistä find
. Tällä tavalla, jos sinulla olisi, esimerkiksi, foo.java
nykyisessä hakemistossa, find
”: n todellinen komentorivi olisi:
find . -name foo.java
joka ilmeisesti listaa tiedoston vain nykyiseen hakemistoon (ellei sinulla satunnaisesti ole samankaltaisia nimiä tiedostot puun alapuolella).
Lainaus estää globaalin laajentumisen ja siirtää komentorivin sellaisenaan find
sellaisenaan.
Muuten, jos maapallo ei ollut täsmää (ei *.java
tiedostoja nykyisessä hakemistossa tory), saat yhden kahdesta käyttäytymistavasta sen mukaan, miten komentotulkkisi on asetettu käsittelemään maapalloja, jotka eivät sovi yhteen (tätä ohjaa esimerkiksi Bashin nullglob
-vaihtoehto) ):
- Jos kuori ei laajenna maapalloa, joka ei täsmää,
find
käyttäytyy (vahingossa, huomioi). - Jos kuori laajentaa globaalia, joka ei täsmää,
find
valittaa, että siltä puuttuu argumentti-name
.
vastaus
Minulla oli samanlainen tilanne, kun ympäröin -nimi-arvo lainausmerkeissä, mutta ei silti saanut kaikkia toivottuja löytöosumia. Oletin, että se johtui symlinkeistä ja tosiaan niin. Jos haluat pakottaa löydön etsimään symlinkkien kautta, voit muokata komentoa seuraavasti:
find -L . -name "*.java"
Kommentit
Vastaa
Pakene *
find . -name \*.java
-follow
on luettavampi synonyymi-L
, kunhan laitat sen muiden parametrien eteen.