Compactação com gzip errada, como descompactar?

37 views
Skip to first unread message

Marcelo Luiz Onhate

unread,
Feb 1, 2011, 5:35:19 AM2/1/11
to tche...@googlegroups.com
Bom dia pessoal,

Fiz uma compactação assim "gzip -r --fast -c * > nome.gz" só que assim ele bota todos os arquivos num mesmo arquivo um embaixo do outro... (só descobri agora) e preciso voltar um backup mas não consigo porque ele gerou um arquivo, com o nome do primeiro arquivo que achou, no caso um .jasper, de 22GB com tudo dentro... 

Exemplo: o arquivo 1 tem x dentro e o 2 tem y esse arquivo que ele gerou se chama 1 e tem xy dentro, ai não tem como separar...

Os arquivos compactados eram fotos, documentos, pastas, pdfs... tudo...

O que posso fazer para tentar recuperar isso?

Vinicius Mello

unread,
Feb 1, 2011, 7:54:13 AM2/1/11
to tche...@googlegroups.com
Ol� Marcelo,

On 02/01/2011 08:35 AM, Marcelo Luiz Onhate wrote:
> Fiz uma compacta��o assim /"gzip -r --fast -c * > nome.gz"/ s� que assim
> ele bota todos os arquivos num mesmo arquivo um embaixo do outro... (s�
> descobri agora) e preciso voltar um backup mas n�o consigo porque ele


> gerou um arquivo, com o nome do primeiro arquivo que achou, no caso um
> .jasper, de 22GB com tudo dentro...
>
> Exemplo: o arquivo 1 tem x dentro e o 2 tem y esse arquivo que ele gerou

> se chama 1 e tem xy dentro, ai n�o tem como separar...

Teria como recuperar se soubesse exatamente:

1) a string para a qual o * expandiu
2) o tamanho exato em bytes de cada arquivo


Tens estas informa��es?


Sds,
vmm.

Marcelo Luiz Onhate

unread,
Feb 1, 2011, 7:56:16 AM2/1/11
to tche...@googlegroups.com
São muitos arquivos... dá 22GB... exatamente não tem como... ''/

Em 1 de fevereiro de 2011 10:54, Vinicius Mello <vmm...@vmmello.eti.br> escreveu:
Olá Marcelo,


On 02/01/2011 08:35 AM, Marcelo Luiz Onhate wrote:
Fiz uma compactação assim /"gzip -r --fast -c * > nome.gz"/ só que assim
ele bota todos os arquivos num mesmo arquivo um embaixo do outro... (só
descobri agora) e preciso voltar um backup mas não consigo porque ele

gerou um arquivo, com o nome do primeiro arquivo que achou, no caso um
.jasper, de 22GB com tudo dentro...

Exemplo: o arquivo 1 tem x dentro e o 2 tem y esse arquivo que ele gerou
se chama 1 e tem xy dentro, ai não tem como separar...

Teria como recuperar se soubesse exatamente:

1) a string para a qual o * expandiu
2) o tamanho exato em bytes de cada arquivo


Tens estas informações?


Sds,
vmm.

--
Mensagem enviada para <http://groups.google.com/group/tchelinux>.
Regras de Conduta para o grupo: <http://tchelinux.org/regras>.



--
Att.
Marcelo Luiz Onhate


Felipe Ghellar

unread,
Feb 1, 2011, 9:34:05 AM2/1/11
to tche...@googlegroups.com
Buenas!

Em 01-02-2011 08:35, Marcelo Luiz Onhate escreveu:
> Bom dia pessoal,
>

> Fiz uma compactação assim /"gzip -r --fast -c * > nome.gz"/ só que assim


> ele bota todos os arquivos num mesmo arquivo um embaixo do outro... (só
> descobri agora) e preciso voltar um backup mas não consigo porque ele
> gerou um arquivo, com o nome do primeiro arquivo que achou, no caso um
> .jasper, de 22GB com tudo dentro...
>
> Exemplo: o arquivo 1 tem x dentro e o 2 tem y esse arquivo que ele gerou
> se chama 1 e tem xy dentro, ai não tem como separar...
>
> Os arquivos compactados eram fotos, documentos, pastas, pdfs... tudo...
>
> O que posso fazer para tentar recuperar isso?
>

