Risposte:
Se vuoi tutte le combinazioni possibili, usa:
for i in *.[Pp][Nn][Gg]; do
o
shopt -s nocaseglob
for i in *.png; do
anche se quello renderà insensibili a tutte le shell globs del tuo script (cioè le corrispondenze di file jolly) fino a quando non eseguirai shopt -u nocaseglob
.
Se vuoi davvero solo .PNG e .png (e non, ad esempio, .PnG o .pnG), usa uno dei due
shopt -s nullglob
for i in *.png *.PNG; do
o
for i in *.png *.PNG; do
[[ -e "$i" ]] || continue
... il motivo del nullglob o del controllo di esistenza è che se hai solo estensioni minuscole o solo maiuscole, includerà il modello senza pari nell'elenco dei file, portando a un errore nel corpo del ciclo. Come con nocaseglob, potresti voler disattivare l'opzione shell nullglob in seguito (anche se nella mia esperienza avere nullglob è spesso buono, specialmente in uno script). In realtà, ritengo piuttosto una buona idea usare il nocaseglob o il controllo di esistenza per tutte le corrispondenze di file come questo, nel caso in cui non ci siano corrispondenze.
Potresti anche provare un one-liner come
trova . -iname "* .png" -exec ....
o
trova . -iname "* .png" | xargs ....
Modifica
Vedi anche il commento di @ Yab in basso sulla ricorsione.
find -maxdepth 1 -iname "*.png"
ls
è quasi inutile qui, ma per la cronaca qui c'è una sintassi più vicina al tuo tentativo:
for i in $(ls *.PNG ; ls *.png)
Appunti:
for i in *.{png,PNG}