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.
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>.
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
--
Mensagem enviada para <http://groups.google.com/group/tchelinux>.
Regras de Conduta para o grupo: <http://tchelinux.org/regras>.
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
T+
Felipe
--
Mensagem enviada para <http://groups.google.com/group/tchelinux>.
Regras de Conduta para o grupo: <http://tchelinux.org/regras>.
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