2015-04-03 13 views
8

Voglio loop su tutti i file che corrispondono l'estensione jpg o txt. Io uso:Come abbinare niente se un nome di file glob non ha corrispondenze

for file in myDir/*.{jpg,txt} 
do 
    echo "$file" 
done 

Problema: Se la directory contiene alcun file jpg a tutti, il circuito avrà un'iterazione con uscita myDir/*.jpg. I thougth * saranno sostituiti da un file arbitrario (e se non esiste alcun file non può essere espanso). Come posso evitare l'iterazione indesiderata?

+0

Se un modello non ha corrispondenze, il comportamento/POSIX predefinito è quello di trattare il modello come una stringa letterale, piuttosto che ignorare o rimuovere il modello. – chepner

+0

Non correlato alla domanda, ma si noti che le parentesi non fanno parte del modello. Sono una scorciatoia 'bash' per generare una serie di stringhe correlate, e come tali espandere alla stringa' myDir/*. Jpg myDir/*. Txt' prima che inizi la corrispondenza del modello. – chepner

risposta

12

Usare questo per evitare l'iterazione indesiderati:

shopt -s nullglob 

Da man bash:

nullglob: Se impostata, bash permette modelli che soddisfano nessun file (vedi espansione di percorso sopra) di espandersi in un stringa nulla, piuttosto che loro stessi.

See: help shopt e shopt