it-swarm.com.de

Wie extrahiere ich Dateien ohne Ordnerstruktur mit tar

Ich habe eine tar.gz-Datei mit folgender Struktur:

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

Ich möchte die Bilddateien ohne die Ordnerhierarchie extrahieren, damit das extrahierte Ergebnis wie folgt aussieht:

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

Ich muss dies mit einer Kombination aus Unix und PHP tun. Folgendes habe ich bisher, es funktioniert, um sie in das angegebene Verzeichnis zu extrahieren, aber die Ordnerhierarchie zu behalten:

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

Sie können die Option - strip-components von tar verwenden.

 --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 man 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
87
ericg

Dies ist fast nur mit tar möglich, wenn das Flag --transform verwendet wird, mit der Ausnahme, dass es keine Möglichkeit gibt, die verbleibenden Verzeichnisse zu löschen, soweit ich das beurteilen kann.

Dies wird das gesamte Archiv verflachen:

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

Die Ausgabe wird sein

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

Sie müssen dann die Verzeichnisse leider mit einem anderen Befehl löschen.

18
ford

Überprüfen Sie die Teerversion, z.

$ tar --version

Wenn die Version > = ist als tar-1.14.90, benutze --strip-components

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

sonst benutze --strip-path

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

Beyogen auf @ford 's Antwort. Dieser wird es in den Ordner mein_Verzeichnis extrahieren. Damit können wir die leeren Ordner ordnungsgemäß löschen, ohne die aktuell vorhandenen Dateien zu beeinträchtigen.

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

Finde img * .gif in einem beliebigen Unterordner von mytar.tar.gz und extrahiere nach ./

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

Finden Sie img * .gif in einem der 3 Ordner, die in dieser speziellen Frage in mytar.tar.gz aufgelistet sind, und extrahieren Sie nach ./

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

1
Pancho