Ich möchte den Inhalt der geteerten Datei anzeigen, ohne ihn zu extrahieren. Szenario: Ich habe a.tar und darin befindet sich eine Datei namens ./x/y.txt
. Ich möchte den Inhalt von anzeigen, y.txt
ohne das tatsächlich zu extrahieren a.tar
.
shell-script
tar
archive
Ramji
quelle
quelle
Antworten:
Es ist wahrscheinlich eine GNU-spezifische Option, aber Sie können das
-O
oder verwenden--to-stdout
, um Dateien in die Standardausgabe zu extrahierenquelle
tar -axf file.tar.gz --wildcards --no-anchored '*read_this_file*' --O
wenn zum Beispiel viele Dateien übereinstimmen*read_this_file*
. Alles wird in derselben Zeile gedruckt. Aus dem habeman
ich gefunden--to-command
. Passing--to-command="echo '' && cat"
ist ein bisschen schwarze Magie, aber es funktioniert: D$ tar -axf file.tgz foo/bar -O
Dies druckt den Inhalt von ./x/y.txt von a.tar nach STDOUT.
tar xfO a.tar ./x/y.txt
quelle
Das ist so einfach wie
Dieser Zaubertrick funktioniert, wenn Sie
lesspipe
installiert haben und wenn die env-VariableLESSOPEN
als definiert definiert ist,| /usr/bin/lesspipe.sh %s
was erwartet wird, wenn Sie lesspipe korrekt installiert haben.quelle
lesspipe.sh
sollte wohl vorzuziehen.Oh, aber dies ist eine Frage zum Inhalt einer Datei innerhalb einer
tar
Datei. Und tatsächlich ist dies in einigen Fällen nicht so schwer. Die Sache ist, einetar
Datei ist nur eine blockierte Stream-Datei - jede Datei im Archiv wird nach der vorhergehenden gefunden, und jede Datei erhält einen Metadaten- Header, der auf einem bestimmten Format basiert .Basierend auf diesem Format habe ich einmal geschrieben
shitar
- das waren ein paar Zeilendd
und Shell-Skripte, dietar
einen Strom von Blockgeräten im laufenden Betrieb aufbauen konnten . Basierend darauf habe ich in jüngerer Zeit diese wenigen Codezeilen geschrieben :... um eine
tar
Datei im laufenden Betrieb auseinanderzunehmen und Inline-Transformationen für ihre Komponententextdateien durchzuführen. Dort werden diecut
Felder verweisen auf Felder 1,2,13 einer NUL abgegrenzte Linie von Eingabe. Solche Dinge sind einfach, wenn dietar
Datei nur Textdateien enthält, datar
die Datensatztrennzeichen (wie sie alle 512 Bytes auftreten können) nur auf eine einzelne NUL pro Person reduziert und entfernt werden können - ohne dass Sie die Vorkommen wie gewohnt zählen müssen.tar
Das Header-Format sieht folgendermaßen aus:Verstehen Sie, dass es einen steilen Hang zwischen der relativ einfachen Handhabung einfach gibt
tar
Vorgänge und den weitaus komplizierteren Aspekten des Archivformats . Während einfache Dinge - wie das Zusammenpacken einer kleinen Gruppe homogen typisierter Dateien oder sogar das Aufteilen eines Archivs, das nur Mitglieder enthält, deren Typen Sie vorhersagen können - mit wenigen Shell-Pipes problemlos erledigt werden können, ist der zuverlässige Umgang mit beliebigen Archivmitgliedern keine Kleinigkeit.Es ist besonders schwierig, wenn diese Mitglieder beliebige Binärdaten enthalten könnten - was sicherlich eine zuverlässige Anwendung von ausschließen würde
tr -s
- und diese Schwierigkeit tritt nur dann auf, wenn Dateien verschiedener Typen außer regulären und / oder anderen Zeichensätzen als Ihrem nativen verwendet werden und / oder die Das ursprüngliche Archiv wurde durch eine Implementierung mit Formatanwendungs-Eigenheiten erstellt, auf die Sie nicht vorbereitet sind. Und dies berührt nur die grundlegenden, standardisierten Aspekte dertar
Archivtyps - fügen Sie erweiterte Header und Formaterweiterungen sowie spärliche Dateien und Komprimierungen hinzu und ... nun, viel Glück damit.Zurück zu den Wurzeln, aber die Standard - Datensatz -Größe für ein
tar
Archiv ist 20 Blöcke - oder 10.240 Bytes. Wenn ein Archiv mit der Standarddatensatzgröße blockiert ist und nur Standarddateitypen und Standardheader enthältustar
, sollten Sie jedoch von Member-Header zu Member-Header springen, indem Sie gemäß demsize
Header-Feld lesen, bis Sie ein Mitglied finden, das dem für entspricht was du suchst. Dort können Siesize
Bytes ab dem Offset einlesen, der am Ende des Member-Headers Ihres Ziels beginnt. Und das ist deine Akte.Das Überspringen der Überschriften ist jedoch nicht besonders einfach. Bei verschiedenen Typen werden entweder tatsächliche Datenblöcke angehängt, die entsprechen
size
. Beispielsweise enthalten Verzeichnisse und Links keinen solchen Datenblock, sondern nur eine Header-Beschreibung. Daher müssen Sie bereit sein, den Dateityp des aktuellen Headers zu überprüfen, bevor Sie genau feststellen, ob Sie dassize
Feld auf Ihre Sprungformel anwenden sollen oder nicht.Auch die Aufzeichnung -Größe Faktoren - je nachdem , ob die Archiv-Mitglieder Größen synchronisieren gut mit dem 10240 - Standard Rekord -größe es kann oder auch nicht ein zusätzlicher 0-Block jeweils angehängt werden kann. Die Datensatzgröße kann zum Zeitpunkt der Archiverstellung deklariert werden. Daher sind es möglicherweise nicht einmal 20 Blöcke, obwohl sie laut Spezifikation immer auf 512-Byte-Einheiten blockiert werden muss:
tar
Austauschformat; Siehe den Abschnitt ERWEITERTE BESCHREIBUNG . Die Standard - Blockgröße für dieses Format für Zeichen spezielle Archivdateien wird seine 10.240 . Implementierungen müssen alle Blockgrößenwerte unterstützen , die kleiner oder gleich 32256 sind und ein Vielfaches von 512 sind .Wenn Sie also mit einer
tar
Datei arbeiten, die möglicherweise Dateien enthält, die beliebige Binärdaten enthalten, müssen Sie die Datei algorithmisch und nach Dateityp überspringen. Die Spezifikation sagt:size
Feld hat die Größe der Datei in Oktetten.typeflag
Feld eine Datei vom Typ 1 (eine Verknüpfung ) oder 2 (eine symbolische Verknüpfung ) angegeben wird , wird dassize
Feld als Null angegeben.typeflag
Feld eine Datei vom Typ 5 ( Verzeichnis ) angegeben ist , ist dassize
Feld wie unter der Definition dieses Datensatztyps beschrieben zu interpretieren.typeflag
Feld auf 3 ( Zeichenspezialdatei ) , 4 ( Blockspezialdatei ) oder 6 ( FIFO ) eingestellt ist , wird die Bedeutung dessize
Felds in diesem Band von POSIX.1-2008 nicht angegeben, und es dürfen keine logischen Datensätze vorhanden sein auf dem Medium gespeichert.size
Feld beim Lesen ignoriert werden.typeflag
Feld auf einen anderen Wert gesetzt ist, muss die Anzahl der nach dem Header geschriebenen logischen Datensätze so sein , dass ein Bruchteil des Ergebnisses der Division ignoriert wird.( (
size
+ 511 ) / 512 )
... und natürlich auch unter Berücksichtigung der individuellen Größe jedes Headers - ein zusätzlicher Block pro Mitglied. Sie können also das Lesen von Lesen von Kopfzeile zu Kopfzeile überspringen, bis Sie auf einer landen, die mit der gesuchten Kopfzeile übereinstimmt. Zu diesem Zeitpunkt müssten Sie dann prüfen, ob der aktuelle Datensatz lediglich einen Link zu Ihrer Datei oder zur tatsächlichen Datei beschreibt . Dies ist besonders relevant, da beim mehrmaligen Hinzufügen derselben Datei zu einem Archiv viele
tar
s nur Link- Header enthalten, da die Daten der tatsächlichen Datei bereits an anderer Stelle im Archiv gefunden werden können.Nachdem Sie überprüft haben, dass Sie Ihre Berechnungen auf das
chksum
Feld anwenden müssen, und überprüfen müssen, ob die Datei, die Sie zu haben glauben, tatsächlich die gewünschte Datei ist.tar
'schksum
ist allerdings ziemlich einfach-:chksum
Feld muss die Standard-IRV-Darstellung nach ISO / IEC 646: 1991 des Oktalwerts der einfachen Summe aller Oktette im logischen Header-Datensatz sein. Jedes Oktett in der Kopfzeile wird als vorzeichenloser Wert behandelt. Diese Werte werden zu einer vorzeichenlosen Ganzzahl addiert, die auf Null initialisiert ist und deren Genauigkeit mindestens 17 Bit beträgt. Bei der Berechnung der Prüfsumme wird daschksum
Feld so behandelt, als wären es alle <Leerzeichen> .Natürlich würden Sie nicht wirklich irgendetwas davon zu tun haben, denn
tar
schon tun - das ist , was es tut - und so sollten Sie es wahrscheinlich nur verwenden , um das Archiv zu suchen und die Datei für Sie zu extrahieren. Dabei wird es nichts ganz anderes machen als Sie, wenn Sie wüssten, worum es Ihnen geht, außer dass es es wahrscheinlich besser und schneller macht, weil das seine Aufgabe ist. Und warum solltest du überhaupt?quelle
Sie können diese Zeile verwenden
quelle
y.txt
und aus der Frage des OP geht nicht hervor, dass dies die einzige Datei im Teer ist.