Wie findet man. -name * foo * `Arbeit?

8

Ich dachte, der Platzhalter *im Befehl find . -name *foo*wird durch Bash ersetzt, und dennoch funktioniert der Befehl, es sei denn, es *foo*stimmt etwas im aktuellen Verzeichnis überein, dann nicht. Es ist verwirrend.

chx
quelle
3
Hinweis: Wenn Sie die ersetzen find . -name *foo*mit find . -name '*foo*'ihm wird es dem Platzhalter entspricht wie erwartet funktionieren.
Bill

Antworten:

14

Wenn bash keine Übereinstimmung finden kann, wird die Literalzeichenfolge mit einem nicht erweiterten *Wert an die Anwendung übergeben . Zum Beispiel:

$ ls
foo

$ cat /tmp/test
echo $1

$ /tmp/test *foo*
foo

$ /tmp/test *bar*
*bar*

basherweitert, *foo*weil es zusammenpasste, aber *bar*direkt bestanden, weil es nicht stimmte. Die nullglobOption weist bash an, nicht übereinstimmende Muster stattdessen in die leere Zeichenfolge aufzulösen:

$ shopt -s nullglob
$ /tmp/test *bar*

$
Michael Mrozek
quelle
1
Ein kleiner Kommentar zu sagen , dass zsh nicht das gleiche Standardverhalten hat, es gibt einen Fehler zurück: zsh: no matches found.
Stéphane Gimenez
zsh muss no_nomatchdieses Verhalten auslösen.
CHX
5

Wenn Sie die findnicht erweiterte Zeichenfolge erhalten möchten , können Sie sie zitieren oder die Platzhalter mit Backslashes schützen.

$ ls
foo

$ cat /tmp/test
echo $1

$ /tmp/test '*foo*'
*foo*

$ /tmp/test \*foo\*
*foo*
Kevin M
quelle