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). ):
- Ha a héj nem terjeszti ki a nem egyező globust, akkor a
find
(véletlenül, ne feledje) helyes viselkedést mutat. - 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
Válasz
Meneküljön a *
find . -name \*.java
-follow
a-L
olvashatóbb szinonimája, amennyiben a többi paraméter elé állítja.