Warum muss der übereinstimmende Wert mit dem Parameter -name
in find
mit doppelten Anführungszeichen markiert werden?
# find / -type f -name *.out |wc -l 1>mv.out
0403-027 The parameter list is too long.
# cat mv.out
0
# find / -type f -name "*.out" |wc -l 1>mv.out
# cat mv.out
146302
Antwort1
Ohne Anführungszeichen *.out
wird es von der Shell erweitert, d. h. es wird durch alle passenden Dateinamen im aktuellen Verzeichnis ersetzt *.out
(hauptsächlich alle Dateien, die mit einem Punkt enden .out
und nicht mit einem Punkt beginnen). In Ihrem Fall scheinen mindestens zwei passende Dateien vorhanden zu sein, die als Parameter übergeben werden find
. find
weiß nicht, was es damit anfangen soll und beschwert sich, dass die Parameterliste zu lang ist.
Durch das Zitieren des Musters belässt die Shell es wie es ist, entfernt nur die Anführungszeichen und find
sieht einen unberührten Parameter *.out
, was wahrscheinlich Ihre Absicht ist.
Antwort2
Ich bin nicht sicher, ob das genau richtig ist. Aber ich glaube, wenn man es in Anführungszeichen setzt, liest der Parser es als regulären Ausdruck. Ohne Anführungszeichen steht das Sternchen meiner Meinung nach für alle Dateien im aktuellen Verzeichnis.
Überprüfen Sie den Unterschied in der Ausgabe zwischen:
$ echo $(find ./ -name *)
Und
$ echo $(find ./ -name "*")
Beim ersten Befehl erhalten Sie wahrscheinlich eine Fehlermeldung. Wenn Sie die DateienfooundBarIm aktuellen Verzeichnis stellt das Sternchen die Dateinamen dar. Der Befehlsparser würde den Befehl also folgendermaßen lesen:
$ echo $(find ./ -name foo bar)
Und die Fehlerausgabe wäre find: bar: unknown primary or operator
.
Der zweite Befehl liest das Sternchen als regulären Ausdruck und bedeutet, dass nach einem beliebigen Dateinamen gesucht werden soll.
Bearbeiten:Nachdem ich die Befehle nun ausführlicher getestet habe, scheint es auf meinem System zu funktionieren, ob der Argumentwert in Anführungszeichen steht oder nicht, solange ein Text mit dem Sternchen kombiniert wird:
$ echo $(find ./ -name *foo)
ist das gleiche wie
$ echo $(find ./ -name "*foo")
Vielleicht verstehe ich die Frage falsch?