In diesem Befehl:
find . -name \*.pyc -delete
Warum wird vorher ein Backslash benötigt *.pyc
?
In diesem Befehl:
find . -name \*.pyc -delete
Warum wird vorher ein Backslash benötigt *.pyc
?
Antworten:
Ein nicht zitierter Glob würde von der Shell erweitert, bevor er find
ausgeführt wird. (Siehe Dateinamenerweiterung im Handbuch.)
Also sagen:
find . -name *.pyc -delete
würde tatsächlich ausführen:
find . -name file1.pyc file2.pyc file3.pyc -delete
Angenommen, das aktuelle Verzeichnis enthält 3 .pyc-Dateien und führt stattdessen zu einem Fehler.
Ein Backslash lässt die Shell den Glob weiterleiten find
, dh sie verhält sich so , als ob *.pyc
sie zitiert würde.
Idealerweise sollten Sie einen Glob zitieren:
find . -name '*.pyc' -delete
Bevor Ihre Shell den find
Befehl ausgibt , werden verschiedene Erweiterungen durchgeführt . Dabei werden auch Sonderzeichen (oder Zeichen mit besonderer Bedeutung) verarbeitet, wobei *
es sich um einen Platzhalter handelt - ein Globbing-Zeichen. Dies ist die sogenannte Dateinamenerweiterung.
Angenommen, Sie haben zwei Dateien in Ihrem Verzeichnis:
foo.pyc
bar.pyc
Dann *.pyc
würde auf beide Namen erweitert. Also, wenn Sie schreiben:
find . -name *.pyc -delete
dann ruft die Shell tatsächlich auf:
find . -name foo.pyc bar.pyc -delete
Das macht nicht viel Sinn, weil man nur ein Argument dafür haben kann -name
. Deshalb müssen Sie dem Sonderzeichen entkommen, um zu verhindern, dass es von der Shell interpretiert wird. Sie tun dies, indem Sie einen Backslash-Escape-Vorgang ausführen oder ihn alternativ zitieren.
find
sollte einen AbschnittNON-BUGS
mit einem ähnlichen Beispiel und einer Erklärung enthalten, warum dies erforderlich ist.