Shell bash: elenca tutti i file di tipo .png o .PNG?


14

In uno script bash, come posso dire "per tutti i file di tipo .png o .PNG"?

Sto provando :

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

ma viene visualizzato un errore di sintassi.

Risposte:


18

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.


5
for i in *.{png,PNG}
Glenn Jackman,

@glenn: Funzionerebbe anche quello (equivalente a `* .png * .PNG), anche se hai ancora bisogno di nullglob o del controllo dell'esistenza.
Gordon Davisson,

5

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.


1
find è comunque ricorsivo di default, quindi per ottenere lo stesso risultato che la domanda pone, dovresti farlo find -maxdepth 1 -iname "*.png"
Yab,

@Yab, hai perfettamente ragione. Ho trascurato questo aspetto.
Alain Pannetier,

1

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:

  • Presumo che tu voglia sia immagini in maiuscolo che minuscolo. Il separatore && significherebbe elaborare i file png solo se esistono file PNG, il che probabilmente non ha molto senso.
  • verranno visualizzati messaggi di errore se non viene trovato alcun file con nessuno dei due pattern.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.