IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes POSIX Discussion :

Parcourir les fichiers dans l'ordre lexicographique


Sujet :

Shell et commandes POSIX

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Points : 539
    Points
    539
    Par défaut Parcourir les fichiers dans l'ordre lexicographique
    Bonjour,
    J'ai un répertoire contenant des fichiers nommés par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    10_fichier17
    30_fichier4
    60_fichier13
    Je cherche a parcourir ces fichiers pour les 'sourcés' mais l'ordre est important.
    le 10 avant le 30 et le 60 en dernier.
    J'utilise une boucle for :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for i in *
    do
      echo "$i"
    done
    Il semble que ça fonctionne mais ...
    Par exemple debian dans /etc/X11/Xsession utilise run-parts --list pour parcourir les fichiers de Xsession.d
    La page de man de run-parts spécifie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Les  fichiers  sont  exécutés  dans l'ordre lexicographique de leur nom
    Alors, je me pose des questions.
    Etant donné que run-parts n'existe pas sur OpenBSD, si l'ordre des fichiers n'est pas garantie par la boucle for, il faudra que je trouve une autre solution.
    Qu'en pensez vous ?
    Merci.

  2. #2
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 238
    Points : 13 443
    Points
    13 443
    Par défaut
    Bonjour

    si l'ordre des fichiers n'est pas garantie par la boucle for, il faudra que je trouve une autre solution.
    En les triant ?
    C'est tellement simple qu'il fallait y penser.

    Les fichiers sont exécutés dans l'ordre lexicographique de leur nom
    Si les nombres ont le même nombre de chiffres (0 à gauche compris), l'ordre lexicographique et numérique sont le même.
    Sinon, non.
    9 est plus grand que 13 lexicographiquement.
    9 est plus petit que 13 numériquement.

    Qu'en pensez vous ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while read ligne
    do
        #traitement
    done < <(find . -type f -name="*_fichier*" | sort)
    (Note: il est sûr que find ne garantit pas l'ordre.)
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Points : 539
    Points
    539
    Par défaut
    Salut,
    Effectivement, je peux les trier
    Mais ma question n'est pas tout a fait celle là !
    Les trier alourdit mon code surtout s'il ne sert a rien
    Apparemment ma boucle for me renvoie les fichiers dans l'ordre souhaité.
    Mais est ce que je peux compter dessus ?
    En gros, Est ce que ma boucle for me renverra toujours cet ordre ? POSIX ?
    03...
    17..
    48..
    71..
    Cordialement.

  4. #4
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    Citation Envoyé par ctac_ Voir le message
    (...) La page de man de run-parts spécifie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Les  fichiers  sont  exécutés  dans l'ordre lexicographique de leur nom
    Alors, je me pose des questions.
    le problème de l'ordre lexicographique c'est celui là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    1_fichier
    10_fich
    10_fichier
    100_fichier
    2_fichier
    3_fichier
    si la totalité des fichiers concernés commencent par n chiffres (00..99 ou 000..999 etc.) et que chaque fichier a un préfixe unique (pas de "doublon" type 06_fic, 06_fichier ou 06_coincoin etc.), alors l'ordre lexicographique sera le même que l'ordre numérique.

    quant au globbing, bash nous garantit qu'il est trié alphabétiquement :
    Citation Envoyé par man bash
    Bash scans each word for the characters ‘*’, ‘?’, and ‘[’. If one of these characters appears, then the word is regarded as a pattern, and replaced with an alphabetically sorted list of filenames matching the pattern
    tant que ça reste avec des chiffres c'est facile, dès que les accents et autres caractères spéciaux s'en mêlent ça devient plus problématique, et au delà de l'ordre des fichiers dans le répertoire il faut aussi compter sur la locale (LANG=C find ...)

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Points : 539
    Points
    539
    Par défaut
    Bonjour et merci.
    C'est ce que j'avais raté.

    https://pubs.opengroup.org/onlinepub...l#tag_18_13_03


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If the pattern matches any existing filenames or pathnames,
    the pattern shall be replaced with those filenames and pathnames,
    sorted according to the collating sequence in effect in the current locale.
    Mes quelques fichiers commencent tous par 2 chiffres et 1 tiret bas donc je n'ai pas besoin de tri.
    Cordialement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Parcourir les motifs dans un fichier A et les supprimer dans le fichier B
    Par Piotree dans le forum Shell et commandes GNU
    Réponses: 27
    Dernier message: 22/11/2017, 13h46
  2. Réponses: 0
    Dernier message: 05/11/2010, 11h51
  3. Réponses: 3
    Dernier message: 07/02/2008, 14h34
  4. parcourir un fichier dans l'ordre inverse
    Par franc82 dans le forum C++
    Réponses: 11
    Dernier message: 09/02/2007, 14h56
  5. Parcourir les fichier du disque
    Par developpeur_mehdi dans le forum Langage
    Réponses: 2
    Dernier message: 14/12/2005, 10h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo