Fichiers .tar sans structure de répertoire

32

J'utilise .tardes fichiers avec le chemin example/super_user/Output.*.

Le résultat .tarressemble à ceci:

+ example
    + super_user
          - Output.zip
          - Output.xml
          - Output.txt

Mais je veux que le fichier soit comme suit:

- Output.zip
- Output.xml
- Output.txt

Savez-vous comment je peux y parvenir tout en étant dans un autre répertoire?

Der Hochstapler
la source
Assurez-vous d'éviter les tarbombes avec des archives comme ça.
grawity
tar --strip-components = 1000?
Zaar Hai

Réponses:

11

tar conservera la structure des fichiers et des dossiers, donc je ne pense pas qu'il y ait moyen de demander à tar d'aplatir la hiérarchie au moment de la création.

Une solution de contournement consiste à changer temporairement de répertoire, à créer le tar, puis à revenir en arrière - un exemple rapide ci-dessous:

cd example/super_user && tar -cvf ../../result.tar Output.* && cd ../..
Gaffe
la source
27

Si le répertoire 'exemple' est à la racine du système de fichiers, voici une autre façon:

tar -C /example/super_user -cvf result.tar .

cela changera de répertoire au point où vous voulez faire le tar. La mise en garde est que s'il y a des sous-répertoires sous / example / super_user, la structure du répertoire sera préservée pour ces sous-répertoires.

Anthony Walters
la source
1
C'est la réponse au problème actuel. La mise en garde mentionnée n'est pas un problème dans ce cas. Toutes les autres réponses sont des solutions de contournement pour tenir compte des variations du problème.
joki
C'est en effet la solution à cette question. Le répertoire ne doit pas être la racine, en supposant que la structure du répertoire /home/u/foo/bar, dir dir. /home/b, tar -C foo/bar -cvf qiz.tar .Fonctionne bien. Une mise en garde cependant, c'est que vous ne pouvez pas utiliser de caractères génériques, c'est tar -C foo/bar -cvf qiz.tar *.log-à- dire , tar -C foo/bar -cvf qiz.tar "*.log"ou tar -C foo/bar -cvf qiz.tar "foo/bar/*.log"ne fonctionnera pas.
Brice
1
Il convient de noter que vous pouvez utiliser -Cplusieurs fois dans une seule tarcommande si vous devez ajouter plusieurs fichiers répartis sur plusieurs répertoires tout en souhaitant que le fichier tar soit plat.
zero298
10

J'ai posté ma réponse ici:

/programming/13924856/unix-tar-do-not-preserve-directory-structure

republier (pour ppl paresseux)


C'est moche ... mais ça marche ...

J'ai eu ce même problème mais avec plusieurs dossiers, je voulais juste éliminer tous les fichiers. Vous pouvez utiliser l'option "transformer" pour passer une expression sed et ... cela fonctionne comme prévu.

c'est l'expression:

's/.*\///g' (supprimez tout avant '/')

Ceci est la commande finale:

tar --transform 's/.*\///g' -zcvf tarballName.tgz */*/*.info

Alessio Valentini
la source
7

Pour créer un tar (ARCHIVE.tar) avec tous les fichiers d'un répertoire (DIR), sans aucune information du répertoire parent (pas même ./), vous pouvez utiliser quelque chose comme:

find "DIR" -type f -printf "%f\n" | xargs tar cf ARCHIVE.tar -C "DIR"

Vous pouvez jouer avec la recherche pour limiter la profondeur, sélectionner des fichiers spécifiques et bien d'autres choses.

Bonne chance!

Paul Bhullar
la source
J'obtiens "find: -printf: principal ou opérateur inconnu" à la commande find OSX. Des conseils?
TCB13
-printfest une commande non standard. Beaucoup d'entre eux ne fonctionnent qu'avec des versions spécifiques de find. Habituellement, nous les marquons lorsque nous répondons à une question sur Super User (par exemple avec "-blah est une extension Gnu et ne fonctionnera pas partout").
Hennes
3

J'ai créé un répertoire temporaire. Et dans le répertoire, créé des liens symboliques vers tous les fichiers vers les fichiers à inclure. Ensuite, j'ai fait tar -h -C. afin que tous les fichiers (pas les liens, mais leur contenu) soient inclus dans l'archive avec le nom souhaité.

mzwt
la source
1

S'il s'agit du contenu entier de l'archive tar, vous pouvez utiliser l' --strip-componentsoption de GNU tar pour supprimer les 2 niveaux avant les fichiers.

Ignacio Vazquez-Abrams
la source
Je n'ai que l'option --strip-pathmais son utilisation ne changera rien.
1

Une autre façon de modifier temporairement le répertoire est de mettre les commandes cdet tarentre parenthèses ( ):

(cd example/super_user; tar -cvf ../../result.tar *)

L'avantage de ceci est que vous reviendrez toujours implicitement dans le répertoire d'origine lorsque le bloc sera terminé. c'est-à-dire pas besoin de pushd.. popdblocs ou de garder une trace de l'endroit où cdrevenir.

Stephen Quan
la source
0
pushd example/super_user
tar -cf output.tar Output.*
popd

pushd pousse le chemin du répertoire actuel vers la DIRpile et se déplace vers le dossier de contenu. Ensuite, vous revenez au répertoire d'origine à l'aide de popd.

Saravana Kumar
la source