Verwendung von * bei der Dateisuche

9

Beim Lesen über die Suche nach Linux-Dateien habe ich Folgendes erhalten ...

Um mit dem Platzhalter * nach Dateien zu suchen, ersetzen Sie die unbekannte Zeichenfolge durch *. Wenn Sie sich beispielsweise nur daran erinnern, dass die Erweiterung .out war, geben Sie ls * .out ein

und als ich den folgenden Befehl auf dem System versuchte (Ubuntu 14.04 LTS) ..Ich bekam

anupam@JAZZ:~$ ls  *.bash* 

ls: cannot access  *.bash* : No such file or directory

anupam@JAZZ:~$ ls  .bash*

.bash_history   .bash_logout  .bash_profile  .bashrc

anupam@JAZZ:~$

im ersten Fall, warum es kein solches Verzeichnis anzeigt ( *.bash*) und im nächsten Fall zeigt es die Dateien an ( .bash*)

Ich bin neu in diesem Geschmack und laut meiner Automatentheorie bedeutet Klassen (*) eine beliebige Kombination von Zeichenfolgen, einschließlich Epsilon (leer). Warum sind die Ergebnisse in beiden Fällen unterschiedlich?

Lazarus
quelle

Antworten:

11

Wenn Sie das tun ls *die *erweitert wird , bevor es zu übergeben wird ls. Das heißt , wenn wir drei Dateien ( a, bund c) in einem Verzeichnis ls *tatsächlich ausgeführt wird ls a b c.

Wenn Bash nicht erweitert werden kann, durchläuft es die Rohzeichenfolge¹. Aus diesem Grund sehen Sie die Platzhalter im Fehler zusammen mit einer nicht gefundenen Nachricht. lshat versucht, die Liste für eine Datei anzuzeigen, die buchstäblich aufgerufen wird *.bash*.

Also warum nicht , dass erweitern? Standardmäßig gibt Globbing (wie diese Platzhaltererweiterung heißt) keine versteckten Dateien zurück. Sie können dies ändern mit shopt -s dotglob(das bleibt nicht bestehen, es sei denn, Sie stecken es in Ihr .bashrc- es ist möglicherweise aus gutem Grund standardmäßig deaktiviert, seien Sie also vorsichtig damit). Hier ist eine kurze Demo:

$ ls  *.bash*
ls: cannot access *.bash*: No such file or directory
$ shopt -s dotglob
$ ls  *.bash*
.bash_aliases  .bash_history  .bash_logout  .bashrc  .bashrc.save

Die Ausnahme ist - wie Sie bereits gezeigt haben -, wenn Sie bereits explizit angegeben haben, dass die Dateien mit einem Muster wie ausgeblendet werden .bash*. Die Standardeinstellung wird einfach überschrieben dotglob:

$ shopt -u dotglob  # unset dotglob
$ ls .bash*
.bash_aliases  .bash_history  .bash_logout  .bashrc  .bashrc.save

Abgesehen von dieser Eigenart hoffe ich, dass dies Ihnen hilft, zu verstehen, was unter der Oberfläche vor sich geht.


Es gibt noch andere shoptFlags, die verändern , wie Werke Globbing: extglob, failglob, globstar, nocaseglobund nullglob. Sie und eine Reihe anderer shoptFlaggen sind im Bash-Handbuch dokumentiert .

Ebenso sollte die Seite zum Mustervergleich für eine gute Lektüre sorgen.

¹ Sofern failgloboder nullglobnicht eingestellt.

Oli
quelle
Danke @Oli ,, Ich habe nicht alles bekommen, wie ich schon sagte, ich bin neu in diesem Geschmack ,, aber ich habe 80% davon bekommen ... Es hat mir geholfen
Lazarus