Basato su @ford
la risposta di. Questo lo estrarrà nella cartella my_dirname. In modo che possiamo cancellare correttamente le cartelle vuote senza influenzare i file attualmente esistenti.
tar xzf images.tgz --transform='s/.*\///' -C my_dirname
find my_dirname -type d -empty -delete
Questo è quasi possibile solo con tar, usando il flag --transform, tranne per il fatto che non c'è modo di eliminare le directory rimanenti per quanto ne so.
Questo appiattirà l'intero archivio:
tar xzf images.tgz --transform='s/.*\///'
L'output sarà
folder1/
folder2/
folder3/
img.gif
img2.gif
img3.gif
Sfortunatamente, dovrai quindi eliminare le directory con un altro comando.
Controlla la versione tar, ad es.
$ tar --version
Se la versione è >= rispetto a tar-1.14.90 usa --strip-components
tar xvzf web.dirs.tar.gz -C /srv/www --strip-components 2
altrimenti usa --strip-path
tar xvzf web.dirs.tar.gz -C /srv/www --strip-path 2
Puoi utilizzare --strip-components opzione di 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.
Creo un file tar con una struttura simile alla tua:
$tar -tf tarfolder.tar
tarfolder/
tarfolder/file.a
tarfolder/file.b
$ls -la file.*
ls: file.*: No such file or directory
Quindi estratto facendo:
$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