Wie mache ich die glob-Zeichenklassen von bash für Groß- und Kleinschreibung?

617
Mutant Bob

Ich hatte einige Dateien wie knob_A.pngund erstellt, knob_a.pngund mein Teamkollege unter Windows sagte, dass dies Probleme mit ihrer App verursachte. Ich beschloss, es knob_W.pngstatt zu nennen knob_a.png. Dann habe ich einen Rsync-Vorgang zu unserem gemeinsam genutzten Server durchgeführt. Um das aufzuräumen, habe ich es dann gemacht

rm knob_[a-d]*.png 

und es auch entfernt knob_A.png. Das ist falsch als Fußballschläger.

Weder shopt -s nocaseglobnoch shopt -u nocaseglobbewirkt es, dass es sich so verhält, wie ich es will.

Wie kann ich bash sagen, dass die Globs die Groß- und Kleinschreibung berücksichtigen sollen, wie früher?

4

2 Antworten auf die Frage

7
xordspar0

Bash ist hier Groß- und Kleinschreibung. Das Problem liegt in der Sortierreihenfolge der Zeichen im Bereich. Aus dem Bash-Handbuch ( info bash):

Die Sortierreihenfolge der Zeichen in Bereichsausdrücken wird durch das aktuelle Gebietsschema und den Wert der Shell-Variablen 'LC_COLLATE' (falls festgelegt) festgelegt.

In der Standard-C-Ländereinstellung entspricht "[a-dx-z]" "[abcdxyz]". Viele Gebietsschemas sortieren Zeichen in der Wörterbuchreihenfolge. In diesen Gebietsschemas ist '[a-dx-z]' normalerweise nicht äquivalent zu '[abcdxyz]'; Es könnte beispielsweise äquivalent zu "[aBbCcDdxXyYz]" sein. Um die traditionelle Interpretation von Bereichen in Klammerausdrücken zu erhalten, können Sie die Verwendung des C-Gebietsschemas erzwingen, indem Sie die Umgebungsvariable 'LC_COLLATE' oder 'LC_ALL' auf den Wert 'C' setzen.

Versuchen Sie es zu tun

export LC_COLLATE=C 
Vielleicht möchten Sie das Shell-Beispiel auf Folgendes erweitern: `LC_COLLATE = C; ls knob_ [ad] *. png`. Ich bin es gewohnt, Dinge wie "LC_COLLATE = C ls knob_ [ad] *. Png" zu tun, was nicht funktioniert, wahrscheinlich, weil dies nur die Umgebung des Unterprozesses festlegt und sich nicht auf die Bash auswirkt, die den Glob ausgewertet hat. Mutant Bob vor 6 Jahren 1
@MutantBob ist korrekt: bash erweitert den Glob, bevor er LC_COLLATE setzt. Das Hauptproblem ist jedoch, dass ein einfaches X = Y eine lokale Shell-Variable X setzt, die _not_ der Umgebungsvariablen entspricht und LC_COLLATE eine Umgebungsvariable ist. Denis Howe vor 5 Jahren 1
Um eine Umgebungsvariable temporär für einen Befehl festzulegen, sagen Sie: `LC_COLLATE = C command` Hinweis: _no Semikolon_ zwischen der Zuweisung und dem Befehl. Um es für den Rest der Sitzung festzulegen, sagen Sie Folgendes: `export LC_COLLATE = C` Dies wirkt sich auf Globs in nachfolgenden Zeilen aus. Denis Howe vor 5 Jahren 0
1
DonnieDarko

Bash verfügt über eine Shell-Option, um die Übereinstimmung der Muster beizubehalten, sodass die Groß- / Kleinschreibung während der Erweiterung nicht ignoriert wird. Sie können shopt -s globasciirangesIhrem Skript hinzufügen, um Übereinstimmungen zwischen Groß- und Kleinschreibung zu aktivieren, und es mit deaktivieren shopt -u globasciiranges. Siehe Bash-Referenz - Shopt Builtin

Alternativ können Sie die LC_COLLATE=Cin der anderen Antwort angegebene verwenden. Stellen Sie jedoch sicher, dass sie mit in Ihre Umgebung exportiert wurdeexport LC_COLLATE