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 GNU Discussion :

Filtrer&Trier des éléments (rep/fic) numérotés


Sujet :

Shell et commandes GNU

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 25
    Par défaut Filtrer&Trier des éléments (rep/fic) numérotés
    Bonjour tout le monde,

    Je cherche à faire un script qui récupère tout les dossiers d'un répertoire, puis qui ne garde que les dossiers appelés XXXX (X est un chiffre), les trie par ordre croissant, puis récupère le nom du dernier dossier.

    Voici ce que j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    dernierdossier(){
    # le script prend en paramètre un répertoire ($1)
    dernierdossier=$(ls -l $1 | sed -e '1,$ s/\(.\).* \([^ ]*\)$/\1 \2/' -e '/^-/d' -e '1d' | tr -s ' ' ';' | cut -d ';' -f 2 | sed -e '/^[0-9]\{4\}/!d' | sort -n | tail -n 1)
    echo $dernierdossier
    # ...
    }
    Je commence avec un ls -l. Je récupère le type et le nom de chaque élément (1er sed => "d répertoiren" ou "- fichiern"), je supprime toutes les lignes correspondant à un fichier (seconde partie du sed) ainsi que la première ligne du ls (celle qui donne le total d'éléments, 3ieme partie du sed). Ensuite, je supprime le "d " avant le nom de fichier (tr puis cut), et je supprime toutes les lignes qui ne commencent pas par 4 chiffres (dernier sed).
    Je trie ensuite par ordre lexicographique puis je récupère le dernier élément de la liste (sort et tail).

    Et je le teste avec ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    mkdir "Test"
    mkdir "Test/1000" "Test/1001"
    mkdir "Test/dossier-inutile" "Test/9999dossier-inutile" "Test/dossier-inutile9999"
     
    test=$(dernierdossier ./Stockage/)
    echo $test
    Et il me renvoie 9999dossier-inutile. Or je dois récupérer 1001.

    Je n'arrive pas à conserver uniquement les dossiers dont le nom est 4 chiffres. Mon script ne récupère que les dossiers qui commencent par 4 chiffres. J'essaie de tâtonner du coté de awk mais je suis encore très faible en scripts shell.

    Je vous passe les considérations sur l'inélégance totale de ce script ^^

    Pour l'histoire, si je trouve la solution, je dois l'adapter à des noms de dossiers à 2 chiffres et des noms de fichiers à 2 chiffres d'une extension donnée (XX.fic)

    En vous remerciant du temps que vous m'accorderez !

  2. #2
    Membre confirmé
    Inscrit en
    Avril 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Avril 2009
    Messages : 26
    Par défaut
    Ci-dessous, un bout de code te permettant d'effectuer des traitements (ou création de listes) suivant s'il s'agit d'un répertoire ou d'un fichier, et suivant la longeur du nom. Il faut voir si il est possible de l'adapter à tes besoins.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    for i in /REP/*
    do
      if [ -f "$i" ]
      then
        case "$i" in
              ??) traitement
                  ;;
          ??.fic) traitement
                  ;;
               *) traitement
                  ;;
        esac
     
      elif [ -d "$i" ]
        case "$i" in
            ????) traitement
                  ;;
               *) traitement
                  ;;
     
         esac
      fi
    done

  3. #3
    Membre expérimenté
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2007
    Messages : 248
    Par défaut
    Moi je dirais que tu dois rajouter une commande sed (à la suite des autres) pour supprimer tous les répertoire qui ne se terminent pas par un chiffre


  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 25
    Par défaut
    @Noop : Je veux bien, mais je vais quand même récupérer des dossiers nommés XXXX-blablblablabla-X ou XXXX-blablblablabla-XXXX par exemple. Ce que je ne veux pas


    @syjis : merci pour ce code C'est tout de suite plus glamour

    et effectivement il reste à définir effectivement le filtrage par chiffres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    case ????)
    # vérifier que c'est 4 chiffres (ou supprimer tout ce qui n'est pas 4 chiffres)
    # le sed que j'ai fait doit être réutilisable.

    Merci à vous je vais voir avec ça, je pense que ça devrait se résoudre plus simplement.

  5. #5
    Membre expérimenté
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2007
    Messages : 248
    Par défaut
    sinon, il y a awk:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "9999" |  awk '{if (length($1) <= 4) {if (int($1) == $1) {print $1}}}'
    Celà récupére uniquement les noms numeriques et de longueur égale ou inférieur a 4

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Par défaut
    Et pourquoi pas la commande find?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -type d -regex "./[0-9][0-9][0-9][0-9]"

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 09/05/2013, 00h14
  2. [AC-2007] Numérotation des éléments d'une Nomenclature
    Par djool dans le forum VBA Access
    Réponses: 8
    Dernier message: 14/05/2009, 08h03
  3. Réponses: 37
    Dernier message: 18/05/2008, 23h20
  4. [Tableaux] Trier sort() des éléments 1a,1b,2a,2b
    Par poulet1212 dans le forum Langage
    Réponses: 4
    Dernier message: 07/02/2008, 13h01
  5. Réponses: 6
    Dernier message: 20/07/2006, 11h25

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