GNU/Linux >> Tutoriels Linux >  >> Linux

"pour fichier dans" numériquement au lieu d'alphabétiquement ? ?

Cette question a déjà des réponses ici :Parcourir les dossiers dans l'ordre numérique

(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

Linux
  1. Trier une partie d'un fichier ?

  2. Compter les lignes dans un fichier ?

  3. C ouvert vs ouvert

  4. Comment créer un fichier sous Linux à partir de la fenêtre du terminal ?

  5. Comment écrire un entier dans un fichier binaire à l'aide de Bash ?

Pourquoi j'utilise exa au lieu de ls sous Linux

Commande Bash printf

Éditeur VIM

Curl télécharge du HTML au lieu du fichier Zip réel ? Voici quoi faire

Qu'est-ce qu'un fichier .sh ?

Accidentellement utilisé la redirection de sortie > au lieu d'un tube |