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 find
wykonaniem. (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 *.pyc
była cytowana.
Idealnie powinieneś cytować glob:
find . -name '*.pyc' -delete
Zanim powłoka wyda find
polecenie, 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 *.pyc
rozwinął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.
find
powinna mieć sekcję wywoływanąNON-BUGS
z czymś podobnym jako przykład i wyjaśnienie, dlaczego jest potrzebna.