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?


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 ../..

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.


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


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!


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é.


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.


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.


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.