web-dev-qa-db-fra.com

Comment extraire des fichiers sans structure de dossiers à l'aide de 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 image sans la hiérarchie des dossiers pour que le résultat extrait ressemble à:

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

Je dois le faire avec une combinaison d'Unix et de PHP. Voici ce que j'ai jusqu'à présent, cela 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);
47
Ben Jackson

Vous pouvez utiliser l'option - - 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
87
ericg

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

Cela aplatira l'archive entière:

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

La sortie sera

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

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

18
ford

Vérifiez la version tar par ex.

$ tar --version

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

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

sinon utilisez --strip-path

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

Basé sur @ford réponse. Celui-ci va l'extraire dans le dossier my_dirname. Afin que nous puissions 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
1
Weston Ganger

Recherchez img * .gif dans n'importe quel sous-dossier de mytar.tar.gz et extrayez-le dans ./

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

Recherchez img * .gif dans l'un des 3 dossiers répertorié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]/::'

1
Pancho