Verwenden von doppelten oder keinen Anführungszeichen mit Platzhaltern

Verwenden von doppelten oder keinen Anführungszeichen mit Platzhaltern

Ich bin aufDasArtikel, der versucht, den Befehl find zu erklären. Er gibt ein Beispiel für

find /tmp -iname "data*.txt"

jetzt dieser ArtikelHierbesagt, dass

Doppelte Anführungszeichen verhindern nicht die Ersetzung von Wörtern, die mit "$" beginnenSie unterdrücken jedoch die Erweiterung von Platzhalterzeichen.

Auch als ich die beiden Befehle ausprobierte

admin@localhost Downloads$ ls
gallifrey-road-doctors-14437-1366x768.jpg  mydir
admin@localhost Downloads$ find . -iname "*gall*"
./gallifrey-road-doctors-14437-1366x768.jpg
admin@localhost Downloads$ find . -iname "*gall*"  -----> A
./gallifrey-road-doctors-14437-1366x768.jpg
admin@localhost Downloads$ find . -iname *gall*    -----> B
./gallifrey-road-doctors-14437-1366x768.jpg
admin@localhost Downloads$

Die Ausgabe scheint dieselbe zu sein. In welchem ​​Fall sollten sie unterschiedlich sein? Warum unterdrückt das Anführungszeichen nicht die Erweiterung des Platzhalters in A? Ich hatte den Eindruck, dass A nicht funktionieren würde und nur B funktionieren würde.

Antwort1

Im Fall B:

find . -iname *gall*

DerHülsewird *gall*in eine Liste aller Dateien erweitert, die diesem Muster entsprechen. Da Sie in Ihrem aktuellen Verzeichnis nur eine Datei haben, die diesem Muster entspricht, wird daraus:

find . -iname gallifrey-road-doctors-14437-1366x768.jpg

...also sucht find nach Dateien, die genau diesem Namen entsprechen. foo-gallifrey-road-doctors-14437-1366x768.jpgwürde nicht gefunden werden. Wenn Sie zwei oder mehr Dateien hätten, die mit dem Glob übereinstimmen, würden Sie mit einem fehlerhaften Find-Befehl enden; ich bin ziemlich sicher, dass er einfach mit einem Fehler beendet würde.

Im Fall A:

find . -iname "*gall*"

Wegen der Anführungszeichen, die ShellGewohnheitErweitern Sie das Muster. Daraus wird einfach (das ist, was findsieht):

find . -iname *gall*

Anschließend verwendet der Befehl „find“ dieses Muster, um nach allen Dateien (und Verzeichnissen usw.) zu suchen, die diesem Muster entsprechen. Dadurch werden sowohl als gallifrey-road-doctors-14437-1366x768.jpgauch foo-gallifrey-road-doctors-14437-1366x768.jpgalle Dateien gefunden, die dem Muster entsprechen *gall*.

Also: Ihr Befehl geht durch die Shell (die Globs in Anführungszeichen nicht erweitert und die äußerste Anführungszeichenebene entfernt) undDanngeht weiter bis find, das das Muster intern zum Abgleichen von Dateinamen verwendet.

verwandte Informationen