Compresser chaque sous-répertoires en archive
Résolu
Sivenruot
Messages postés
9
Statut
Membre
-
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.
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.
A voir également:
- Le fichier à télécharger est une archive compressée. parmi les fichiers que contient cette archive : quel est le fichier avec le taux de compression le plus élevé ? quel est le fichier dont la taille a le plus diminué ?
- Comment réduire la taille d'un fichier - Guide
- Fichier bin - Guide
- Fichier epub - Guide
- Fichier rar - Guide
- Fichier .dat - Guide
4 réponses
Salut,
Entendons-nous bien, quand tu parles d'arborescence à 3 niveau tu parles de sous répertoires comme dans :
ou dans :
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
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.
Gates gave ^W sold you the windows.
GNU gave us the whole house.(Alexandrin)
#! /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)
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 !
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 !
Alors, j'ai fini par prendre le script de jslv et le modifier.
Tout a fonctionner correctement !
Pour les curieux :
Merci a tous pour votre aide ;)
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 ;)
ou
un, deux, trois, et je sors
?
ok, je sors!
XD
PS. À 3 tu peux rentrer : 1... 2... ;-)