Basierend auf @ford
's Antwort. Dieser entpackt es in den Ordner my_dirname. Damit wir die leeren Ordner ohne betroffene aktuell vorhandene Dateien ordnungsgemäß löschen können.
tar xzf images.tgz --transform='s/.*\///' -C my_dirname
find my_dirname -type d -empty -delete
Das ist fast mit tar allein möglich, indem das Flag --transform verwendet wird, außer dass es, soweit ich das beurteilen kann, keine Möglichkeit gibt, die übrig gebliebenen Verzeichnisse zu löschen.
Dadurch wird das gesamte Archiv reduziert:
tar xzf images.tgz --transform='s/.*\///'
Die Ausgabe ist
folder1/
folder2/
folder3/
img.gif
img2.gif
img3.gif
Leider müssen Sie die Verzeichnisse dann mit einem anderen Befehl löschen.
Überprüfen Sie die Tar-Version, z. B.
$ tar --version
Wenn die Version >= ist als tar-1.14.90 verwenden Sie --strip-components
tar xvzf web.dirs.tar.gz -C /srv/www --strip-components 2
ansonsten verwenden Sie --strip-path
tar xvzf web.dirs.tar.gz -C /srv/www --strip-path 2
Sie können die --strip-components verwenden Option von 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.
Ich erstelle eine Tar-Datei mit einer ähnlichen Struktur wie Ihre:
$tar -tf tarfolder.tar
tarfolder/
tarfolder/file.a
tarfolder/file.b
$ls -la file.*
ls: file.*: No such file or directory
Dann extrahiert durch:
$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