Sauvegarde selective

Résolu/Fermé
chris - 22 sept. 2008 à 10:32
 chris - 22 sept. 2008 à 17:26
Bonjour,
Je cherche à effectuer une sauvegarde selon un liste pré-établie, je m'explique:
j'ai une liste contenant des répertoires à sauvegarder, et je voudrais écrire un script qui check cette liste, et sauvegarde le contenu de chaque répertoire dans un .tar.gz , le fichier résultat (.tar.gz) devant inclure tous les répertoires listés dans la liste.
Quelqu'un aurait une piste ?
Merci d'avance.
A voir également:

11 réponses

asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022 426
22 sept. 2008 à 11:02
Bonjour,

Peux-tu mettre un exemple de cette liste ?
Il faut qu'on sache comment sont indiqués les répertoire/ficihers dans celle-ci (chemins absolu ou relatif, contenant des jokers, etc.)

A plus
0
en fait mon fichier "liste" contient les noms des répertoires:
#cat liste-fich
toto
titi
tata

J'ai un repertoire racine commun /datas , et ensuite /datas/disk1/titi/ /datas/disk2/tata/ , mais par exemple pas tutu qui n'est pas dans mon fichier "liste".
0
asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022 426
22 sept. 2008 à 11:22
Ok

/datas/disk1 ne contient que tata ? ou il contient d'autre répertoires ne faisant pas partie de la liste ?
/datas/disk2 ne peut pas contenir de dossier tata ? ou au contraire peut-il en contenir un, et dans ce cas, faut-il le sauvegarder ?

Dans tout les cas, vu que la liste contient des chemins relatifs (sans la racine) et que cette racine n'a de commun que le /datas, ce n'est pas le plus simple.

Idéalement, si tu peux agir sur la liste, il faudrait que tu mettes que des chemins absolus
/datas/disk1/tata
/datas/disk2/toto
etc.

Ou relatif, mais incluant toute la partie variable
disk1/tata
disk2/toto
etc.

