@Gilles: Te pytania i odpowiedzi są znacznie bardziej przejrzyste i mniej zlokalizowane niż duplikat - jeśli jedno z nich powinno zostać zamknięte, to drugie.
złotowłosa
Odpowiedzi:
88
Problem polega na tym, że nie podałeś swojego -nameparametru. Zrób to zamiast tego:
find .-name '*.java'
Wyjaśnienie
Bez cudzysłowów powłoka interpretuje ją *.javajako 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.javaw bieżącym katalogu, findrzeczywisty 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 „ findjak jest”.
Nawiasem mówiąc, gdyby glob nie pasował (brak *.javaplikó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 nullglobopcję w Bash , na przykład):
Jeśli glob, który nie pasuje, nie zostanie rozwinięty przez powłokę, find(przypadkowo, pamiętajcie) wykaże prawidłowe zachowanie.
Jeśli glob, który nie pasuje, zostanie rozwinięty przez powłokę w pusty ciąg, findnarzeka, ż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:
Odpowiedzi:
Problem polega na tym, że nie podałeś swojego
-name
parametru. Zrób to zamiast tego: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 globfind
. W ten sposób, gdybyś miał, powiedzmy,foo.java
w bieżącym katalogu,find
rzeczywisty wiersz poleceń wyglądałby następująco: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 przeznullglob
opcję w Bash , na przykład):find
(przypadkowo, pamiętajcie) wykaże prawidłowe zachowanie.find
narzeka, że brakuje mu argumentu-name
.źródło
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:
źródło
-follow
jest bardziej czytelnym synonimem-L
, pod warunkiem, że umieścisz go przed innymi parametrami.Escape the
*
źródło