'echo [AZ] *' stimmt auch mit Dateinamen in Kleinbuchstaben überein?

7

Ich arbeite am Stammverzeichnis und möchte Verzeichniseinträge drucken, die mit einem Großbuchstaben beginnen.

$ echo [A-Z]*
Applications Library Network System Users Volumes bin cores dev etc home installer.failurerequests net private sbin tmp usr var vm

Das Ergebnis verwirrt mich, weil ich nicht erwartet hatte cores dev etc home installer.failurerequests net private sbin tmp usr var vm, dass es meinem Muster entspricht.

Wie kann ich ein Glob-Muster schreiben, das nur mit Großbuchstaben übereinstimmt?

Infinitesimalrechnung
quelle
Wann hat sich das geändert? ... kein Wunder, dass ich in letzter Zeit so viele Dateien aus dem Backup wiederherstellen musste! Wenn ich [AZ] benutze, erwarte ich, dass es genau das tut, was ich verlangt habe, keine Windows-zentrierte Interpretation, und schon gar nicht ohne Vorwarnung! Unix-Systeme sollten NICHT zwischen Groß- und Kleinschreibung unterscheiden!
Gordon

Antworten:

14

Dies liegt daran, dass das Glob-Muster [A-Z]im Allgemeinen nicht Großbuchstaben entspricht. Insbesondere erweitert es sich entsprechend

die Sortierfolge und den Zeichensatz des aktuellen Gebietsschemas

Wenn Sie möchten, dass Dateien mit einem Großbuchstaben beginnen, können Sie verwenden

echo [[:upper:]]*

oder legen Sie das Gebietsschema explizit fest

(LC_COLLATE=C; echo [A-Z]*)

oder verwenden Sie die Bash- globasciirangesShell-Option

(shopt -s globasciiranges; echo [A-Z]*)

Siehe den Pattern matchingAbschnitt vonman bash

Steeldriver
quelle
verwandt (aber anders): Wenn Sie verwenden shopt -s nocaseglob, wird bei der Glob-Erweiterung die Groß- und Kleinschreibung nicht berücksichtigt, selbst bei Teilen des Musters, die nicht zum Bereich gehören. zB echo DeV*wird übereinstimmen dev. Dies ist eine praktische Einstellung, wenn Sie häufig mit Dateien mit inkonsistenter Groß- und Kleinschreibung arbeiten.
Peter Cordes