Compresser chaque sous-répertoires en archive

Résolu/Fermé
Sivenruot Messages postés 8 Date d'inscription dimanche 29 juin 2014 Statut Membre Dernière intervention 17 août 2014 - 1 août 2014 à 23:57
Sivenruot Messages postés 8 Date d'inscription dimanche 29 juin 2014 Statut Membre Dernière intervention 17 août 2014 - 4 août 2014 à 19:31
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

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
2 août 2014 à 09:24
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
Utilisateur anonyme
2 août 2014 à 10:08
un, deux, trois je sors
ou
un, deux, trois, et je sors
?

ok, je sors!
XD
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
2 août 2014 à 10:12
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
jisisv Messages postés 3645 Date d'inscription dimanche 18 mars 2001 Statut Modérateur Dernière intervention 15 janvier 2017 934
Modifié par jisisv le 2/08/2014 à 10:08
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
2 août 2014 à 09:45
Salut,

Euh...
find rep/ -maxdepth 3 -type d -exec...
devrait faire le boulot normalement sans sortir la grosse artillerie, non ? ;-\
0
jisisv Messages postés 3645 Date d'inscription dimanche 18 mars 2001 Statut Modérateur Dernière intervention 15 janvier 2017 934
2 août 2014 à 10:18
Tant qu'on y est, faisons les choses proprement...
0
Sivenruot Messages postés 8 Date d'inscription dimanche 29 juin 2014 Statut Membre Dernière intervention 17 août 2014
2 août 2014 à 20:56
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
Sivenruot Messages postés 8 Date d'inscription dimanche 29 juin 2014 Statut Membre Dernière intervention 17 août 2014
4 août 2014 à 19:31
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