90 votes

Comment extraire des fichiers sans structure de dossier en utilisant tar ?

J'ai un fichier tar.gz avec la structure suivante :

folder1/img.gif
folder2/img2.gif
folder3/img3.gif

Je veux extraire les fichiers d'image sans la hiérarchie des dossiers afin que le résultat extrait ressemble à ceci :

/img.gif
/img2.gif
/img3.gif

J'ai besoin de faire cela avec une combinaison d'Unix et de PHP. Voici ce que j'ai jusqu'à présent, il fonctionne pour les extraire dans le répertoire spécifié mais conserve la hiérarchie des dossiers :

exec('gtar --keep-newer-files -xzf images.tgz -C /home/user/public_html/images/',$ret);

160voto

ericgorr Points 3274

Vous pouvez utiliser le --strip-components de tar.

 --strip-components count
         (x mode only) Remove the specified number of leading path ele-
         ments.  Pathnames with fewer elements will be silently skipped.
         Note that the pathname is edited after checking inclusion/exclu-
         sion patterns but before security checks.

Je crée un fichier tar avec une structure similaire à la vôtre :

$tar -tf tarfolder.tar
tarfolder/
tarfolder/file.a
tarfolder/file.b

$ls -la file.*
ls: file.*: No such file or directory

Puis extrait en faisant :

$tar -xf tarfolder.tar --strip-components 1
$ls -la file.*
-rw-r--r--  1 ericgorr  wheel  0 Jan 12 12:33 file.a
-rw-r--r--  1 ericgorr  wheel  0 Jan 12 12:33 file.b

32voto

ford Points 1891

C'est presque possible avec tar seul, en utilisant le drapeau --transform, sauf qu'il n'y a aucun moyen de supprimer les répertoires restants pour autant que je sache.

Cela aplatira l'ensemble des archives :

tar xzf images.tgz --transform='s/.*\///'

La sortie sera

folder1/
folder2/
folder3/
img.gif
img2.gif
img3.gif

Vous devrez alors supprimer les répertoires avec une autre commande, malheureusement.

19voto

Minimul Points 1064

Vérifiez la version tar, par exemple

$ tar --version

Si la version est >= que tar-1.14.90 utiliser --strip-components

tar xvzf web.dirs.tar.gz -C /srv/www --strip-components 2

sinon utiliser --strip-path

tar xvzf web.dirs.tar.gz -C /srv/www --strip-path 2

2voto

Weston Ganger Points 3756

Sur la base de @ford La réponse de la Commission. Celle-ci va l'extraire dans le dossier mon_dossier. Ainsi, nous pouvons effacer correctement les dossiers vides sans affecter les fichiers existants.

tar xzf images.tgz --transform='s/.*\///' -C my_dirname
find my_dirname -type d -empty -delete

2voto

Pancho Points 52

Trouvez img*.gif dans n'importe quel sous-répertoire de mytar.tar.gz et extrayez-le dans ./.

tar -zxf mytar.tar.gz --absolute-names --no-anchored img*.gif --transform='s :.*/::'

Trouvez img*.gif dans l'un des 3 dossiers énumérés dans cette question spécifique dans mytar.tar.gz et extrayez-le dans ./.

tar -zxf mytar.tar.gz --absolute-names --no-anchored img*.gif --transform='s:^folder[1-3]/::'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X