bash globbing: files mit kleinem Anfangsbuchstaben

14/09/2012 - 09:05 von Stefan Enzinger | Report spam
Hallo

Scheinbar ist es zu früh wür mich.

Wie kann ich nur files bekommen, die mit Kleinbuchstaben anfangen?

$ ls -ld dolby.vob kebab\ connection\ \(austria\ 2004\).avi paycheck/
-rw-rw-r-- 1 mindoms video 27963392 2008-02-20 18:41 dolby.vob
-rwxr-xr-x 1 mindoms mindoms 727967744 2005-10-24 16:44 kebab connection
(austria 2004).avi
drwxrwxr-x 2 mindoms video 4096 2011-04-28 04:45 paycheck/

$ ls -d [:lower:]*
ls: cannot access [:lower:]*: No such file or directory

$ shopt | grep -e case -e glob
dotglob off
extglob on
failglob off
globstar off
nocaseglob off
nocasematch off
nullglob off

$ ls -d [a-z]*
... das matched alles, bis auf files mit ziffern am Beginn.
 

Lesen sie die antworten

#1 Paul Hink
14/09/2012 - 09:49 | Warnen spam
Stefan Enzinger wrote:

Wie kann ich nur files bekommen, die mit Kleinbuchstaben anfangen?

$ ls -ld dolby.vob kebab\ connection\ \(austria\ 2004\).avi paycheck/
-rw-rw-r-- 1 mindoms video 27963392 2008-02-20 18:41 dolby.vob
-rwxr-xr-x 1 mindoms mindoms 727967744 2005-10-24 16:44 kebab connection
(austria 2004).avi
drwxrwxr-x 2 mindoms video 4096 2011-04-28 04:45 paycheck/

$ ls -d [:lower:]*
ls: cannot access [:lower:]*: No such file or directory



Richtig wàre hier:

$ ls -d [[:lower:]]*

Zitat aus der bash-4.1.5(1)-Manpage, Abschnitt "Pathname Expansion":

| Within [ and ], character classes can be specified using the syntax
| [:class:], where class is one of the following classes defined in the
| POSIX standard:
|
| alnum alpha ascii blank cntrl digit graph lower print punct space
| upper word xdigit

(Man beachte das "Within [ and ]".)

[...]

$ ls -d [a-z]*
... das matched alles, bis auf files mit ziffern am Beginn.



Das liegt dann an deinem Locale, das Klein- und Großbuchstaben beim
Sortieren "mischt":

| [...] Matches any one of the enclosed characters. A pair of
| characters separated by a hyphen denotes a range expression; any
| character that sorts between those two characters,
| inclusive, using the current locale's collating sequence
| and character set, is matched.

(ebd.)

Deshalb besser Character Classes verwenden (s.o. oder LANG/LC_*
explizit setzen:

| $ declare | egrep '(LANG|LC_)'
| LANG=en_US
| $ ls
| 1xy abc Abc dEF DEF
| $ ls [a-z]*
| abc Abc dEF DEF
| $ ls [abcd]*
| abc dEF
| $ LANG=C
| $ ls [a-z]*
| abc dEF
| $

Man kann das auch z. B. mit sort(1) nachvollziehen:

| $ declare | egrep '(LANG|LC_)'
| LANG=en_US
| $ cat sort
| a
| b
| A
| B
| $ sort <sort
| a
| A
| b
| B
| $ unset LANG
| $ sort <sort
| A
| B
| a
| b
| $

Ähnliche fragen