(6 réponses)
Fermé il y a 3 ans.
J'ai un script générant un index basé sur chaque fichier dans un dossier. Tous les noms de fichiers sont un nombre avec une extension.
Comment puis-je modifier ma boucle pour les traiter dans l'ordre numérique ?
for file in xml/*.xml; do
...
done
Réponse acceptée :
Si vous avez GNU sort
qui a la possibilité de délimiter sur le \0
délimiteur que vous pouvez faire. De cette façon, le while
loop commencera à obtenir les fichiers dans l'ordre trié pour que vous puissiez les traiter. Remplacez le printf
option avec votre propre logique personnalisée.
shopt -s nullglob
printf '%s\0' xml/*.xml | sort -zV | while read -rd '' file; do
printf "%s\n" "$file"
done
shopt -u nullglob
Le nullglob
l'option est d'empêcher le shell de développer un glob vide s'il n'y a pas de xml
les fichiers se trouvent dans le dossier en cours. L'option -u
le désactive une fois votre traitement terminé.
Comme le souligne à juste titre Tony Speight, si vous ne voulez pas jouer avec les options du shell (par exemple, il peut être activé pour d'autres raisons), vous pouvez simplement définir le sous-shell et laisser l'expansion globale se produire
( shopt -s nullglob; printf '%s\0' xml/*.xml ) | sort -zV | while read -rd '' file; do
printf "%s\n" "$file"
done