So öffnen Sie eine mit tar piped to gzip erstellte tar gz-Datei

0

Ich wollte eine tar gz-Datei mit der höchsten Komprimierungsstufe generieren und folgte der Lösung von https://superuser.com/a/546509/461740 :

tar cv /path/to/directory | gzip -9 > file.tar.gz

Aber jetzt kann ich die Datei nicht dekomprimieren, ich habe den folgenden Fehler:

tar: This does not look like a tar archive
tar: Skipping to next header
tar: Archive contains ‘23241_at',16’ where numeric off_t value expected 

Ich habe diesen Fehler gegoogelt, in den meisten Fällen wird er durch eine "doppelte" gzip-Komprimierung verursacht. Ich habe die für dieses Problem vorgeschlagenen Lösungen ausprobiert, aber es scheint nicht meinem Problem zu entsprechen.

Irgendeine Idee, wie man das behebt?

Edit: Zu beachten ist , wenn ich den Befehl rufen Sie fileauf der unkomprimierten Datei (das soll eine tar - Datei sein), bekam ich das Ergebnis: data.

Edit: Ergebnis von head -c512 file.tar | hexdump -C:

00000000  73 71 6c 5f 64 75 6d 70  2f 0a 73 71 6c 5f 64 75  |sql_dump/.sql_du|
00000010  6d 70 2f 62 67 65 65 46  6f 72 65 69 67 6e 4b 65  |mp/bgeeForeignKe|
00000020  79 2e 73 71 6c 0a 73 71  6c 5f 64 75 6d 70 2f 00  |y.sql.sql_dump/.|
00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000080  00 00 00 00 00 00 00 00  00 00 30 30 30 30 37 35  |..........000075|
00000090  35 00 30 30 30 37 36 34  33 00 30 30 31 31 33 30  |5.0007643.001130|
000000a0  30 00 30 30 30 30 30 30  30 30 30 30 30 00 31 32  |0.00000000000.12|
000000b0  35 33 35 31 36 30 34 34  34 00 30 31 32 37 30 33  |535160444.012703|
000000c0  00 20 35 00 00 00 00 00  00 00 00 00 00 00 00 00  |. 5.............|
000000d0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000120  00 00 00 00 00 00 00 75  73 74 61 72 20 20 00 66  |.......ustar  .f|
00000130  62 61 73 74 69 61 6e 00  00 00 00 00 00 00 00 00  |bastian.........|
00000140  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 75  |...............u|
00000150  6e 69 6c 64 65 65 00 00  00 00 00 00 00 00 00 00  |nildee..........|
00000160  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000200

Befolgen Sie den Befehl @kasperd, um zu versuchen, meine Datei zu reparieren tail -c+39 file.tar > repaired.tar: hexadezimaler Speicherauszug der ersten 512 Bytes:

00000000  73 71 6c 5f 64 75 6d 70  2f 00 00 00 00 00 00 00  |sql_dump/.......|
00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000060  00 00 00 00 30 30 30 30  37 35 35 00 30 30 30 37  |....0000755.0007|
00000070  36 34 33 00 30 30 31 31  33 30 30 00 30 30 30 30  |643.0011300.0000|
00000080  30 30 30 30 30 30 30 00  31 32 35 33 35 31 36 30  |0000000.12535160|
00000090  34 34 34 00 30 31 32 37  30 33 00 20 35 00 00 00  |444.012703. 5...|
000000a0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000100  00 75 73 74 61 72 20 20  00 66 62 61 73 74 69 61  |.ustar  .fbastia|
00000110  6e 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |n...............|
00000120  00 00 00 00 00 00 00 00  00 75 6e 69 6c 64 65 65  |.........unildee|
00000130  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000200

Ergebnis eines tar -tvf"reparierten" Teers:

