"ls" oder Regex ist unabhängig von Groß- und Kleinschreibung?

7781
zhanwu

In Bash habe ich es versucht

ls [a-z]* 

und erwartet, alle Dateien mit Dateinamen aufzulisten, beginnt mit einem kleinen Fallalphabet. Aber warum werden die Dateien, deren Name mit Großbuchstaben beginnt, ebenfalls angezeigt?

>ls [a-z]* D e > 

Falls erforderlich, die bash-Version:

bash --version GNU bash, Version 4.1.5 (1) -release (i486-pc-linux-gnu) Copyright (C) 2009 Free Software Foundation, Inc. Lizenz GPLv3 +: GNU GPL Version 3 oder höher http: // gnu .org / Lizenzen / gpl.html

This is free software; you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. 
5
* in Bash ist kein Regex *. [az] sieht ein bisschen regulär aus und bash scheint das zu akzeptieren. ls a + passt beispielsweise nicht zu aaa. Wenn es also Regex unterstützt, ist es kaum möglich. Ich bin mir nicht sicher, in welchem ​​Umfang, wenn überhaupt. echo a , echo a \ gibt nur eine wieder und interpretiert sie nicht wie eine Regex. barlop vor 13 Jahren 0
Hier ist ein Artikel zum Bash-Pattern-Matching http://www.faqs.org/docs/bashman/bashref_35.html Es erwähnt: "Wenn die Shell-Option extglob mit dem Shopt-Build aktiviert ist, werden mehrere erweiterte Pattern-Matching-Operatoren erkannt In der folgenden Beschreibung ist eine Musterliste eine Liste von einem oder mehreren durch ein "|" getrennten Mustern. Zusammengesetzte Muster können mit einem oder mehreren der folgenden Untermuster gebildet werden: "Aber ich bin mir nicht sicher, wie Sie dies aktivieren würden diese Option barlop vor 13 Jahren 0
Auf cygwin sieht [az] * genau so aus wie [[: lower:]] * und es werden keine Großbuchstaben angezeigt. GNU bash, Version 3.2.51 (24) -Veröffentlichung (i686-pc-cygwin) barlop vor 13 Jahren 0
@ barlop: Das Verhalten von Zeichenbereichen hängt von der Ländereinstellung ab, insbesondere von der Einstellung "LC_COLLATE". In einigen (vielen?) Ländereinstellungen enthält "[az]" "aAbB ... yYz", aber nicht "Z". Sie können erweitertes Globbing mit "shopt -s extglob" aktivieren. Ich bekomme unterschiedliche Ergebnisse für [az] und [[: lower:]] `auf Cygwin. Dennis Williamson vor 13 Jahren 1

2 Antworten auf die Frage

3
Majenko

Es ist kein regulärer Ausdruck, an dem die Verwirrung eintritt. Stattdessen wird ein System namens "Globbing" verwendet - siehe:

$ man 7 glob 

Anstelle von [az] müssen Sie [[: lower:]] als solche verwenden:

$ ls -d [[:lower:]]* 
ist "globbing" die so genannte "Pfadnamenerweiterung"? zhanwu vor 13 Jahren 0
Bei der Erweiterung ohne Pfadnamen handelt es sich um ~ fred / foo.bar, die in /home/fred/foo.bar übersetzt wird Majenko vor 13 Jahren 0
1
Rich Homolka

1) Es kann von Ihrem Betriebssystem abhängen, insbesondere von Ihrem Dateisystem. Ist die Schreibweise Ihres Dateisystems empfindlich? Sie erwähnen nicht das Betriebssystem oder den Dateisystemtyp.

2) bash kann auch case-unempfindliches Globbing ausführen. Sie können überprüfen, ob dies Ihr aktueller Fall istshopt | grep nocaseglob

Denken Sie außerdem daran, dass lsmit den Dateien nichts gemacht wird. Deine Shell ist, dann gibt die Dateinamen an ls weiter.