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 findausgefü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 *.pycsie zitiert würde.
Idealerweise sollten Sie einen Glob zitieren:
find . -name '*.pyc' -delete
Bevor Ihre Shell den findBefehl 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.pycbar.pycDann *.pycwü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.
findsollte einen AbschnittNON-BUGSmit einem ähnlichen Beispiel und einer Erklärung enthalten, warum dies erforderlich ist.