Warum Backslash vor Sternchen in "find"?

9

In diesem Befehl:

find . -name \*.pyc -delete

Warum wird vorher ein Backslash benötigt *.pyc?

Ram Rachum
quelle
Die Manpage für findsollte einen Abschnitt NON-BUGSmit einem ähnlichen Beispiel und einer Erklärung enthalten, warum dies erforderlich ist.
Brian

Antworten:

19

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
devnull
quelle
@ RamRachum, aber mehr Zeichen beim Tippen.
Paul Draper
1
@PaulDraper Lesbar und weniger fehleranfällig> Kürzer durch einen Tastendruck
Türknauf
Einfache Anführungszeichen sind der richtige Weg. Ich hätte nie gedacht, dass Sie den Backslash auf diese Weise nutzen könnten ...
Floris
4

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.pyc
  • bar.pyc

Dann *.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.

slhck
quelle