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.
@-
verwenden Sie stattdessen - als Eingabe wie intar -cf recipe.tar -
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.Der Python
tarfile
Das Modul unterstützt sowohl das Lesen als auch das Schreiben. Sie können das Ergebnis von nehmenTarFile.extractfile()
aus einer tar-datei und füttern sie direkt inTarFile.addfile()
einer zweiten Datei. Natürlich würde dies ein wenig Programmierung erfordern, aber es würde tun, was Sie verlangen.quelle
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 funktioniertx
undt
Modi). Wenn es funktioniert hatc
Modus könnte man so etwas verwenden: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
zumc
Modus und fügen Sie einen Anruf hinzuedit_pathname
Innerhalbappend_archive
. Das Problem bei diesem Ansatz ist, dass alleedit_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 aktiviertc
Modus).quelle