O que aconteceu aqui foi equivalente ao seguinte:

1) cada arquivo original foi compactado em um arquivo gzip individual; e
2) todos estes arquivos gzip foram concatenados em um único arquivo.

Pra reverter isso, tem que dar um jeito de recuperar os arquivos gzip
individuais.

Usando um pouco de técnica forense, é possível fazer isso. Se não tiver
nenhuma ferramenta forense disponível, os comandos a seguir podem resolver.
(Vou assumir que o arquivo único se chama arquivao.gz e que o shell em uso é
o bash. É bom também fazer uma cópia do arquivao.gz.)

O primeiro passo é localizar os limites de cada arquivo individual dentro do
arquivao.gz. Felizmente, como são todos do mesmo tipo (arquivos gzip) e todo
arquivo gzip inicia com uma assinatura conhecida (1F-8B-08), isso pode ser
feito com um comando grep:

# grep -a -b -o $'\x1f\x8b\x08' arquivao.gz | cut -d: -f1 > inicios

Esse comando localiza as posições que contêm os três bytes de assinatura do
gzip e guarda estas informações no arquivo "inicios".

O próximo passo é determinar o limite de cada arquivo individual, para a
seguir calcular seu tamanho. Como cada arquivo termina onde começa o
seguinte, os limites já são conhecidos:

# cat inicios | sed -e '1d' > limites

O último arquivo termina, obviamente, no final do arquivao.gz:

# stat -c %s arquivao.gz >> limites

Agora já é possível calcular o tamanho de cada arquivo individual:

# paste inicios limites | awk '{print $2-$1}' > tamanhos

É útil fazer um "cache" das informações coletadas até agora, incluindo uma
contagem de arquivos localizados:

# paste inicios tamanhos | cat -n > info_arquivos

Agora, o arquivo "info_arquivos" contém uma linha para cada arquivo gzip
localizado, sendo que cada linha contém três colunas. A primeira coluna
serve como contador, o que é útil na extração dos arquivos e para depurar
eventuais problemas. A segunda coluna contém a posição de início do arquivo,
e a terceira coluna contém o seu tamanho em bytes.

Com estas informações, pode-se usar o dd para extrair os arquivos
individuais. Como os nomes originais destes arquivos ainda não são
conhecidos, são dados nomes sequenciais:

# while read -a x; do echo dd bs=1 if=arquivao.gz of=arq-orig-${x[0]}.gz
skip=${x[1]} count=${x[2]}; done < info_arquivos

(Este comando deve estar em uma única linha. O comando "echo" está ali para
teste; deve ser removido para realmente extrair os arquivos.)

Como o arquivao.gz é um tanto grande e a extração é feita byte a byte, é de
se esperar que este laço demore para terminar. Se não ocorrer nenhum erro, o
resultado é um monte de arquivos chamados "arq-orig-N.gz".

Para testar a integridade dos arquivos extraídos e verificar se a operação
foi bem sucedida, usa-se

# gzip -v -t arq-orig-*.gz

Os arquivos extraídos corretamente dão resultado "OK". Para verificar o
conteúdo dos arquivos extraídos, usa-se

# gzip -v -l -N arq-orig-*.gz

E para extrair os arquivos recuperando os nomes originais:

# gzip -v -d -N arq-orig-*.gz

Se tudo der certo, os arquivos originais serão corretamente recuperados,
incluindo seus nomes e datas de criação/alteração. Porém, todos os arquivos
ficarão no mesmo diretório. Se entre os originais havia arquivos com mesmo
nome em diretórios diferentes, o gzip pergunta se deve sobrescrever ou não.

Dificilmente um procedimento complexo como esse vai funcionar de primeira,
mas aí é questão de ver o que deu errado e tentar contornar. Provavelmente
vai consumir um certo tempo, mas que dá pra fazer, dá!

T+
Felipe

Marcelo Luiz Onhate

