2012-10-05 12 views
5

Używam zsh globbing poleceń takich jak:Dlaczego funkcja zsh globbing nie działa z poleceniem find?

vim **/filename 
vim *.html.erb 

i tak dalej, ale po wpisaniu w coś takiego:

find . -name *mobile* 

otrzymuję odpowiedź:

zsh: no matches found: *mobile* 

Dlaczego?

+0

Myślę, że lepiej tu odpowiedzieć: https://unix.stackexchange.com/questions/130958/scp-wildcard-not-working-in-zsh – sttaq

Odpowiedz

29
find . -name *mobile* # does not work 

vs

find . -name '*mobile*' # works 

Różnica wynika z kroków, powłoka zajmuje, gdy analizuje się linii. Zwykle powłoka rozwinie wszelkie symbole wieloznaczne, które znajdzie przed uruchomieniem polecenia. Jednak pojedyncze cudzysłowy oznacza argument jako dosłownym, co oznacza, że ​​powłoka nie wykonuje rozwinięcia wieloznacznego na tym argumencie przed uruchomieniem polecenia.

Aby zademonstrować różnicę, załóżmy, że są w katalogu z następujących plików:

$ tree 
./ 
mobile.1 
dir/ 
    mobile.2 

zsh poszerzy pierwszą formę do następujących przed uruchomieniem go:

find . -name mobile.1 

Czyli find poszuka tylko plików o nazwie dosłownie mobile.1

Drugi formularz zostanie uruchomiony w następujący sposób:

find . -name *mobile* 

Oznacza to, że find będzie szukał nazwy pliku zawierającego ciąg "mobile".

Należy zwrócić uwagę na to, że zarówno zsh, jak i find obsługują tę samą składnię wieloznaczną, ale w tym przypadku chcemy znaleźć obsługę wieloznaczników, a nie zsh.

1

Okazuje się, że wszystko, co musisz zrobić, aby rozwiązać problem jest dodać kilka cytatów wokół wejścia:

find . -name '*mobile*' 

Naprawdę nie ma odpowiedzi, dlaczego właśnie jeszcze ... i dokumentacja nie ma czegoś, co mnie wyróżnia, ale daj mi znać, jeśli znasz odpowiedź!

Powiązane problemy