Como abrir o arquivo tar gz criado usando tar piped to gzip

0

Eu queria gerar um arquivo tar gz com o nível mais alto de compactação e segui a solução do link :

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

Mas agora, não consigo descompactar o arquivo, tenho o seguinte erro:

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 

Eu pesquisei esse erro, na maioria dos casos ele é causado por uma compactação gzip "dupla", tentei as soluções propostas para esse problema, mas isso não parece corresponder ao meu problema.

Alguma ideia de como consertar isso?

Edit: note, quando eu chamo o comando file no arquivo descompactado (que deveria ser um arquivo tar), eu obtive o resultado: data .

Editar: resultado de 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

Seguindo o comando @kasperd para tentar reparar meu arquivo, tail -c+39 file.tar > repaired.tar , dump hexadecimal dos primeiros 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

Resultado de tar -tvf no tar "reparado":

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

Saída de 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
    
por FBB 23.06.2015 / 14:35

4 respostas

0

Se tudo estiver ok, deve ser o suficiente

tar -zxvf file.tar.gz

A opção z é necessária para a compactação gzip .
Em tar (GNU tar) 1.27.1 funciona também sem

tar -xvf Myfile.tar.gz

Não há nenhum motivo especial para fazer da maneira que você usou, você pode criar diretamente um arquivo compactado com compactação com

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

ou com um programa de compressão diferente como

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

Para verificar em qual tipo de arquivo você deve discar, use o comando file

file *.tar.*

Myfile.tar.gz: gzip compressed data, from Unix, last modified:...
Myfile.tar.bz: bzip2 compressed data, block size = 900k
    
por 23.06.2015 / 14:48
0
tar -xvfz file.tar.gz
  • -x extrato
  • -z gunzip
  • -v verbose

Atualizar

Tente também isto:

gunzip < file.tar.gz | tar xvf -

    
por 23.06.2015 / 14:46
0

Você esqueceu de menos para redirecionar a saída de tar para o pipe:

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

Com os melhores cumprimentos, Dmitry

    
por 23.06.2015 / 16:04
0

Não há nada errado com o comando que você diz que foi usado para criar o arquivo. Você pode listar o conteúdo e verificar a soma de verificação do arquivo usando este comando:

tar -tzf file.tar.gz

Da sua pergunta, parece que o arquivo que você tem agora não é realmente um arquivo .tar.gz . Algo não intencional deve ter acontecido com o arquivo, e as possibilidades que posso apresentar são:

  1. Você de alguma forma digitou errado o comando para produzir o arquivo em primeiro lugar.
  2. O comando tar ou o comando gzip no seu PATH quando você executou o comando não eram as versões reais, mas sim algo que produzia um resultado ruim.
  3. Você tinha uma variável de ambiente substituindo alguma biblioteca usada pelos programas com uma versão quebrada.
  4. Um erro de hardware causou a corrupção dos dados.
  5. Algum programa foi usado para modificar o arquivo entre a hora em que você o criou e a hora em que você tentou extraí-lo.

Para descobrir o que realmente deu errado com esse arquivo e como ele poderia ser recuperado, precisamos examinar mais de perto o conteúdo real do arquivo.

No hexdump fornecido na sua pergunta atualizada, noto que muitos dos campos não estão no alinhamento adequado dentro do cabeçalho. Comparando com um bom arquivo tar, vejo que em seus campos estão localizados 38 bytes longe demais dentro do arquivo.

Além disso, noto que o primeiro diretório dentro do seu arquivo tem um nome muito longo que tem até uma nova linha no 38º byte.

Então, o que eu concluo é que o conteúdo do seu arquivo não é apenas um arquivo TAR. É uma linha de texto seguida por um arquivo tar. A linha errada diz

sql_dump/.sql_dump/bgeeForeignKey.sql

Eu não sei como você conseguiu que essa linha fosse armazenada dentro do seu arquivo .tar.gz . Mas se pularmos, o primeiro diretório tem um nome muito mais razoável sql_dump/ . Se essa for a única corrupção, você poderá recuperar os dados por este comando:

tail -c+39 file.tar > repaired.tar
    
por 23.06.2015 / 15:41