unread,
Feb 3, 2011, 6:25:06 AM2/3/11
to tche...@googlegroups.com
CARA!!!!! TU É FOD*!!!!! SALVOU A PÁTRIA!!!!!
DEU CERTO TCHÊ! E DE PRIMEIRA!!!!!!!!

Demorei para responder porque ficou quase 2 dias processando o arquivo! heheheh
Mas recuperei!!!!!!!!!


VALEU!!!

A hora que estiver passando por Erechim manda um e-mail ai que te pago umas geladas!!!!


Posso postar essa resposta no ubuntu-br.org com crédito à você claro, onde postei essa dúvida também?



--
Mensagem enviada para <http://groups.google.com/group/tchelinux>.
Regras de Conduta para o grupo: <http://tchelinux.org/regras>.

Felipe Ghellar

unread,
Feb 4, 2011, 7:49:36 AM2/4/11
to tche...@googlegroups.com

Em 03-02-2011 09:25, Marcelo Luiz Onhate escreveu:
> CARA!!!!! TU É FOD*!!!!! SALVOU A PÁTRIA!!!!!
> DEU CERTO TCHÊ! E DE PRIMEIRA!!!!!!!!

Bah, também não é pra tanto! Mas legal que funcionou! :)

> Demorei para responder porque ficou quase 2 dias processando o arquivo!
> heheheh
> Mas recuperei!!!!!!!!!

A demora já era esperada, por causa do método de extração não otimizado. Se
desse pra fazer o split ou o dd trabalharem com blocos de tamanho variável,
o processamento seria bem mais rápido.

Ou, se esse tipo de situação for mais comum do que eu imagino, talvez valha
a pena escrever um programinha específico para fazer esse trabalho. Seria
ainda mais eficiente e poderia ser mais inteligente, interpretando os
cabeçalhos gzip e extraindo só os arquivos que interessassem.

(Fica aí uma sugestão pra quem gosta de nerdices tipo "coding dojo". :))

> A hora que estiver passando por Erechim manda um e-mail ai que te pago
> umas geladas!!!!

Hehe. Pode deixar, eu faço minha própria cerveja. :)

> Posso postar essa resposta no ubuntu-br.org <http://ubuntu-br.org> com


> crédito à você claro, onde postei essa dúvida também?

Pode postar lá, sim, sem problemas. Só acho que seria interessante incluir
um link para esta thread no Google Groups.

T+
Felipe

Marcelo Luiz Onhate

unread,
Feb 4, 2011, 8:01:47 AM2/4/11
to tche...@googlegroups.com
Feito:

Novamente Obrigado!

P.S.: Sobre a cerveja, vende também? heh


T+
Felipe

--
Mensagem enviada para <http://groups.google.com/group/tchelinux>.
Regras de Conduta para o grupo: <http://tchelinux.org/regras>.

Luis Felipe Zeni

unread,
Feb 4, 2011, 8:14:09 AM2/4/11
to tche...@googlegroups.com
Felipe Ghellar, agora que vi que tu ta na lista da cervejaartesanalpoa. Que massa isso =)

Linux e cerveja =X

(Desculpem o e-mail off-topic total)

 
2011/2/4 Marcelo Luiz Onhate <onh...@gmail.com>



--
Atenciosamente
-------------------------------------------
Luis Felipe de Araujo Zeni
(51) 8409 - 0825
www.luiszeni.com

Felipe Ghellar

unread,
Feb 4, 2011, 8:19:02 AM2/4/11
to tche...@googlegroups.com
Não, a cerveja é só pra consumo doméstico. :)

Em 04-02-2011 11:01, Marcelo Luiz Onhate escreveu:
> Feito:
> http://ubuntuforum-br.org/index.php?topic=78494.msg436971


>
> <http://ubuntuforum-br.org/index.php?topic=78494.msg436971>Novamente
> Obrigado!
>
> P.S.: Sobre a cerveja, vende também? heh
>
> Em 4 de fevereiro de 2011 10:49, Felipe Ghellar <fghe...@gmail.com

> <mailto:fghe...@gmail.com>> escreveu:

> *Marcelo Luiz Onhate*
> http://about.me/onhate

Reply all
Reply to author
Forward
0 new messages