Sans ça, c'est faisable aussi, mais il faudra au préalable une commande find ou prendre le risque de sauvagarder des truc du genre:
/datas/disk1/tata/*
/datas/disk1/tutu/tata/* (y compris si tutu n'est pas dans la liste)
etc.

Si tu peux donner un peu plus de détails, on pourra te proposer des commandes plus précises,

Mais là, le nombre de possibilités est bien élevé pour te donner une commande satisfaisante :)

++
0
Bonjour,

mettez dans votre fichier
tar -cvf - \
folder1 \
folder2 \
..
foldern | gzip > tar.gz

un script qui check cette liste

Je ne sais pas comment détecter les répertoires que vous auriez oublié de citer.

Manu
0
Mon problème est que les sous-répertoires listés dans mon fichier ne se trouvent pas tous dans le même répertoire d'origine, (voir explication au-dessus)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Rebonjour

les sous-répertoires listés dans mon fichier ne se trouvent pas tous dans le même répertoire d'origine


Ca ne change rien. Ils ont tous un nom absolu ou relatif.

A moins que vous ne vouliez voir apparaître aucun chemin dans le tar (vous le l'avez pas dit, je suppose que ce n'est pas ce que vous voulez), sinon il y a un risque de synonymie.

Manu
0
En effet je veux sauvegarder les chemins absolus, si dans ma liste j'ai:
tata
toto
titi

je veux pouvoir sauvegarder:
/datas/disk1/tata/*
/datas/disk1/titi/*
/datas/disk2/tata/*
/datas/disk1/tutu/tata/*

mais pas
/datas/disk1/tutu/* (mis à part si il y a tata ou toto dessous, bien sur)

En effet j'ai de nombreux autres répertoires sous /datas/disk1/ et /datas/disk2/ que je ne veux pas sauvegarder si ils ne font pas partie de la liste

J'espere avoir donné un max d'info, merci !
0
Petite info supplémentaire, mon fichier "liste" contient une centaine de nom de répertoires, liste qui va evoluer au fil des semaines, d'ou le besoin d'automatiser la tache en venant scruter ce fichier !
0
asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022 426
22 sept. 2008 à 11:55
Alors dans ce cas, la commande suivante fonctionne
tar cvzf test.tar.gz $( for line in $(<liste); do  find /datas -type d -name $line; done )
Cependant, ce n'est pas idéal cf exemple:
$ find /datas
/datas
/datas/disk1
/datas/disk1/tata
/datas/disk1/tata/a
/datas/disk1/tata/b
/datas/disk1/tata/c
/datas/disk1/titi
/datas/disk1/titi/a
/datas/disk1/titi/b
/datas/disk1/titi/c
/datas/disk2
/datas/disk2/toto
/datas/disk2/toto/a
/datas/disk2/toto/b
/datas/disk2/toto/c
/datas/disk2/toto/tata
/datas/disk2/toto/tata/a
/datas/disk2/toto/tata/b
/datas/disk2/toto/tata/c
/datas/disk2/tutu
/datas/disk2/tutu/a
/datas/disk2/tutu/b
/datas/disk2/tutu/c
/datas/disk2/tutu/tata
/datas/disk2/tutu/tata/a
/datas/disk2/tutu/tata/b
/datas/disk2/tutu/tata/c
$ cat liste 
tata
titi
tutu
$ tar cvzf test.tar.gz $( for line in $(<liste); do  find /datas -type d -name $line; done )
tar: Retrait de << / >> de t^ete des noms des membres
/datas/disk1/tata/
/datas/disk1/tata/a
/datas/disk1/tata/b
/datas/disk1/tata/c
/datas/disk2/toto/tata/
/datas/disk2/toto/tata/a
/datas/disk2/toto/tata/b
/datas/disk2/toto/tata/c
/datas/disk2/tutu/tata/
/datas/disk2/tutu/tata/a
/datas/disk2/tutu/tata/b
/datas/disk2/tutu/tata/c
/datas/disk1/titi/
/datas/disk1/titi/a
/datas/disk1/titi/b
/datas/disk1/titi/c
/datas/disk2/tutu/
/datas/disk2/tutu/a
/datas/disk2/tutu/b
/datas/disk2/tutu/c
/datas/disk2/tutu/tata/
/datas/disk2/tutu/tata/a
/datas/disk2/tutu/tata/b
/datas/disk2/tutu/tata/c
Observe bien les lignes en gras: /data/disk2/tutu/tata corrspond a tata dans la liste, mais /data/disk2/tutu correspond aussi a tutu dans la liste donc /data/disk2/tutu/tata est ajouté à l'archive

Si ce n'est pas grave en soit (el le prenant é fois, au mons, il est sauvegardé) selon le volume de ce répertoire, ça peut détruire tes perfs, et augmenter considérablement, le poids de l'archive :(

L'idéal serait que tu puisse agir en amont sur la liste pour détailler plus ce que tu dois sauvegarder.

Cordaielement
0
Je vois le problème, ceci-dit j'ai très peu de chances (voir aucune !) d'avoir une arborescence comprenant 2 noms de répertoires se trouvant dans ma liste.
Je teste la commande mais je crois que c'est la solution, merci beaucoup !
0
asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022 426
22 sept. 2008 à 12:50
j'ai très peu de chances (voir aucune !) d'avoir une arborescence comprenant 2 noms de répertoires se trouvant dans ma liste
Dans ce cas, c'est impecc, l'aute solution était de traiter les repertoire un par un en mettant l'archive à jour a chaque fois...

0
Non je confirme je l'ai fais tourner, c'est parfait, et si je veux être gourmand et exclure des extensions de fichier (*.bak, *.tmp etc...) ça complique beaucoup la manip ?
En tout cas merci beaucoup.
0
asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022 426
22 sept. 2008 à 14:43
Non,

Ca ne complique pas trop, il suffit de modifier la commande comme suit:
$ tar cvzf test.tar.gz $( for line in $(<liste); do  find /datas -type d -name $line; done ) --exclude *.bak --exclude *.tmp
Ou bien de préciser un fichier d'excludes
$ cat> exclude<<EOF
> *.bak
> *.tmp
> EOF
$ tar cvzf test.tar.gz $( for line in $(<liste); do  find /datas -type d -name $line; done ) --exclude-from exclude
A plus
0
Merci beaucoup !
0