tar - extraire la structure du répertoire de rejet

34

unzipa une option astucieuse -j, par laquelle la structure de répertoire de l’archive est ignorée et tous les fichiers sont extraits dans le même répertoire.

Y a-t-il un moyen de faire le tartravail de la même manière? Rien dans la page de manuel ne semble l'indiquer.

Donc, existe-t-il un outil alternatif, de préférence logiciel libre, pour le faire?

Benji XVI
la source
Related: Extraction du contenu de l'archive tar dans le répertoire parent .
G-Man dit 'Réintégrez Monica'

Réponses:

79

Le goudron GNU vit sur les caractéristiques, il existe donc naturellement des options pour cela.
http://www.gnu.org/software/tar/manual/html_node/transform.html

Si vous souhaitez simplement supprimer quelques segments de chemin, faites --strip-components=nou --strip=nfaites souvent:

 tar xvzf tgz --strip=1

Mais il est également possible de réécrire de manière régulière les fichiers à extraire (les indicateurs sont --transformou --xformet acceptent ereg avec le /xmodificateur):

 tar xvzf tgz --xform='s#^[^/]+#.#x'
                 # or 's#^.+/##x' for discarding all paths

Pour lister un tar, vous avez besoin de l' --show-transformedoption supplémentaire :

 tar tvzf tgz --show-transformed --strip=1 --xform='s/abc/xyz/x'

Je crois que les options de réécriture fonctionnent également pour l’emballage, pas seulement pour l’extraction. Mais paxa évidemment une syntaxe plus agréable.

Mario
la source
4
Pourquoi ne pas s#.*/##?
l0b0
3
--bande vient de faire ma journée. Merci!
SamStephens
--stripnon mentionné dans la page de manuel os x tar, mais cela fonctionne quand même, merci!
slf
3
Bien mieux que la réponse acceptée.
Klaatu von Schlacker
y a-t-il une différence entre --stripet --strip-components?
Joel Berkeley le
13

Vous pouvez le faire assez facilement en deux étapes. Adapter si nécessaire:

$ mkdir /tmp/dirtree
$ tar xfz /path/to/archive -C /tmp/dirtree
$ find /tmp/dirtree -type f -exec mv -i {} . \;
$ rm -rf /tmp/dirtree
MikeyB
la source
Voici comment je le ferais (en utilisant find -exec mv -iau lieu de find | xargs) .... des étapes simples que je peux répéter sur n’importe quel système sans avoir à transporter de script pour le faire à ma place.
Quack Quichotte
1
+1, tmpdir=$( mktemp -d )est pratique lors de la création de répertoires temporaires
sorki
8

pax peut le faire:

pax -v -r -s '/.*\///p' < archive.tar

ou

zcat archive.tar.gz | pax -v -r -s '/.*\///p'

Vous pouvez d'abord vérifier l'opération de remplacement de nom en omettant l' -roption.

hfs
la source
1

Une solution possible qui ne nécessite aucune installation.

  1. utilisez a tar tvfpour récupérer tous les fichiers de l'archive
  2. Extrayez ces fichiers individuellement - extrayez tar à stdout et redirigez-le à $ filename

    tar -tvf $1 | grep -v "^d" | \
                  awk '{for(i=6;i<NF+1;i++) {printf "%s ",$i};print ""}' |\
                  while read filename
                  do
                     tar -O -xf $1 "$filename" > `basename "$filename"`
                  done
    

enregistrer sous extract.sh et exécuter en tant que extract.sh myfile.tar. Il écrasera également les noms de fichiers en double rencontrés dans les répertoires extraits de l'archive.

DaveParillo
la source
En fait, je viens de le tester sur une arborescence de répertoires chez moi et cela échoue sur les fichiers contenant des espaces. Je verrai si je ne peux pas poster une mise à jour.
DaveParillo
Corrigé, mais ce n'est pas aussi joli que ça l'était.
DaveParillo
-1
tar xf foo.tar.gz foo/path/to/file/bar.mp3 -O > bar.mp3

L' -Ooption extrait un fichier à la sortie standard et >redirige cette sortie dans un fichier. Donc, dans mon exemple, j'extrais foo.mp3 et le redirigeais dans bar.mp3. Les noms de fichiers sont arbitraires.

Klaatu von Schlacker
la source