(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