[RESOLU] problème création archive.tar vers un autre dossier

tome_80

Expert
Bonsoir à tous,

Je suis débutant sous linux (complètement) et j'ai rencontré votre ami tar [options] [nom du fichier.tar]
... ça marche uniquement quand je veux tarrer des fichiers qui se trouvent dans le repertoire où je suis et crée une archive pareil > dans le même répertoire donc où je suis.

Ex: je suis dans /moi/Bureau$ tar -cvf archive.tar *.txt
ceci va creer une archive.tar dans le Bureau (où je suis) de tous les fichiers .txt qui se trouvent dans Bureau

Or, quand je veux faire
tar -cvf archive.tar *.txt /acheminement où je veux dans un dossier existant et vide/
il me marque
tar: Suppression de « / » au début des noms des membres

Pareil quand je lui dis d'où il faut chercher pour archiver et où créer le tar
ex: tar -cvf archive.tar /home/moi/Documents *.txt /home/moi/Bureau
pour archiver les .txt du /home/moi/Documents et creer l'archive sur le Bureau.....

il veut rien savoir,
il faut que j'enleve le /où je veux creer/ mais là il va archiver tous les .txt du home au Documents .......... histoire de fou.

Aidez moi svp. est ce que je dois etre dans le rep. où se trouvent les fichiers à archiver et obligatoirement créer l'archive dans le rep où je suis ? ou il y a moyen de le faire faire ce que je veux.

j'ai déjà parcouru le site du 0 et norte ami google....

Merci
 

lebrac

Habitué
Pour créer une archive tar de fichiers txt se trouvant dans /home/moi/Documents et l'afficher sur le bureau:
tar -cvf /home/moi/Bureau/archive.tar /home/moi/Documents/*.txt

il n'est pas obligatoire de se trouver dans le répertoire source pour créer une archive tar à un endroit quelconque à partir du moment où l'on donne le chemin complèt du fichier archive à créer et le chemin complèt des fichiers à archiver.

De façon générale, tar s'utilise comme ceci:
tar -cvf /rep1/rep2/rep3/nom_de_fichier.tar /rep4/rep5/rep6/nom_de_fichiers_a_archiver.

De même pour archiver un répertoire entier:
tar -cvf /rep1/rep2/archive.tar /rep3/rep4

Si cela peut téclairer ;)
 

tome_80

Expert
Bonsoir,

D'abord je te remercie pour ta réponse très clair.
En effet ça a résolu mon problème,
de tarrer /où je veux nom.tar/ /d'où je veux/

ce qu'il me paraissait bizarre c'était que dans l'archive je trouvais le rep home avec ses sous reps. et à la fin les .txt voulus. En fait c'est juste l'acheminement qu'il garde et il n'archive pas le home même et ses sous reps. comme j'ai cru. Donc c'est clair

Je suppose que ça devrait marcher pareillement dans l'autre sens, de detarrer.

donc je essaye:
tar -xvf /l'acheminement du txt.tar/ /acheminement/rep/Ici vide/
j'obtiens:
tar: /acheminement/rep/Ici vide non trouvé dans l'archive
tar: Arrêt avec code d'échec à cause des erreurs précédentes


Comme s'il cherchait le dossier ici vide dans l'archive.tar que je veux extraire.....
j'ai essayé d'extraire dans un rep existant et aussi de créer un rep à la fin de l'acheminement, mais sans succès.

j'essayerai en attendant de votre réponse

Merci

 

lebrac

Habitué
Lorsque un fichier ou un répertoire contient un espace dans son nom, il est impératif de protéger par des guillemets. Faut pas chercher à comprendre, c'est comme ça tant sous Linux que sous Unix.

Donc cela donnera ceci pour ton exemple:

tar -xvf /l'acheminement du txt.tar/ "/acheminement/rep/Ici vide/"
 

tantal_fr

Grand Maître
Tout à fait, et sous windows aussi.

Une bonne pratique consiste, d'ailleurs, à ne pas utiliser d'espaces dans les nom de fichier ou dossier, et de toujours prévoir le cas où il y en aurai lorsque l'on fait un script ou un programme.
 

tome_80

Expert
non........
En fait il n'y a pas des espaces .... ici vide est un exemple j'aurais du mettre ici_vide, désolé.
Ignorez cette lacune.....
je reprend le cas concret.

tar -xvf /l'acheminement_du_txt.tar/ /acheminement_où_je_veux_extraire/Ici_vide

j'obtiens:
tar: /acheminement_où_je_veux_extraire/Ici_vide non trouvé dans l'archive
tar: Arrêt avec code d'échec à cause des erreurs précédentes

 

lebrac

Habitué
tar -xvf /l'acheminement_du_txt.tar/ /acheminement_où_je_veux_extraire/Ici_vide
ne fonctionnera pas puisque tu lui demande de désarchiver "/acheminement_où_je_veux_extraire/Ici_vide" qui n'existe pas dans l'archive. J'ai donné cette solution par erreur .... rhooo honte à moi ...

Lorsque l'on archive des fichiers avec leur chemin absolu, on désarchivera au même endroit, c'est à dire que l'on va faire comme un restore à l'emplacement d'origine. Pour désarchiver ailleurs que l'endroit d'origine, il faut alors archiver avec un chemin relatif.

Ex: "tar -cvf /monrep/archive.tar /rep1/rep2/*.txt" archive tous les fichiers avec le chemin absolu. Dès lors, lorsque l'on exécutera "tar -xvf /monrep/archive.tar", il replacera les fichiers txt à leur emplacement d'origine. Où que soit placé le fichier archive.tar, on ne pourra pas faire autrement que de remettre à l'emplacement d'origine.
Par contre, si l'on exécute "tar -cvf /monrep/archive.tar ./rep1/rep2/*.txt" (il y a un point juste devant /rep1), il sera alors possible de désarchiver ailleurs qu'à l'emplacement d'origine à condifion de placer le fichier archive.tar à la "racine" du désarchivage. De ce fait, si l'on place l'archive dans /monrep2 et que l'on exécute ensuite "tar -xvf /monrep2/archive.tar", on obtiendra alors les fichiers txt dans /monrep2/rep1/rep2/

Jespère que cela t'éclairera encore un peu mieux. Expliquer par écrit n'est pas toujours évident ;)
 

tome_80

Expert
Bonsoir lebrac,

J'essaye de comprendre le "principe"...
je n'arrive pas à faire ce que je veux.

j'ai noté que le . est important mais je n'ai pas compris la "condition"
Utilisons les termes "source" et "destination" pour qu'on s'en mêle pas.....

quand je fait tar -xvf
Dois je être dans le rep qui contiens le dossier.tar pour l'extraire où je veux ?
Ou je dois être dans le racine de "où je veux" pour extraire
Comment je dois me positionner par rapport au dossier.tar ?
je sais ce que c'est chemin relatif et absolu.
J'ai compris pour quoi il me dit "non trouvé dans l'archive" car il cherche comme tu dis l'acheminement d'origine....

Tu peux m'envoyer un lien qui explique ça, je veux pas te faire faire mon boulot non plus.

Si quelqu'un d'autre a une autre explication il faut pas hésiter..

Merci
Merci
 

zeb

Modérateur
Salut,

Pour bien commencer, il faut lire la page du manuel concernant la commande.
Ensuite, un petit point de vocabulaire : on parle de chemin pas d'acheminement.

La commande tar accepte un nom de fichier en paramètre, juste derrière l'option f.
C'est le nom du tarball à traiter : création, extraction, etc.
Si ce fichier est dans le répertoire courant, aucun besoin de préciser le chemin. S'il est ailleurs, c'est obligatoire. Mais ça, c'est pareil pour toutes les autres commandes.

Il est peu probable que l'archivage doivent retenir les chemins absolus.
Si tu veux prendre tes documents et les donner à lebrac, il faudra que tu archives ces fichiers de chez toi :

/home/tome/mes_docs/fichier.jpeg
/home/tome/mes_docs/fichier.conf
/home/tome/mes_docs/fichier.sh

Et que lebrac les désarchives chez lui :

/home/lebrac/mes_docs/fichier.jpeg
/home/lebrac/mes_docs/fichier.conf
/home/lebrac/mes_docs/fichier.sh

Donc par principe, on enregistre que l'arborescence en commun.
On se place donc dans /home/tome/, et on lance une de ces commandes :
[fixed]$> tar cf tarball.tar mes_docs/fichier.jpeg mes_docs/fichier.conf mes_docs/fichier.sh
$> tar cf tarball.tar mes_docs/
$> tar cf tarball.tar -C mes_docs *[/fixed]
Regarde l'option -C dans le manuel.

Si tu veux absolument utiliser des chemins absolus, utilise l'option -P.

;)
 

VaderFR

Grand Maître
au risque de faire du HS, il y a encore plus "fun".

admettons que vous avez une machine A dont vous voulez sauvegarder des données.

lesquelles sauvegardes seraient incrémentales, afin de limiter l'utilisation des disques.
cela se fait avec un fichier d'index : tar -g fichier_index -czf fichier.tar.gz repertoire_a_sauver

il suffit alors, lorsque l'on indique le nom du fichier index a utiliser, de préciser une variable de mois ou de semaine, afin de créer un nouveau fichier index tous les mois/toutes les semaines.... et donc, lorsque le fichier index n'existe pas encore, la sauvegarde est totale.

cependant, vous risquez sur cette machine A de ne pas avoir la place de stocker les sauvegardes.
Il faudrait donc envoyer ce fichier sur un serveur de sauvegarde B.
Et directement. pas faire le tar.gz sur la machine locale avant de le copier.

donc, envoyer du flux (compressé si possible) sur un serveur B.

quelles options ?
- partage SAMBA : pas très sécurisé, en plus monter une ressource SAMBA via un script est assez casse-pieds.
- ftp : pareil, pas très simple à mettre en œuvre
- SSH :D wiwi, c'est possible, et avec une authentification par clé c'est simple à mettre en œuvre. Et en plus c'est sécurisé.

on envoie donc le tar.gz sur une connexion ssh, on récupère le flux avec split afin de créer un fichier (faire tar et récupérer avec gzip ne marche pas)

j'ai testé les diverses commandes susceptibles de récupérer du flux pour en faire un fichier, split semble être le meilleur moyen.

split va "scinder" le flux en.....un seul, en fait, fichier. on renommera ensuite le fichier .tar.gz.00 (limite 2 To sur ext >=3) en .tar.gz pour pouvoir l'exploiter plus tard.
et au cas où on envoie aussi le fichier index (créé sur A) sur le répertoire de B, afin de pouvoir toujours exploiter les sauvegardes incrémentales situées sur B en cas de défaillance de la machine A

tant qu'on y est, la sauvegarde (tar.gz) prend la date du jour, plus facile pour s'y retrouver ensuite

quelques lignes du script sh correspondant :
C:
# le comportement de la commande $(date +format) à l'intérieur des parenthèses du SSH étant imprévisible,
# il vaut mieux stocker le résultat dans une variable)
# ici, la date du jour : le nom complet du jour (%A) et la date complète année-mois-jour (%F), séparés par un tiret
datesav=$(date +%A-%F);
# envoi du flux incrémental, récupération par split, renommage du fichier splité (pas réellement splité en fait)
 tar -g index-$(date +%m-%Y) -czf - repertoire_a_sauvegarder \
    --exclude="repertoire_a_ne_pas_sauvegarder_1" \
    --exclude="repertoire_a_ne_pas_sauvegarder_2" |
(
    ssh user@serveur_B "
        cd /repertoire_ou_mettre_la_sauvegarde
        split -b 2T -d - nom_sauvegarde-$datesav.tar.gz.
        mv nom_sauvegarde-$datesav.tar.gz.00 nom_sauvegarde-$datesav.tar.gz"
)
# et envoi de l'index (en cas de défaillance de la machine A, il faudra l'index pour pouvoir exploiter les sauvegardes sur B)
scp index-$(date +%m-%Y) user@serveur_B:/repertoire/

bien sûr, on pourrait "jouer" d'avantage en mettant un script "générique" qui récupérerait (wget ?) du serveur B des paramètres (quoi sauvegarder, quand, , comment "profil" et où), et après la sauvegarde, demanderait (wget, encore, ou ssh) au serveur B de cataloguer la sauvegarde.


___________________
moderator dixit : j'ai ajouté la balise [code] pour mieux présenter les choses. Fais-le de toi-même la prochaine fois. ;)
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 134
Messages
6 718 059
Membres
1 586 394
Dernier membre
Manoushk
Partager cette page
Haut