Ich habe eine Tar-Datei mit folgender Struktur:
- dir1
-- file
- dir2
- dir3
Wenn ich versuche, es auszuführen tar -xf tarfile.tar.gz dir1/file
, wird dir1 mit der Datei erstellt. Stattdessen möchte ich nur die Datei ohne das dazwischenliegende Verzeichnis abrufen. Ich könnte die Datei verschieben und das Verzeichnis löschen, aber ich frage mich, ob der Tar-Befehl dies direkt unterstützt.
Ich verwende Alpine Linux.
Antwort1
POSIXly (mit Ausnahme des gunzip
Teils, der kein POSIX-Befehl ist):
gunzip < file.tar.gz | pax -rs'|.*/||' dir1/file1
Mit bsdtar
:
tar -s'|.*/||' -xf file.tar.gz dir1/file1
Mit GNU tar
:
tar --transform='s|.*/||' -xf file.tar.gz dir1/file1
Mit star
:
star -s '|*/||' -x -f file.tar.gz dir1/file1
Beachten Sie, dass bei einigen davon, wenn die Datei ein symbolischer Link ist, die Ersetzung auch das Ziel des symbolischen Links beeinflusst.
Antwort2
Sie können es nach stdout (-O) extrahieren und an den gewünschten Dateinamen weiterleiten.
Antwort3
Hier ist meine Lösung in Ruby. Ich versuche nicht, Symlinks richtig zu handhaben, aber das könnte natürlich hinzugefügt werden.
outfiles = `tar zxvf #{ARGV[0]}`
root_dirs = {}
outfiles.each_line do |l|
s = l.split('/')
root_dirs[s[0]] = 1
`mv #{l.chomp} ./#{s[-1]}`
end
root_dirs.each_key {|rd| `rm -rf #{rd}`}