Compresser chaque sous-répertoires en archive

Résolu
Sivenruot Messages postés 9 Statut Membre -  
Sivenruot Messages postés 9 Statut Membre -
Bonjour à tous !

Alors voilà, j'aimerais faire un script bash qui permettrait de réaliser les opérations suivantes.

Analyser un répertoire de manière récursive en choisissant le niveau de récursion.
Transformer chaque sous-dossier en archive(zip par exemple) indépendante, reprenant le nom du sous-dossier et l'enregistrant dans un répertoire donné.

Dans l'arborescence de mon répertoire test j'ai : Base_Test---->Test1---->dossier1---dossier2---dossier3...

Du coup, avec un niveau de récursion de 3, le script devrais me fournir les archives "dossier1.zip, dossier2.zip, dossier3.zip..." le tout de le répertoire output donné.

Donc, j'ai deux question pour lesquelles j'aurais besoin d'un peu d'aide.

1- La méthodologie est-elle la bonne (pensez-vous qu'un script structurer de la sorte fonctionnerais convenablement) ?
2- Comment obtenir seulement un certain niveau de récursion ? J'avais tenté la commande "dir" mais soit elle n'est pas récursive du tout, soit elle l'est complètement :/ .

Voila, merci d'avoir lû mon message jusqu'au bout et du temps que vous prendrez pour y répondre.

4 réponses

  1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Salut,

    Entendons-nous bien, quand tu parles d'arborescence à 3 niveau tu parles de sous répertoires comme dans :

    Base_A
    :
    |-- Base_A
    | |-- rep1
    | |-- rep2
    | |-- rep3
    | '-- rep4

    ou dans :

    Base_B
    :
    |-- Base_B
    |-- rep1
    | |-- repa
    | | |-- rep_x
    | | |-- rep_y
    | | '-- rep_z
    | '-- repb
    | |-- rep_x
    | |-- rep_y
    | | |-- sousf
    | | '-- sousg
    | '-- rep_z
    '-- rep2
    |-- repa
    | |-- rep_x
    | |-- rep_y
    | '-- rep_z
    '-- repb
    |-- rep_x
    |-- rep_y
    '-- rep_z

    0
    1. Utilisateur anonyme
       
      un, deux, trois je sors
      ou
      un, deux, trois, et je sors
      ?

      ok, je sors!
      XD
      0
    2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Ben j'espère qu'il fait un soleil de plomb ou qu'il tombe des trombes d'eau ;-D



      PS. À 3 tu peux rentrer : 1... 2... ;-)
      0
  2. jisisv Messages postés 3678 Statut Modérateur 936
     
    Tu pourrais t'inspirer de ceci pour déterminer les répertoires ayant un certain niveau de profondeur, et utiliser la sortie pour effectuer les archivages selon tes besoins.
     #! /bin/bash
    
    function usage
    {
        echo "Usage $(basename $0) rootdir level " >&2
    }
    
    
    # echo $#
    if [ $# -ne 2 ]; then 
        usage $0;
        exit 0;
    fi
    
    ROOTDIR=$1
    if [ !  -d $ROOTDIR  ] ; then
        echo "$ROOTDIR is not a directory" >&2
        exit 1
    fi
    
    shift
    LEVEL=$1
    re='^[0-9]+$'
    if ! [[ $LEVEL =~ $re ]] ; then
       echo "$LEVEL is not numeric" >&2
       usage $0
       exit 1
    fi
    if [ ${LEVEL} -eq  0 ] ; then
        LEVEL=1
    fi
    
    testpath=""
    for cnt in $( seq 1 ${LEVEL} ) ; do
        testpath="${testpath}.*\/"
    done
    
    find ${ROOTDIR}  -maxdepth ${LEVEL}  -type d | egrep ${testpath}
    


    Gates gave ^W sold you the windows.
    GNU gave us the whole house.(Alexandrin)
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Salut,

      Euh...
      find rep/ -maxdepth 3 -type d -exec...
      devrait faire le boulot normalement sans sortir la grosse artillerie, non ? ;-\
      0
    2. jisisv Messages postés 3678 Statut Modérateur 936
       
      Tant qu'on y est, faisons les choses proprement...
      0
  3. Sivenruot Messages postés 9 Statut Membre
     
    Salut à tous et merci pour vos réponses détaillées.

    Mon arborescence ressemble à ça :

    Noms_Base
    :
    Dossier_A
    |
    |
    >Alexis
    >Alexandre
    >etc...
    Dossier_B
    |
    |
    >Benjamin
    >Bob
    >Ben

    Le but étant d'obtenir les archives des noms séparément. Pour ce qui est du zip, puisque les fichiers sont destiné à l'exportation et que ce format est un peu plus connus que le tar, j'ai pensé que c'était peu être mieux. Je me demande si winrar, où 7zip gèrent le format tar ?

    Je vais tenter ta commande du find des que je retrouve mon PC. Et je vous tiens au jus ;-)

    Encore merci pour votre aide précieuse !
    0
  4. Sivenruot Messages postés 9 Statut Membre
     
    Alors, j'ai fini par prendre le script de jslv et le modifier.

    Tout a fonctionner correctement !

    Pour les curieux :


    #!/bin/bash

    function usage
    {
    echo "Usage $(basename $0) DirBASE RERCURSION OUTPUTfullway PASSWORD" >&2
    }

    #echo $#
    if [ $# -ne 4 ]; then
    usage $0;
    exit 0;
    fi

    ROOTDIR=$1
    if [ ! -d $ROOTDIR ] ; then
    echo "$ROOTDIR is not a directory" >&2
    exit 1
    fi

    shift
    LEVEL=$1
    re='^[0-9]+$'
    if ! [[ $LEVEL =~ $re ]] ; then
    echo "$LEVEL is not numeric" >&2
    usage $0
    exit 1
    fi
    if [ ${LEVEL} -eq 0 ] ; then
    LEVEL=1
    fi

    testpath=""
    for cnt in $( seq 1 ${LEVEL} ) ; do
    testpath="${testpath}.*\/"

    OUTPUT=$2
    PASSWORD=$3

    done

    find ${ROOTDIR} -maxdepth ${LEVEL} -mindepth ${LEVEL} -type d -exec 7z a -t7z -m0=lzma -mfb=64 -md=32m -ms=on -mx=9 -mhe=on -p${PASSWORD} ${OUTPUT}{}.7z {} \;
    cd ${OUTPUT} \;
    find -name *.7z -exec mv {} ${OUTPUT} \;
    rm -dir -f */ \;



    Merci a tous pour votre aide ;)
    0