drwxr-xr-x username  0 2015-06-08 02:26 sql_dump/
-rw-r--r-- username 19123 2015-06-08 02:25 sql_dump/bgeeForeignKey.sql
tar: Skipping to next header
tar: Archive contains `688_x_at\',1' where numeric off_t value expected
tar: Archive contains `y\',\'not ' where numeric mode_t value expected
tar: Archive contains `725,\'ENSG' where numeric time_t value expected
tar: Archive contains `excluded' where numeric uid_t value expected
tar: Archive contains `\'),(\'208' where numeric gid_t value expected
tar: Archive contains `excluded' where numeric uid_t value expected
tar: Archive contains `\'),(\'208' where numeric gid_t value expected
?rwsrwsrwt 4294967295/4294967295 18446744073709551615 1970-01-01 00:59 ty','not excluded'),('208686_s_at',13725,'ENSG00000204256',7.73,'present',15097863,NULL,'high qualit unknown file type `\''
tar: Skipping to next header
tar: Archive contains `ent\'),(31801' where numeric off_t value expected
tar: Archive contains `no data\'' where numeric mode_t value expected
tar: Archive contains `347,\'ENSG' where numeric time_t value expected
tar: Archive contains `,\'no dat' where numeric uid_t value expected
tar: Archive contains `a\',\'desc' where numeric gid_t value expected
tar: Archive contains `,\'no dat' where numeric uid_t value expected
tar: Archive contains `a\',\'desc' where numeric gid_t value expected
?rwsrwsrwt 4294967295/4294967295 18446744073709551615 1970-01-01 00:59 ,'descent'),(31801346,'ENSG00000104375','UBERON:0007625','HsapDv:0000095','no data','poor quality',' unknown file type `\''
tar: Skipping to next header
tar: Exiting with failure status due to previous errors

Ausgabe von dd if=repaired.tar skip=39 count=2 | hexdump -C

2+0 records in
2+0 records out
1024 bytes (1.0 kB) copied00000000  64 64 20 66 6f 72 65 69  67 6e 20 6b 65 79 20 28  |dd foreign key (|
00000010  64 69 66 66 65 72 65 6e  74 69 61 6c 45 78 70 72  |differentialExpr|
00000020  65 73 73 69 6f 6e 49 64  29 20 72 65 66 65 72 65  |essionId) refere|
00000030  6e 63 65 73 20 64 69 66  66 65 72 65 6e 74 69 61  |nces differentia|
00000040  6c 45 78 70 72 65 73 73  69 6f 6e 28 64 69 66 66  |lExpression(diff|
, 6.9324e-05 s, 14.8 MB/s
00000050  65 72 65 6e 74 69 61 6c  45 78 70 72 65 73 73 69  |erentialExpressi|
00000060  6f 6e 49 64 29 20 6f 6e  20 64 65 6c 65 74 65 20  |onId) on delete |
00000070  73 65 74 20 6e 75 6c 6c  3b 0a 2f 2a 21 34 30 30  |set null;./*!400|
00000080  30 30 20 41 4c 54 45 52  20 54 41 42 4c 45 20 60  |00 ALTER TABLE `|
00000090  64 65 61 52 4e 41 53 65  71 53 75 6d 6d 61 72 79  |deaRNASeqSummary|
000000a0  60 20 45 4e 41 42 4c 45  20 4b 45 59 53 20 2a 2f  |` ENABLE KEYS */|
000000b0  3b 0a 0a 00 00 00 00 00  00 00 00 00 00 00 00 00  |;...............|
000000c0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000200  73 71 6c 5f 64 75 6d 70  2f 52 45 41 44 4d 45 2e  |sql_dump/README.|
00000210  74 78 74 0a 73 71 6c 5f  64 75 6d 70 2f 62 67 65  |txt.sql_dump/bge|
00000220  65 49 6e 64 65 78 2e 73  71 6c 0a 73 71 6c 5f 64  |eIndex.sql.sql_d|
00000230  75 6d 70 2f 64 75 6d 70  5f 62 67 65 65 5f 76 31  |ump/dump_bgee_v1|
00000240  33 5f 31 2e 73 71 6c 0a  73 71 6c 5f 64 75 6d 70  |3_1.sql.sql_dump|
00000250  2f 52 45 41 44 4d 45 2e  74 78 74 00 00 00 00 00  |/README.txt.....|
00000260  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000002a0  00 00 00 00 00 00 00 00  00 00 00 00 30 30 30 30  |............0000|
000002b0  36 34 34 00 30 30 30 37  36 34 33 00 30 30 31 31  |644.0007643.0011|
000002c0  33 30 30 00 30 30 30 30  30 30 30 32 30 36 34 00  |300.00000002064.|
000002d0  31 32 35 33 35 31 36 30  31 37 34 00 30 31 34 34  |12535160174.0144|
000002e0  30 33 00 20 30 00 00 00  00 00 00 00 00 00 00 00  |03. 0...........|
000002f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000340  00 00 00 00 00 00 00 00  00 75 73 74 61 72 20 20  |.........ustar  |
00000350  00 66 62 61 73 74 69 61  6e 00 00 00 00 00 00 00  |.fbastian.......|
00000360  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000370  00 75 6e 69 6c 64 65 65  00 00 00 00 00 00 00 00  |.unildee........|
00000380  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000400
FBB
quelle
2
Wie dekomprimierst du es?
Gronostaj
Ich habe versucht gzip -d my_file.tar.gz, gunzip my_file.tar.gzund zcat my_file.tar.gz, aber ich habe immer noch den Teer-Fehler danach.
FBB
1
gunzip it and do file my_file.tar.gz, was steht da?
Gronostaj
Bitte fügen Sie die Version von tar hinzu tar --versionund sagen Sie, ob es ein NFS- oder AFS-Verzeichnis gibt
Hastur
1
Ich nehme an, GNU Teer. Fortsetzen: Sie dekomprimieren die Datei, und wenn Sie gefragt werden, dass das System Ihnen sagt, dass es sich um eine komprimierte Datei handelt. Dann ist das Problem nicht da . Wenn Sie es tun file file.tar, sollte es Ihnen antworten POSIX tar archive (GNU). Wenn es antwortet, databedeutet dies, dass es den magischen Samen verfehlt und / oder der Teer beschädigt ist .
Hastur

