2011-09-19 23 views
12

Sto scorrendo alcuni file (tutti i file che iniziano con MOVIE) in una cartella con questo codice script bash:Bash scripting, ciclo attraverso i file nella cartella non riesce

for i in MY-FOLDER/MOVIE* 
do 

che funziona bene quando ci sono file in la cartella. Ma quando non ce ne sono, in qualche modo va avanti con un file che si chiama MY-FOLDER/MOVIE *.

Come posso evitarlo per entrare nelle cose dopo

do 

se non ci sono file nella cartella?

risposta

11
for i in $(find MY-FOLDER/MOVIE -type f); do 
    echo $i 
done 

Il find Utility è uno dei coltellini svizzeri di Linux. Inizia dalla directory che gli hai dato e trova tutti i file in tutte le sottodirectory, in base alle opzioni che gli vengono fornite.

-type f troverà solo file regolari (non directory).

Come ho scritto, il comando troverà anche i file nelle sottodirectory; è possibile impedire che con l'aggiunta di -maxdepth 1

+1

trovare è un coltellino svizzero, vero. ma usato in questo modo con ciclo for è incline a fallire su file con spazi. –

+1

Inoltre, questo verrà diviso in 'echo $ i' da quando hai lasciato I non quotato. Vedi [this] (http://stackoverflow.com/a/7039579/3076724) per esempi di migliore sintassi. – BroSlow

13

Con l'opzione nullglob.

$ shopt -s nullglob 
$ for i in zzz* ; do echo "$i" ; done 
$ 
+0

il codice funziona per me anche senza l'opzione 'nullglob', quello che sto facendo di sbagliato? –

+0

@DenisGolomazov: hai file corrispondenti. Prova a utilizzare un glob che non corrisponde a nessun file. –

+0

grazie, capito. Il risultato è stato 'zzz *'. –

3
 
for file in MY-FOLDER/MOVIE* 
do 
    # Skip if not a file 
    test -f "$file" || continue 
    # Now you know it's a file. 
    ... 
done 
Problemi correlati