Wie kann ich den führenden Pfad von einem tar entfernen und ihn im Speicher abrufen?

7

Ich dachte, ich könnte so etwas tun:

wget -O- http://example.com/funky.tar.gz | \
  tar --strip-components 1 -Ox | tar -cf fixed.tar.gz

Um den führenden Pfad von allen Elementen im heruntergeladenen tar zu entfernen, scheint es jedoch nicht möglich zu sein, ein tar aus stdin zu erstellen. Bitte beweise mich falsch.

Michael Hale
quelle

Antworten:

2

Sie können ganz sicher einen Tar aus stdin erstellen. Benutzen - als die Quelle, und alles, was Sie wollen, in das Rohr zu pfeifen.

http://ss64.com/bash/tar.html

http://www.google.com/search?q=tar+stdin

Alex
quelle
Ich glaube, ich bin ein bisschen weiter gekommen. Ich habe versucht, mit diesem Zwischenbefehl zu testen: cat cookbooks.tar.gz | tar -xO --strip-komponenten 1 | tar -cf recipe.tar @ - Ich erhalte jedoch diesen Fehler: tar: Fehler beim Lesen des Archivs (null): Nicht erkanntes Archivformat: Unangemessener Dateityp oder Format tar: Fehler beim Beenden von früheren Fehlern.
Michael Hale
Sie verwenden nicht @-verwenden Sie stattdessen - als Eingabe wie in tar -cf recipe.tar -
Alex
Danke für den Link. Ich bin immer noch fest, nachdem ich es gelesen habe. Vielleicht ein Beispiel? Ich habe es versucht tar -Oxf cookbooks.tar.gz | tar -cf recipe.tar - Ich erhalte jedoch diese Fehlermeldung: "tar: Keine Dateien oder Verzeichnisse angegeben". Wenn ich mir die Ausgabe von tar -Oxf cookbooks.tar.gz anschaue, hat es keine Datei- und Verzeichnisnamen, sondern nur den Inhalt der Dateien.
Michael Hale
@Michael: Was du willst, ist im Grunde eine Tarpipe, ohne die SSH: google.com/search?q=tar+pipe+ssh
Alex
2

Der Python tarfile Das Modul unterstützt sowohl das Lesen als auch das Schreiben. Sie können das Ergebnis von nehmen TarFile.extractfile() aus einer tar-datei und füttern sie direkt in TarFile.addfile() einer zweiten Datei. Natürlich würde dies ein wenig Programmierung erfordern, aber es würde tun, was Sie verlangen.

Ignacio Vazquez-Abrams
quelle
0

Es scheint mir, als könnte man beschreiben, wofür Sie sich als "Stream-Editor" interessieren Teer Dateien, mit denen Sie das anwenden können --strip-components Pfadname-Übersetzung. Die Idee ist, ein zu nehmen Teer Datei als Eingabe und schreibe eine modifizierte Teer Datei als Ausgabe.

Keiner dieser Teer s wer ist die Dokumentation, die ich überprüft habe ( GNU Teer . Star . bsdtar ) scheinen Ihre genaue Operation zu unterstützen.

bsdtar ist aber interessant. Es ist @archive Es scheint, als würde die Syntax fast dazu führen, dass Sie ein Tarfile lesen und ein modifiziertes schreiben, aber den manpage-Eintrag für --strip-components sagt, dass es nur in funktioniert x und t Modi). Wenn es funktioniert hat c Modus könnte man so etwas verwenden:

wget -O - <url> | bsdtar -c --strip-components 1 -zf new.tar.gz @-

ich habe nicht bsdtar auf meiner maschine (es ist Teer in FreeBSD , ebenso gut wie Teer in Mac OS X 10.6 (ältere Versionen verwenden GNU Teer ); es ist verfügbar als bsdtar bei einigen Linux-Distributionen: Debian GNU / Linux . Ubuntu , und einige RPM-basierte Distributionen ), aber wenn ich mir den Code ansehe, bin ich sicher, dass der Aufruf nur die Fehlermeldung "Option --strip-components ist im Modus -c nicht erlaubt" verursacht.

Wenn Sie dies wünschen, müssen Sie wahrscheinlich Ihr eigenes Programm rollen (oder jemanden dazu bringen, es für Sie zu erledigen). Glücklicherweise ist dies möglicherweise nicht so schwer, wie es sich anhört. bsdtar basiert auf dem sehr schönen libarchive Bibliothek. Es sieht so aus, als wäre es ziemlich unkompliziert, ein Programm zu erstellen, das macht, was Sie wollen. Schon seit bsdtar Sie haben bereits den größten Teil des Codes, den Sie benötigen, um ein Archiv in ein anderes zu kopieren @archive Man könnte dies sogar tun, indem Sie einige Funktionen hinzufügen bsdtar . Ein einfacher Ansatz, "verdammt die Architektur, erledigen Sie sie einfach" ist möglicherweise die Aktivierung --strip-components zum c Modus und fügen Sie einen Anruf hinzu edit_pathname Innerhalb append_archive. Das Problem bei diesem Ansatz ist, dass alle edit_pathname Transformationen werden auf beide Einträge von angewendet @archive s und die Pfadnamen der tatsächlichen Dateien, die auf andere Weise angegeben wurden (Befehlszeilenargumente, -T Pfadnamenlisten usw.). Dieses Verhalten kann im besten Interesse des Beamten liegen oder nicht bsdtar (Es gibt wahrscheinlich einen Grund --strip-components ist noch nicht für aktiviert c Modus).

Chris Johnsen
quelle