2015-05-05 5 views
5

Sto scrivendo uno script di shell in cui ho bisogno di scorrere le directory e quindi eseguire il loop dei file al loro interno. Così ho scritto questa funzione:Ciclo su contenuto di directory vuoto in Bash

loopdirfiles() { 
    #loop over dirs 
    for dir in "${PATH}"/* 
    do 
     for file in "${dir}"/* 
      do 
       echo $file 
      done 
    done 
} 

Il problema è che riecheggia qualcosa come * path/to/dir/** su directory vuote.

C'è un modo per utilizzare questo approccio e ignorare questo tipo di directory?

+1

Se si utilizza 'path' come variabile nello script ** non **. Si interromperà l'esecuzione di comandi esterni come "PATH" è usato per quello. In generale le variabili ALL_CAPS dovrebbero essere evitate (tranne che per le variabili globali di script) in quanto sono "riservate" per la shell/etc. uso. –

risposta

2

È possibile tagliare il * dal nome della directory invece di ignorare completamente:

[[ $file == *"*" ]] && file="${file/%\*/}" 
#this goes inside the second loop 

Oppure, se si vuole ignorare la cartella vuota:

[[ -d $dir && $ls -A $dir) ]] || continue 
#this goes inside the first loop 

Un altro modo:

files=$(shopt -s nullglob dotglob; echo "$dir"/*) 
((${#files})) || continue 
#this goes inside the first loop 

Oppure si può accendere il nullglob (citato da Etan Reisner) e dotglob del tutto:

shopt -s nullglob dotglob 
#This goes before first loop. 


From Bash Manual

nullglob

Se impostato, Bash permette modelli di nomi di file che corrispondono a nessun file di espandi a una stringa nulla, piuttosto che a se stessi.

dotglob

Se impostata, bash include i nomi di file che iniziano con un ‘’ nei risultati di espansione dei nomi.

Nota: dotglob include i file nascosti (file con un . all'inizio nel loro nome)

+0

Esecuzione di 'ls' su un glob fallito per determinare se il glob fallito è un test relativamente costoso per questo scopo. –

+0

@EtanReisner, È sul primo ciclo, dove glob non è fallito .. – Jahid

+0

Ah vero. Questo è ancora un modo relativamente costoso per testare questa situazione poiché il glob fallito è facilmente rilevabile (se non si evita il problema con 'nullglob'). –

4

È possibile accendere lo nullglob option. Fa sì che i glob non corrispondenti si espandano in una lista vuota invece di essere lasciati non espansi.

shopt -s nullglob 
+0

Ho impostato questa opzione al di fuori della funzione e mi ha dato lo stesso risultato. – lerp90

+0

Assicurati di utilizzare 'bash' e non' sh' e assicurati di impostarlo nella stessa sessione di shell che prevedi di usarlo (ad esempio impostandolo nella tua shell corrente e poi eseguendo uno script con quella funzione non Guardalo). –