W tym poleceniu:
find . -name \*.pyc -delete
Dlaczego wcześniej potrzebny jest odwrotny ukośnik *.pyc?
W tym poleceniu:
find . -name \*.pyc -delete
Dlaczego wcześniej potrzebny jest odwrotny ukośnik *.pyc?
Odpowiedzi:
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
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.pycbar.pycNastę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.
findpowinna mieć sekcję wywoływanąNON-BUGSz czymś podobnym jako przykład i wyjaśnienie, dlaczego jest potrzebna.