Antworten:

0

Wenn alles in Ordnung ist, sollte es ausreichen

tar -zxvf file.tar.gz

Die zOption wird für die gzipKomprimierung benötigt .
Auf tar (GNU tar) 1.27.1 funktioniert es auch ohne

tar -xvf Myfile.tar.gz

Es gibt keinen besonderen Grund, dies so zu tun, wie Sie es getan haben. Sie können direkt eine gecippte Teer-Datei mit erstellen

tar -zcvf Myfile.tar.gz  /path/to/directory

oder mit einem anderen Komprimierungsprogramm als

tar -jcvf Myfile.tar.bz  /path/to/directory

Um zu überprüfen, mit welcher Art von Datei Sie wählen müssen, verwenden Sie den Befehl file

file *.tar.*

Myfile.tar.gz: gzip compressed data, from Unix, last modified:...
Myfile.tar.bz: bzip2 compressed data, block size = 900k
Hastur
quelle
Natürlich habe ich diese Standardbefehle ausprobiert, es funktioniert nicht.
FBB
Meinst du, du hast es versucht tar -zcvf Myfile.tar.gz /path/to/directoryund danach tar -zxvf file.tar.gzund es funktioniert nicht? Was ist file Myfile.tar.gz?
Hastur
Ich habe diese Befehle ausprobiert, ja. file Myfile.tar.gzsagt "gzip komprimierte Daten"
FBB
0
tar -xvfz file.tar.gz
  • -x extrahieren
  • -z gunzip
  • -v ausführlich

Aktualisieren

Versuchen Sie auch dies:

gunzip < file.tar.gz | tar xvf -

Nafscript
quelle
Es funktioniert nicht
FBB
Der zweite Befehl schien nicht zu funktionieren: /
FBB
Haben Sie versucht, eine andere Datei mit vorgeschlagenen Befehlen zu komprimieren und zu extrahieren? Scheint, Ihr Archiv ist beschädigt
Nafscript
Ich habe gerade getan, und es hat perfekt funktioniert: /
FBB
0

Sie haben vergessen, die Teerausgabe auf die Pipe umzuleiten:

$ tar cf - /path/to/directory | gzip -9 > file.tar.gz

