
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.jpg
wü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 find
sieht):
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.jpg
auch foo-gallifrey-road-doctors-14437-1366x768.jpg
alle 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.