(6 risposte)
Chiuso 3 anni fa.
Ho uno script che genera un indice basato su ogni file in una cartella. Tutti i nomi di file sono un numero con estensione.
Come posso modificare il mio ciclo per elaborarli in ordine numerico?
for file in xml/*.xml; do
...
done
Risposta accettata:
Se hai GNU sort
che ha la possibilità di delimitare su \0
delimitatore che puoi fare. In questo modo il while
loop inizierà a ricevere i file nell'ordine ordinato per l'elaborazione. Sostituisci il printf
opzione con la tua logica personalizzata.
shopt -s nullglob
printf '%s\0' xml/*.xml | sort -zV | while read -rd '' file; do
printf "%s\n" "$file"
done
shopt -u nullglob
Il nullglob
l'opzione è impedire alla shell di espandere un glob vuoto se non è presente xml
i file si trovano nella cartella corrente. L'opzione -u
lo annulla al termine dell'elaborazione.
Come sottolinea giustamente Tony Speight, se non vuoi pasticciare con le opzioni della shell (ad esempio potrebbe essere abilitata per altri motivi) puoi semplicemente impostare nella sottoshell e lasciare che l'espansione glob avvenga
( shopt -s nullglob; printf '%s\0' xml/*.xml ) | sort -zV | while read -rd '' file; do
printf "%s\n" "$file"
done