Mit freundlichen Grüßen, Dmitry

Dmitry Dmitriev
quelle
Interessant, was ist das erwartete Verhalten meines Befehls ohne das Minus?
FBB
0

An dem Befehl, mit dem Sie das Archiv erstellt haben, ist nichts falsch. Mit diesem Befehl können Sie den Inhalt auflisten und die Prüfsumme des Archivs überprüfen:

tar -tzf file.tar.gz

Ihrer Frage nach scheint die Datei, die Sie jetzt haben, nicht wirklich eine .tar.gzDatei zu sein. Es muss etwas Unbeabsichtigtes mit der Datei geschehen sein, und die Möglichkeiten, die ich mir einfallen lassen kann, sind:

  1. Sie haben den Befehl zum Erstellen des Archivs irgendwie falsch eingegeben.
  2. Entweder waren der tarBefehl oder der gzipBefehl in Ihrem, PATHals Sie den Befehl ausführten, nicht die realen Versionen, sondern etwas anderes, das eine schlechte Ausgabe hervorbrachte.
  3. Sie hatten eine Umgebungsvariable, die eine Bibliothek überschrieb, die von den Programmen mit einer fehlerhaften Version verwendet wurde.
  4. Ein Hardwarefehler verursachte eine Beschädigung der Daten.
  5. Mit einem Programm wurde die Datei zwischen der Erstellung und dem Versuch, sie zu extrahieren, geändert.

Um herauszufinden, was mit dieser Datei wirklich schief gelaufen ist und wie sie möglicherweise wiederhergestellt werden könnte, müssen wir uns den tatsächlichen Inhalt der Datei genauer ansehen.

In dem in Ihrer aktualisierten Frage bereitgestellten Hexdump stelle ich fest, dass sich viele Felder nicht in der richtigen Ausrichtung innerhalb des Headers befinden. Im Vergleich zu einer guten TAR-Datei sehe ich, dass sich die Felder in Ihrer Datei 38 Byte zu weit in der Datei befinden.

Außerdem stelle ich fest, dass das erste Verzeichnis in Ihrem Archiv einen sehr langen Namen hat, der im 38. Byte sogar eine neue Zeile enthält.

Ich komme also zu dem Schluss, dass der Inhalt Ihrer Datei nicht nur ein Tar-Archiv ist. Es ist eine Textzeile, gefolgt von einem Teerarchiv. Die fehlerhafte Zeile lautet

sql_dump/.sql_dump/bgeeForeignKey.sql

Ich weiß nicht, wie Sie es geschafft haben, diese Zeile in Ihrer .tar.gzDatei zu speichern . Aber wenn wir es überspringen, hat das erste Verzeichnis einen viel vernünftigeren Namen sql_dump/. Wenn dies die einzige Beschädigung ist, können Sie die Daten mit diesem einen Befehl wiederherstellen:

tail -c+39 file.tar > repaired.tar
Kasperd
quelle
Ich kann das tar mit vi öffnen und den Inhalt meiner Originaldateien lesen, aber es wird die gleiche Fehlermeldung angezeigt wie zu Beginn beim Versuch, das tar zu entpacken. Wenn ich heades aufrufe, werden seltsame Informationen zu den Originaldateien im Teer angezeigt, z dir/ dir/file1 dir/0000755000764300113000000000000012535160444012703 5ustar usernamedir/file10000644000764300113000000004526312535160414016320 0ustar username-- 1st line of file1.
FBB
@FBB Die Ausgabe headeiner Binärdatei hilft nicht, das Problem zu identifizieren. Ein hexadezimaler Speicherauszug der ersten 512 Bytes würde uns jedoch etwas mitteilen. Versuchen Sie es head -c512 file.tar | hexdump -C.
Kasperd
Ich habe meinen Beitrag bearbeitet, um das Ergebnis des Befehls hinzuzufügen.
FBB
@FBB Hast du die Aktualisierungen meiner Antwort gesehen?
Kasperd
Leider hat es nicht funktioniert: / Ich habe meine Frage mit den ersten 512 Bytes der "reparierten" Datei aktualisiert.
FBB