2010-09-17 6 views
9

Powiedzmy mam folder z następujących plików: JPEGbash filename masek - działać na plikach wyjściowych z kapitałem

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

Jak mogę usunąć lub listę plików, które zaczyna się od kapitału?

Można to rozwiązać za pomocą kombinacji find, grep i xargs.

Ale jest to możliwe przy normalnym dopasowywaniu plików/wzorców w bash?

cmd poniżej nie działa ze względu na fakt, że (o ile wiem) LANG jest ustawione na en_US i kolejność sortowania.

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

Ten rodzaj prac

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

Ale nie chcę to zrobić dla wszystkich znaków A-Z dla ogólnego rozwiązania!

Czy to możliwe?

okrzyki // Fredrik

+1

Co ciekawe, na moim Linuksie z LANG ustawiona na „en_US.UTF-8”, „ls [AZ] *” daje wszystkie te niższe przypadków, jak również, ale na moim Macintoshu z LANG ustawionym na "en_US.UTF-8", "ls [AZ] *" nadaje tylko nazwy uppper case. Na żadnym z pól nie ma ustawionego LC_COLLATE, więc nie wiem, jaka jest różnica. –

Odpowiedz

5

należy ustawić swoje lokum do C (lub POSIX) locale.

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

lub

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

przeczytać tutaj, aby uzyskać więcej informacji: http://www.opengroup.org/onlinepubs/007908799/xbd/locale.html

+0

Argh! Próbowałem tego przed moim postem, ale 'LC_ALL = C ls [A-Z] *. Jpg' wylistował dla mnie wszystkie pliki! POSIX thingie [: upper:] działa! Dzięki! ;-) –

2

Zastosowanie grep:

ls | grep -e ^[A-Z] 

Jeśli chcesz zrobić więcej używać for pętlę:

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

użycie wyrażenia wspornik z klasy postaci:

ls -l [[:upper:]]* 

Zobacz man 7 regex do listy klas postaci i inne informacje.

Od tej strony:

w wyrażeniu wspornika, nazwa klasy znaków ujęty w „[:” i „]” oznacza listę wszystkich znaków należących do tej klasy. Nazwy standardowe klasy postaci to:

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