2010-09-17 8 views
9

Diciamo che ho una cartella con i seguenti jpeg-files:bash filename globbing - operare su file che iniziano con capitale

adfjhu.jpg Afgjo.jpg 
Bdfji.jpg bkdfjhru.jpg 
Cdfgj.jpg cfgir.jpg 
Ddfgjr.jpg dfgjrr.jpg 

Come posso rimuovere o elencare i file che inizia con la A maiuscola?

Questo problema può essere risolto con una combinazione di find, grep e xargs.

Ma è possibile con la normale corrispondenza tra file e pattern in bash?

cmd di seguito non funziona a causa del fatto che (per quanto posso dire) LANG è impostato su en_US e l'ordine di confronto.

$ ls [A-Z]*.jpg 
Afgjo.jpg Bdfji.jpg bkdfjhru.jpg Cdfgj.jpg cfgir.jpg Ddfgjr.jpg dfgjrr.jpg 

Questo tipo di opere

$ ls +(A|B|C|D)*.jpg 
Afgjo.jpg Bdfji.jpg Cdfgj.jpg Ddfgjr.jpg 

Ma io non voglio fare questo per tutti i caratteri A-Z per una soluzione generale!

Quindi è possibile?

applausi // Fredrik

+1

È interessante notare che, sulla mia macchina Linux con LANG impostato su "en_US.UTF-8", "ls [AZ] *" dà tutte quelle minuscole pure, ma sul mio Macintosh con LANG impostato su "en_US.UTF-8", "ls [AZ] *" fornisce solo nomi maiuscoli. Su nessuna delle due caselle è impostato LC_COLLATE, quindi non so quale sia la differenza. –

risposta

5

si dovrebbe impostare il locale al C (o POSIX) locale.

$ LC_ALL=C ls [A-Z]*.jpg 

o

$ LC_ALL=C ls [[:upper:]]*.jpg 

leggere qui per maggiori informazioni: http://www.opengroup.org/onlinepubs/007908799/xbd/locale.html

+0

Argh! Ho provato quello prima del mio post ma 'LC_ALL = C ls [A-Z] *. Jpg' elenca tutti i file per me! POSIX thingie [: upper:] funziona comunque! Grazie! ;-) –

2

Uso grep:

ls | grep -e ^[A-Z] 

Se si vuole fare più utilizzare un ciclo for:

for i in $(ls | grep -e ^[A-Z]); do echo $i ;done 
5

usare un'espressione staffa con una classe di caratteri:

ls -l [[:upper:]]* 

Vedi man 7 regex per un elenco delle classi di personaggi e altre informazioni.

Da quella pagina:

All'interno di un'espressione parentetica, il nome di una classe di caratteri racchiusa in '[:' e ':]' rappresenta l'elenco di tutti i caratteri appartenenti a quella classe. I nomi delle classi di caratteri standard sono:

alnum digit punct 
alpha graph space 
blank lower upper 
cntrl print xdigit