Normalerweise unterscheidet Bash Globbing zwischen Groß- und Kleinschreibung:
$ echo c*
casefix.pike cdless chalices.py charconv.py chocolate.pike circum.py clip.pike cpustats.pike crop.pike cwk2txt.py
$ echo C*
CarePackage.md ChocRippleCake.md Clips
Die Verwendung eckiger Klammern scheint dies nicht zu ändern:
$ echo [c]*
casefix.pike cdless chalices.py charconv.py chocolate.pike circum.py clip.pike cpustats.pike crop.pike cwk2txt.py
$ echo [C]*
CarePackage.md ChocRippleCake.md Clips
Es ändert sich immer noch nicht, wenn ein Bindestrich verwendet wird:
$ echo [c-c]*
casefix.pike cdless chalices.py charconv.py chocolate.pike circum.py clip.pike cpustats.pike crop.pike cwk2txt.py
$ echo [C-C]*
CarePackage.md ChocRippleCake.md Clips
Aber die Buchstaben sind durchsetzt:
$ echo [B-C]*
CarePackage.md casefix.pike cdless chalices.py charconv.py chocolate.pike ChocRippleCake.md circum.py clip.pike Clips cpustats.pike crop.pike cwk2txt.py
$ echo [b-c]*
beehive-anthem.txt bluray2mkv.pike branch branchcleanup.pike burdayim.pike casefix.pike cdless chalices.py charconv.py chocolate.pike circum.py clip.pike cpustats.pike crop.pike cwk2txt.py
Dies deutet darauf hin, dass der Bindestrich die Gebietsschema-Reihenfolge "AaBbCcDd" verwendet. Also: Gibt es eine Möglichkeit zum Globieren für alle Dateien, die mit einem Großbuchstaben beginnen?
[A-Z]
stimmen Kleinbuchstaben in Bash überein?Antworten:
In Bash-Version 4.3 und höher gibt es eine Shopt-Option namens
globasciiranges
:Laut Shopt Built Gnu Manpages :
Als Ergebnis können Sie
Verwenden Sie
shopt -u
zum Deaktivieren.Eine andere Möglichkeit besteht darin, das Gebietsschema in C zu ändern. Sie können dies vorübergehend mithilfe einer Unterschale tun:
Sie erhalten die gewünschten Ergebnisse, und wenn die Unter-Shell fertig ist, bleibt das Gebietsschema Ihrer Haupt-Shell unverändert.
Eine andere Alternative besteht darin
[A-Z]
, die Klammererweiterung{A..Z}
zusammen mit dernullglob
Option bash shopt zu verwenden.Durch Aktivieren der
nullglob
Option wird anstelle des Musters selbst eine Nullzeichenfolge zurückgegeben, wenn ein Muster während der Pfadnamenerweiterung nicht übereinstimmt.Infolgedessen funktioniert dieser wie erwartet:
quelle
[[:upper:]]
weil ich eigentlich nur einen Teil des Alphabets möchte, aber das funktioniert.man bash
in Ihrem Terminal ausführen und nach/
Globasciiranges suchen (mit ).LC_ALL=C printf '%s\n' [A-Z]*
für Ihre zweite Lösung nicht funktionieren - ohne Subshell? Übrigens: Es gibt einen Tippfehler:nullblog
Aber es sind zu wenige Zeichen, als dass ich ihn korrigieren könnte.Sie können alle Großbuchstaben wie folgt schreiben:
oder use kann die benannte Zeichenklasse verwenden
[:upper:]
, um alle Großbuchstaben in Ihrer aktuellen darzustellenlocale
:Wie Sie bemerkt haben, werden bei Verwendung von Bereichen wie
[B-C]
Groß- und Kleinbuchstaben für dasselbe alphabetische Zeichen nebeneinander angeordnet (gemäß der Sortierreihenfolge vonlocale
).quelle
Das Einfügen von „nicht intuitiven“ Zeichen in Zeichenbereiche, z. B. das Einfügen von Kleinbuchstaben in einen Bereich, dessen Grenzen Großbuchstaben sind, ist auf die
LC_COLLATE
Gebietsschemaeinstellung zurückzuführen.LC_COLLATE
soll die Sortierreihenfolge anzeigen, aber es macht einen schlechten Job (das Sortieren von Zeichenfolgen ist komplexer als das, was Gebietsschemas können) und Sie sind ohne besser dran. Ich empfehle,LC_COLLATE
Einstellungen aus Ihrem Gebietsschema zu entfernen . Wenn Sie EinstellungLANG
, oderLANGUAGE
, das nicht tun und setzen nur die , die Sie brauchen:LC_CTYPE
,LC_MESSAGES
,LC_TIME
.Weitere Hintergrundinformationen zu Gebietsschemas finden Sie unter Worauf sollte ich mein Gebietsschema einstellen und welche Auswirkungen hat dies? und setze LC_ * aber nicht LC_ALL
Um zuverlässige Ergebnisse in einem Skript unabhängig von den Einstellungen des Benutzers zu erhalten, legen Sie fest
LC_ALL=C
.quelle
Einstellen:
Von der Bash-Manpage:
Wenn Sie 'globasciiranges' einstellen, weiß ich nicht, was mit Nicht-ASCII-Zeichen wie utf-8 passieren wird
quelle
echo [cC] * sollte tun, was Sie wollen, ähnlich [A-Za-z] *
Ich bin hier , weil auf meinem System Globbing hat gerade aufgehört empfindlich Fall, so viele meine Skripte nicht mehr funktionieren , wie sie sollten :-(
quelle