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) ):

  1. Jos kuori ei laajenna maapalloa, joka ei täsmää, find käyttäytyy (vahingossa, huomioi).
  2. 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

  • Symlinkit olivat myös ongelmani. -follow on luettavampi synonyymi -L, kunhan laitat sen muiden parametrien eteen.
  • Suuri ! Kiitos paljon!! +1!

Vastaa

Pakene *

find . -name \*.java 

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *