Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 15 Oct 2005 18:07:06 -0500
From:      Will Maier <willmaier@ml1.net>
To:        freebsd-questions@freebsd.org
Subject:   Re: Bash Pattern Matching Syntax
Message-ID:  <20051015230706.GI3253@localdomain>
In-Reply-To: <43518497.6050505@mykitchentable.net>
References:  <43518497.6050505@mykitchentable.net>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sat, Oct 15, 2005 at 03:37:11PM -0700, Drew Tomlinson wrote:
> I want to list the files in a directory that end in ".jpg"
> irregardless of case.  Thus after reading the bash man page, it
> seems I should be able to issue a command something along the
> lines of "ls [*.[JjPpGg]]"  or "ls *.[JjPpGg]" but neither of
> these work and return a "No such file or directory" message.  I've
> also tried various ways of  escaping the '*' and '." but that
> didn't help either.  However "ls *[JjPpGg]" does work by listing
> the files.  However I want to match the "." before "jpg" as well.
> What is the correct syntax for what I'm trying to do?

The square brackets define a range of characters; [a-z] includes all
lowercase alphabetic characters between 'a' and 'z' and will match
_only one character from that range_ in a given string.
    
    [a-z] matches 'b'
    [a-z] matches 'z'
    [a-z] doesn't match 'all'
    [a-z] doesn't match '1'

Your first attempt, [*.[JjPpGg]], has an extra pair of brackets.
Secondly, it (like your second attempt) defines a range that would
match only one character, JjPpGg:
    
    [JjPpGg] matches 'j'
    [JjPpGg] matches 'G'
    [JjPpGg] doesn't match 'JPG'
    [JjPpGg] doesn't match 'jpg'

You need to break your patterns up; what you're looking for is a
pattern of three characters, with 'J' or 'j' in the first position,
'P' or 'p' in the second, and 'G' or 'g' in the third. That entire
pattern should be prepended by a string of any characters (*) and a
period (.).

Here are some examples to demonstrate what I've written above; they
conclude with a pattern that will match the files you're looking
for.

    sh-3.00$ ls
    a  all  test.JPG  test.jpg
    sh-3.00$ ls [a-z]
    a
    sh-3.00$ ls [all]
    a
    sh-3.00$ ls *.[JjPpGg]
    ls: *.[JjPpGg]: No such file or directory
    sh-3.00$ ls *.[Jj][Pp][Gg]
    test.JPG  test.jpg

-- 

o--------------------------{ Will Maier }--------------------------o
| jabber:..wcmaier@jabber.ccc.de | email:..........wcmaier@ml1.net |
| \.........wcmaier@cae.wisc.edu | \..........wcmaier@cae.wisc.edu |
*------------------[ BSD Unix: Live Free or Die ]------------------*




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20051015230706.GI3253>