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

Linux Discussion :

Shell et gestion de répertoire


Sujet :

Linux

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 13
    Points : 11
    Points
    11
    Par défaut Shell et gestion de répertoire
    Bonjour,
    pas trop familiarisé avec le shell, j'ai une demande de travaux avec, à savoir re-découper une arborescence de répertoire et je demande votre aide, au moins sur les pistes à suivre.

    La problématique : Un répertoire existe et suite à une extraction de fichiers dedans, se présente autant de répertoires que de fichiers générés. Le problème c'est la volumétrie trop importante, car il y en a directement dedans 130.000, or le file system utilisé ne peut excéder les 30.000 éléments par répertoire, donc temporairement celui-ci a été changé, mais cela va revenir comme avant.

    Au niveau du nommage du répertoire, il s'agit d'une séquence de 6 chiffres. L'idée serait donc de découper les répertoires en ensemble de sous répertoires de chiffre unitaire selon la séquence avec au final le fichier dedans. Ca boucle ainsi de chiffre en chiffre, on se retrouverait ainsi avec une arborescence à 7 niveaux au lieu de 1, ce qui allégerait considérablement le nombre de répertoires et fichier par répertoire et sous répertoire.

    ex illustré (/ correspond au séparateur entre répertoire) :
    - à la base :
    . x le répertoire général racine d'accueil des répertoires et fichiers, nous avons donc =>
    x / 123456 / fichier1.
    . un deuxième exemple 123457 donne =>
    x / 123457 / fichier2.
    - résultat voulu : suite à la découpe algorithmique à effectuer, tel que décrite plus haut, nous voulons donc =>
    . x / 1 / 2 / 3 / 4 / 5 / 6 / fichier1
    . x / 1 / 2 / 3 / 4 / 5 / 7 / fichier2

    Donc il va me falloir des pistes sur le nommage et le découpage de répertoire en boucle, car les fichiers ne seront que déplacés.

    Je vous remercie pour vos réponses.

    edit : Le shell est la piste de départ, mais pas forcément obligatoire non plus, ce qui compte c'est le résultat, si c'est plus simple en perl (que je ne gère pas vraiment non plus), je suis preneur.

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 596
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 596
    Points : 19 481
    Points
    19 481
    Par défaut
    Bonjour,

    une petite démonstration en guise d'aiguillage :
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    for file in x/*
    do if [ -d "$file" ]
       then repP="${file%%/*}" repC="${file##*/}"
            printf '%s - %s -> ' "$repP" "$repC"
            for ((x=0; x<${#repC}; x++))
            do tempRep+=(${repC:x:1})
            done
            printf -vnewRep '%s/' "${tempRep[@]}"
            echo "$repP/$newRep"
            unset newRep tempRep
       fi
    done
    x - 123456 -> x/1/2/3/4/5/6/
    x - 123457 -> x/1/2/3/4/5/7/
    avec mkdir -p et rm -R, ça devrait rouler...
    ?

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 739
    Points : 31 068
    Points
    31 068
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    Bonjour,

    une petite démonstration en guise d'aiguillage :
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    for file in x/*
    do if [ -d "$file" ]
       then repP="${file%%/*}" repC="${file##*/}"
            printf '%s - %s -> ' "$repP" "$repC"
            for ((x=0; x<${#repC}; x++))
            do tempRep+=(${repC:x:1})
            done
            printf -vnewRep '%s/' "${tempRep[@]}"
            echo "$repP/$newRep"
            unset newRep tempRep
       fi
    done
    x - 123456 -> x/1/2/3/4/5/6/
    x - 123457 -> x/1/2/3/4/5/7/
    avec mkdir -p et rm -R, ça devrait rouler...
    ?
    Peut-être un poil obscur pour qqun qui débute en shell non ???

    Je propose mon algo plus "académique"
    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
    24
    #!/bin/sh
     
    # Traitement de tous les répertoires de "x"
    for dir in x/*
    do
    	# Si ce n'est pas un répertoire on le passe
    	test ! -d "$dir" && continue
     
    	# On enlève le "x/"
    	dir=`basename $dir`
     
    	# Décomposition chiffre en répertoires
    	new=`echo $dir|sed -e "s/\([0-9]\)/\1\//g"`
    	echo "$dir => $new"
     
    	# Création de la nouvelle arborescence
    	mkdir -p "x/$new"
     
    	# Déplacement des fichiers de l'ancien vers le nouveau
    	mv "x/$dir/"* "x/$new"
     
            # Effacement ancien répertoire devenu inutile
            rmdir "x/$dir"
    done
    Test sur cette arborescence
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    .
    |-- tr.sh   => le script ci-dessus
    `-- x
        |-- 123456
        |   `-- fichier1
        `-- 123457
            `-- fichier2
     
    3 directories, 3 files
    Exécution du script
    moi@debian:~/aaa$ ./tr.sh
    123456 => 1/2/3/4/5/6/
    123457 => 1/2/3/4/5/7/
    Arborescence après exécution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    .
    |-- tr.sh
    `-- x
        `-- 1
            `-- 2
                `-- 3
                    `-- 4
                        `-- 5
                            |-- 6
                            |   `-- fichier1
                            `-- 7
                                `-- fichier2
     
    8 directories, 3 files

  4. #4
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Impeccable, ça marche parfaitement !

    Enfin, j'ai testé sur 200 répertoires, le vrai test, sera sur les 130000, espérons que ce soit juste plus long.

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

Discussions similaires

  1. [SHELL]La gestion d'arguments
    Par Ashgenesis dans le forum Linux
    Réponses: 10
    Dernier message: 01/06/2011, 18h38
  2. gestion des répertoirs en c!
    Par ashley dans le forum C
    Réponses: 3
    Dernier message: 10/08/2009, 13h16
  3. commande shell avec gestion des erreurs
    Par nymus7 dans le forum Programmation et administration système
    Réponses: 0
    Dernier message: 06/08/2008, 14h59
  4. ouvrir du shell explorer sur un répertoire
    Par trois_1 dans le forum C#
    Réponses: 1
    Dernier message: 19/06/2008, 12h36
  5. [MS-DOS] Gestion des répertoires
    Par raph707 dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 19/09/2006, 19h13

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