Metazeichen und Casesensitivity

Hinweis: In dem Thema Metazeichen und Casesensitivity gibt es 3 Antworten. Der letzte Beitrag () befindet sich ganz unten auf dieser Seite.
  • Hi zusammen,
    bisher war es so, dass wenn ich "ls -l [A-Z]*" eingegeben habe, ich auch nur Dateien angezeigt bekam, die mit Grossbuchstaben beginnen.
    Jetzt bekomme ich alle (na ja, fast alle) angezeigt. die Datei abcdefg wird nicht angezeigt. Die Datei info.txt aber schon. Das hat für mich jegliche Logik verlohren. Alle alten scripte werden also jetzt nicht mehr korrekt laufen?
    Ich benutze SUSE-Linux 11.4 64Bit und ich arbeite auf der bash, aber bei SUSE-Linux 11.3 klappt es auch nicht.


    Kann mir da jemand weiterhelfen?

  • Hallo,


    Deine Frage ist leider etwas schwierig zu beantworten... :D


    Das Problem ist ,dass 'xyz' in


    Code
    > ls -l xyz


    *keine* 'regexp' (regular expression) ist. Es ist stattdessen ein 'globbing'


    Siehe die man page


    Code
    > man 7 glob


    Es kann sein, dass


    Code
    [A-F] = [ABCDEF]


    oder


    Code
    [A-F] = [AbBcCdDeEfF] >>> ohne das 'a' !!!


    wohingegen


    Code
    [a-f] = [aAbBcCdDeEf] >>> ohne das 'F' !!!


    usw.


    Was genau jetzt gilt ist von Deinem 'environment' abhängig. Zum Beispiel:



    und hier insbesondere die Variable


    Code
    LC_COLLATE


    Wenn Du (z.B.) ein Verz. mit folgenden Dateien hast:


    Code
    Abc.txt
    Bcd.txt
    Cde.txt
    abc.txt
    bcd.txt
    cde.txt


    Dann ergibt


    Code
    > LC_COLLATE="en_US" ls -1 [A-C]*
    Abc.txt
    bcd.txt
    Bcd.txt
    cde.txt
    Cde.txt
    >


    >>> abc.txt ist nicht dabei weil nicht in [A-C] enthalten!


    Code
    > LC_COLLATE="en_US" ls -1 [A-C]*
    Abc.txt
    bcd.txt
    Bcd.txt
    cde.txt
    Cde.txt
    >


    Code
    > LC_COLLATE="C" ls -1 [A-C]*
    Abc.txt
    Bcd.txt
    Cde.txt
    bcd.txt
    cde.txt
    >


    Code
    > LC_COLLATE="C" ls -1 [a-c]*
    Abc.txt
    Bcd.txt
    abc.txt
    bcd.txt
    cde.txt
    >


    >>> Cde.txt ist nicht dabei weil nicht in [a-c] enthalten!


    Willst Du also nur Abc.*, Bcd.* und Cde.* finden, dann braucht es eine explizite Spezifikation (ohne '-'):


    Code
    > ls -l [ABC]*


    Die Sache ist, wie gesagt, nicht ganz so einfach wie vielleicht erwartet.


    Siehe hier:


    http://www.faqs.org/docs/bashman/bashref_35.html


    Gruss,
    Roland

    Einmal editiert, zuletzt von rme ()

    Für den Inhalt des Beitrages 31651 haftet ausdrücklich der jeweilige Autor: rme