Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

bash filename globbing - operate on files starting with capital

Tags:

bash

glob

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 A-Z for a general solution!

So is this possible?

cheers //Fredrik

like image 977
Fredrik Pihl Avatar asked Feb 03 '23 02:02

Fredrik Pihl


2 Answers

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

like image 194
Lesmana Avatar answered Feb 05 '23 18:02

Lesmana


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  
like image 38
Dennis Williamson Avatar answered Feb 05 '23 16:02

Dennis Williamson