A következő parancsot futtatom, de azt nem rekurzív módon hajtják végre:

find . -name *.java 

Tudom, hogy vannak java fájlok lentebb az aktuális könyvtárban, de a find fájlt csak az aktuális könyvtárban hajtja végre. OS X 10.9-es rendszert használok.

Válasz

A probléma az, hogy nem idézte a -name paraméter. Tegye ezt helyette:

find . -name "*.java" 

Magyarázat a következőhöz: find. Így, ha mondjuk foo.java lenne az aktuális könyvtárban, find “tényleges parancssora a következő lenne:

find . -name foo.java 

amely nyilvánvalóan csak az aktuális könyvtárban sorolja fel a fájlt (hacsak nem véletlenül hasonló nevűek vannak) fájlok a fán lejjebb).

Az idézet megakadályozza a globális kiterjesztést, és átadja a parancssort a find nek. amint van.

Egyébként, ha a glob nem tudott egyezni (nincsenek *.java fájlok az aktuális tory), akkor a két viselkedés egyikét kapná attól függően, hogy a shell hogyan van beállítva a nem megfelelő globusok kezelésére (ezt például a Bash nullglob opciója szabályozza). ):

  1. Ha a héj nem terjeszti ki a nem egyező globust, akkor a find (véletlenül, ne feledje) helyes viselkedést mutat.
  2. Ha egy “t” nem egyező globust a héj üres karakterlánccá bővít, a find panaszkodni fog, hogy hiányzik neki egy argumentum a -name.

Válasz

Hasonló helyzetem volt, amikor körülvettem a -name érték idézőjelben, de még mindig nem kapta meg az összes remélt találati találatot. Sejtettem, hogy a hivatkozások miatt történt, és bizony ez volt a helyzet. Ha rá akarja kényszeríteni a keresést, hogy a szimbolikus linkek között keresgéljen, módosíthatja a parancsot a következőkre:

find -L . -name "*.java" 

Megjegyzések

  • A linkek is az én kérdésem voltak. A -follow a -L olvashatóbb szinonimája, amennyiben a többi paraméter elé állítja.
  • Remek ! Nagyon köszönöm!! +1!

Válasz

Meneküljön a *

find . -name \*.java 

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük