Dlaczego ukośnik odwrotny przed gwiazdką w `find`?

9

W tym poleceniu:

find . -name \*.pyc -delete

Dlaczego wcześniej potrzebny jest odwrotny ukośnik *.pyc?

Ram Rachum
źródło
Strona podręcznika dla findpowinna mieć sekcję wywoływaną NON-BUGSz czymś podobnym jako przykład i wyjaśnienie, dlaczego jest potrzebna.
Brian

Odpowiedzi:

19

Niecytowany glob zostałby rozszerzony przez powłokę przed findwykonaniem. (Patrz Rozszerzenie nazwy pliku w instrukcji.)

Więc mówiąc:

find . -name *.pyc -delete

faktycznie wykonałby:

find . -name file1.pyc file2.pyc file3.pyc -delete

zakładając, że w bieżącym katalogu były 3 pliki .pyc, co spowoduje błąd.

Odwrotny ukośnik powoduje, że powłoka przechodzi przez glob find, tzn. Działa tak, jakby *.pycbyła cytowana.

Idealnie powinieneś cytować glob:

find . -name '*.pyc' -delete
diabelnie
źródło
@RamRachum, ale więcej znaków podczas pisania.
Paul Draper
1
@PaulDraper Czytelny i mniej podatny na błędy> Krótszy o jedno naciśnięcie klawisza
Klamka
Pojedyncze cytaty są najlepszym rozwiązaniem. Nigdy nawet nie myślałem, że możesz użyć odwrotnego ukośnika w ten sposób ...
Floris
4

Zanim powłoka wyda findpolecenie, wykona różne rozszerzenia . Robiąc to, przetwarza również znaki specjalne (lub znaki o specjalnym znaczeniu), gdzie *jest symbolem wieloznacznym - globbing. Jest to tak zwane rozszerzenie nazwy pliku.

Załóżmy, że masz dwa pliki w swoim katalogu:

  • foo.pyc
  • bar.pyc

Następnie *.pycrozwinąłby się do obu nazw. Więc jeśli napiszesz:

find . -name *.pyc -delete

wtedy powłoka faktycznie wywoła:

find . -name foo.pyc bar.pyc -delete

co nie ma większego sensu, ponieważ możesz mieć tylko jeden argument -name. Dlatego musisz uciec od znaku specjalnego, aby zapobiec interpretacji go przez powłokę. Robisz to, uciekając przed ukośnikiem lub alternatywnie, cytując to.

slhck
źródło