Korzystam z następującego polecenia, ale nie jest ono wykonywane rekurencyjnie:
find . -name *.java
Wiem, że pliki java znajdują się dalej w bieżącym katalogu, ale wykonuje tylko find
w bieżącym katalogu. Używam OS X, 10.9.
Korzystam z następującego polecenia, ale nie jest ono wykonywane rekurencyjnie:
find . -name *.java
Wiem, że pliki java znajdują się dalej w bieżącym katalogu, ale wykonuje tylko find
w bieżącym katalogu. Używam OS X, 10.9.
Odpowiedzi:
Problem polega na tym, że nie podałeś swojego -name
parametru. Zrób to zamiast tego:
find . -name '*.java'
Wyjaśnienie
Bez cudzysłowów powłoka interpretuje ją *.java
jako wzorzec glob i przed przekazaniem go rozwija do dowolnych nazw plików pasujących do glob find
. W ten sposób, gdybyś miał, powiedzmy, foo.java
w bieżącym katalogu, find
rzeczywisty wiersz poleceń wyglądałby następująco:
find . -name foo.java
co oczywiście spowoduje wyświetlenie listy plików tylko w bieżącym katalogu (chyba że zdarzy się, że będziesz mieć pliki o podobnych nazwach w dalszej części drzewa).
Cytowanie zapobiega ekspansji globu i przekazuje wiersz poleceń do stanu „ find
jak jest”.
Nawiasem mówiąc, gdyby glob nie pasował (brak *.java
plików w bieżącym katalogu), dostaniesz jedno z dwóch zachowań w zależności od tego, jak twoja powłoka jest skonfigurowana do obsługi globów, które nie pasują (jest to regulowane przez nullglob
opcję w Bash , na przykład):
find
(przypadkowo, pamiętajcie) wykaże prawidłowe zachowanie.find
narzeka, że brakuje mu argumentu -name
.Miałem podobną sytuację, w której otaczałem wartość -name w cudzysłowie, ale nadal nie otrzymywałem wszystkich trafień znalezienia, na które liczyłem. Doszedłem do wniosku, że dzieje się tak z powodu dowiązań symbolicznych i na pewno tak było. Jeśli chcesz wymusić szukanie poprzez przeszukiwanie dowiązań symbolicznych, możesz zmodyfikować polecenie w następujący sposób:
find -L . -name '*.java'
-follow
jest bardziej czytelnym synonimem -L
, pod warunkiem, że umieścisz go przed innymi parametrami.
Escape the *
find . -name \*.java