Die doppelten Anführungszeichen, die mit dem übereinstimmenden Wert mit dem Parameter -name in find verwendet werden

Die doppelten Anführungszeichen, die mit dem übereinstimmenden Wert mit dem Parameter -name in find verwendet werden

Warum muss der übereinstimmende Wert mit dem Parameter -namein findmit 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 *.outwird 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 .outund nicht mit einem Punkt beginnen). In Ihrem Fall scheinen mindestens zwei passende Dateien vorhanden zu sein, die als Parameter übergeben werden find. findweiß 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 findsieht 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?

verwandte Informationen