Extrahieren Sie die Datei aus dem Verzeichnis in der TAR-Datei, ohne dieses Verzeichnis zu erstellen

Extrahieren Sie die Datei aus dem Verzeichnis in der TAR-Datei, ohne dieses Verzeichnis zu erstellen

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 gunzipTeils, 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}`}

verwandte Informationen