Super User is a question and answer site for computer enthusiasts and power users. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

In a bash script, how can I say 'for all files of type .png or .PNG'?

I'm trying :

for i in (`ls *.PNG` && `ls *.png`)

but getting a syntax error.

share|improve this question

If you want all possible combinations, use:

for i in *.[Pp][Nn][Gg]; do


shopt -s nocaseglob
for i in *.png; do

although that one will make all of your script's shell globs (i.e. wildcard file matches) case insensitive until you run shopt -u nocaseglob.

If you really want just .PNG and .png (and not, for example, .PnG or .pnG), then use either

shopt -s nullglob
for i in *.png *.PNG; do


for i in *.png *.PNG; do
    [[ -e "$i" ]] || continue

...the reason for the nullglob or existence check is that if you have only lowercase or only uppercase extensions, it'll include the unmatched pattern in the list of files, leading to an error in the body of the loop. As with nocaseglob, you might want to turn the nullglob shell option off afterward (although in my experience having nullglob on is often good, especially in a script). Actually, I rather consider it a good idea to use either the nocaseglob or existence check for all file matches like this, just in case there are no matches.

share|improve this answer
for i in *.{png,PNG} – glenn jackman May 16 '11 at 12:54
@glenn: That'd work too (equivalent to `*.png *.PNG), although you still need nullglob or the existence check. – Gordon Davisson May 16 '11 at 20:24

You could also try some one-liner such as

find . -iname "*.png" -exec ....


find . -iname "*.png" | xargs ....

See also @Yab's comment below about recursion.

share|improve this answer
find is however by default recursive, so to get the same result the question asks, you'd have to do find -maxdepth 1 -iname "*.png" – Yab May 16 '11 at 6:45
@Yab, you are perfectly correct. I overlooked this aspect. – Alain Pannetier May 16 '11 at 6:51

ls is almost useless here but for the record here is a syntax closer to your attempt:

for i in $(ls *.PNG ; ls *.png)


  • I'm assuming you want both uppercase and lowercase pictures. The && separator would means process png files only if PNG files exist, which probably doesn't make much sense.
  • you'll have error messages displayed if no files are found with either pattern.
share|improve this answer

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .