Tar désactiver/contouner arborescence

Fermé
gnugo - 28 sept. 2011 à 00:59
 gnugo - 4 oct. 2011 à 19:53
Bonjour,

je cherche à rassembler divers fichiers dans un seul fichier compressé en tar.gz

Le problème c'est que quand je fais par exemple:
tar -czvf lala.tar.gz /home/baba/fic*.txt /lala/caca/ba* /var/local/aa/bb/*.c

Au lieu de simplement m'enregistrer tous les fichiers que je lui demande dans l'archive tar,
il recrée d'abord tous les chemins, et je retrouve un répertoire home/baba, un autre /lala/caca, et un autre /var/local/aa/bb... et ainsi de suite

Comment faire pour qu'il ne recrée pas cette arborescence ?
Qu'il se contente d'insérer les fichiers que je lui indique sans chercher à recréer le chemin


Merci d'avance pour votre aide, cela m'aiderait beaucoup.


A voir également:

12 réponses

dubcek Messages postés 18755 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 14 novembre 2024 5 621
Modifié par dubcek le 2/10/2011 à 16:27
il faut la mettre sur la ligne de commande.
on peut faire comme ça
$ cat f1 
#!/bin/bash 

CMD="" 
for F in /home/baba/fic*.txt /lala/caca/ba* /var/local/aa/bb/*.c  ; do 
 CMD="$CMD -C ${F%/*} ${F##/*/}" 
done 
echo tar -cvzf x.tar $CMD 

$ ./f1 
tar -cvzf x.tar -C /home/baba fic*.txt -C /lala/caca ba* -C /var/local/aa/bb *.c 
2
Bonjour,

Tiens, en voilà une belle colle !
Je n'ai rien trouvé dans le man de tar.

A la limite, tu peux utiliser cpio :

Pour compresser :
ls lala.tar.gz /home/baba/fic*.txt /lala/caca/ba* /var/local/aa/bb/*.c | cpio -ov | gzip > fichiers_au_nom_bizarre.cpio.gz


Pour décompresser :
gunzip -c fichiers_au_nom_bizarre.cpio.gz | cpio -iv

Et si tu veux recréer l'arborescence, tu ajoutes un -d à cpio à la décompression (attention car contrairement à tar, il ne supprime pas d'office le slash initial).
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 418
28 sept. 2011 à 09:22
Salut,

Idem pour la man tar, rien de bien probant ;-((

Attention toutefois à la commande "ls" si les noms de fichiers comportent des espaces, ça va faire mal ;-)

Mieux vaut préférer la commande "find" et l'option "-print0" avec côté "cpio" l'option "-0" ou "--null" pour parer à toutes éventualités ;-))
0
dubcek Messages postés 18755 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 14 novembre 2024 5 621
28 sept. 2011 à 09:41
hello
et avec
tar -czvf lala.tar.gz -C /home/baba fic*.txt -C /lala/caca ba* -C /var/local/aa/bb *.c
0
merci, je vais essayer avec cpio, ça me permet de résoudre une partie de mon problème (transfert de fichiers par pipe via ssh)

le problème qui pourrait se poser c'est que dans le cas ou je compresse en fichier .cpio.gz, ce fichier peut etre destiné à des postes sous windows qui risquent de ne pas savoir comment l'ouvrir

ça m'embêterait de devoir décompresser avec cpio pour ensuite recompresser avec tar.
Le -C pourrait aussi etre une solution, merci pour cette réponse, mais ça risque d'etre compliqué à mettre en place dans mon cas: j'ai de grosses listes de fichiers générées dynamiquement.
0
Hé bien bonne nouvelle, je viens de regarder : 7zip supporte cpio :))
0

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

Posez votre question
Bonjour et merci pour vos réponses.

Mais hélas ça ne fonctionne pas : cpio se comporte exactement comme tar, il stocke les répertoires, et les recrée à l'extraction.

Quand je fais le cpio -iv, il cherche à parcourir arborescence des fichiers compactés dans le .tar, et comme ce chemin n'existe pas là ou j'extrais, j'ai droit à un message d'erreur. Avec le -d il me recrée l'arborescence, retour au point de départ.

Je ne trouve pas de solution avec les options de cpio
Auriez vous une solution ?
Merci
0
dubcek Messages postés 18755 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 14 novembre 2024 5 621
1 oct. 2011 à 13:56
utiliser tar -C en fabriquant une variable avec la liste des répertoires et fichiers:
CMD="-C dir1 fich1 -C dir2 fich2 -C dir3 fich3"
tar -czvf lala.tar.gz $CMD
0
merci je vais faire comme ça alors, pas d'autre solution.

Savez vous s'il est possible de passer toute cette chaine $CMD sur l'entrée standard de tar ? pour ne pas être limité
0
Sinon, aux grands maux les grands remèdes : tu crées un répertoire temporaire, et tu fais des liens hard vers tous tes fichiers dans ce répertoire, tu tarres, puis tu supprimes le répertoire.
0
Merci dubcek!

Pour la solution hard c'est pas possible, je n'ai accès qu'en lecture au serveur.
L'idée c'est de transférer tous ces fichiers en les passant dans un pipe par une seule commande.
J'ai donc besoin, uniquement, qu'il m'envoie dans le pipe le nom de fichier+son contenu, et pouvoir recreer les fichiers à l'arrivée. voilà pourquoi tar,zip,cpio me parraissaient bien...

ps: Savez vous comment renommer les fichiers avant de les mettre dans le tar ? par exemple /lala/lili.txt s'enregistrerait comme serv1-lili.txt dans le tar ? ( bon avec -C pour le rep, OK :D . mais pour le nom du fichier ?)


Merci:o
0
dubcek Messages postés 18755 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 14 novembre 2024 5 621
3 oct. 2011 à 12:38
il faudrait les renommer sur le disque avant le tar. sinon je ne vois pas
0
pas très pratique ces utilitaires tar,cpio :( à part pour faire de la sauvegarde...
Il en faudrait surement un autre plus adapté à mon cas mais je n' en trouve pas

merci pour l'aide en tout cas
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 418
3 oct. 2011 à 13:02
Ben à ce moment là il faut te faire un script sur mesure adapter à tes besoins...
0
tar et cpio sont faits justement pour faire de la sauvegarde, oui :)
Write programs that do one thing and do it well


Je ponds les solutions capilotractées sur ce sujet moi, alors une de plus, une de moins...

Dans une boucle "for", faire un echo du nom de fichier que tu veux, puis le contenu du fichier en Base64 (via uuencode).
0
Oui mais je serai alors obligé de placer le script sur chaque serveur, ce qui ne m'est pas possible. Ou alors faire de multiples actions avec ouverture de session à chaque fois à distance... peu importe je viens de trouver !!

J'utilise l'utilitaire pax, qui a une option extrêmement pratique : le -s pour faire une substitution avec les expr régulières... de quoi enfin me permettre de faire exactement ce que je veux :)

=> ls /lala/b*.txt /etc/*.conf /aa/bb/lala/caca/p* | pax -w -s '/.*\///' > archivenormalesansarborescencebizarre.pax

!
0