简体   繁体   中英

bash filename globbing - operate on files starting with capital

Lets say I have a folder with the following jpeg-files:

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

How do I remove or list the files that starts with a capital?

This can be solved with a combination of find , grep and xargs .

But it is possible with normal file-globbing/pattern matching in bash?

cmd below doesn't work due to the fact that (as far as I can tell) LANG is set to en_US and the collation order.

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

This sort of works

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

But I don't wanna do this for all characters AZ for a general solution!

So is this possible?

cheers //Fredrik

you should set your locale to the C (or POSIX ) locale.

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

or

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

read here for more information: http://www.opengroup.org/onlinepubs/007908799/xbd/locale.html

Use a bracket expression with a character class:

ls -l [[:upper:]]*

See man 7 regex for a list of character classes and other information.

From that page:

Within a bracket expression, the name of a character class enclosed in '[:' and ':]' stands for the list of all characters belonging to that class. Standard character class names are:

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

Use grep :

ls | grep -e ^[A-Z]

If you want make more use a for loop:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM