Come posso recuperare file da un archivio .tar.gz corrotto?
Domanda
Ho un gran numero di file in un archivio .tar.gz. Verifica del tipo di file con il comando
file SMS.tar.gz
dà la risposta
gzip compressed data - deflate method , max compression
Quando provo ad estrarre l'archivio con gunzip, dopo un ritardo ricevo il messaggio
gunzip: SMS.tar.gz: unexpected end of file
Esiste un modo per recuperare anche parte dell'archivio?
Soluzione
Sei sicuro che si tratti di un file gzip? Per prima cosa esegui "file SMS.tar.gz" per convalidarlo.
Quindi leggerei la pagina The gzip Recovery Toolkit .
Altri suggerimenti
Il recupero è possibile ma dipende da cosa ha causato la corruzione.
Se il file viene appena troncato, ottenere un risultato parziale non è troppo difficile; basta eseguire
gunzip < SMS.tar.gz > SMS.tar.partial
che fornirà un output nonostante l'errore alla fine.
Se il file compresso ha blocchi mancanti di grandi dimensioni, è praticamente senza speranza dopo il blocco danneggiato.
Se il file compresso viene sistematicamente danneggiato in piccoli modi (ad esempio, trasferendo il file binario in modalità ASCII, che distrugge i ritorni a capo e le nuove righe in tutto il file), è possibile ripristinare ma richiede un po 'di programmazione personalizzata, è davvero ne vale la pena solo se non si ha assolutamente altro ricorso (nessun backup) e i dati valgono molto sforzo. (L'ho fatto con successo.) Ho citato questo scenario in una domanda precedente .
Le risposte per i file .zip differiscono in qualche modo, poiché gli archivi zip hanno più membri compressi separatamente, quindi c'è più speranza (anche se la maggior parte degli strumenti commerciali sono piuttosto falsi, eliminano gli avvisi rattoppando i CRC, non recuperando buoni dati). Ma la tua domanda riguardava un file .tar.gz, che è un archivio con un grande membro.
Ecco uno scenario possibile che abbiamo riscontrato. Avevamo un file tar.gz che non si decomprimeva, il tentativo di decomprimere ha dato l'errore:
gzip -d A.tar.gz
gzip: A.tar.gz: invalid compressed data--format violated
Ho capito che il file potrebbe originariamente caricato su una connessione ftp non binaria (non lo sappiamo per certo).
La soluzione era relativamente semplice usando l'utility unix dos2unix
dos2unix A.tar.gz
dos2unix: converting file A.tar.gz to UNIX format ...
tar -xvf A.tar
file1.txt
file2.txt
....etc.
Ha funzionato! Questa è una minima possibilità, e forse vale la pena provare - potrebbe aiutare qualcuno là fuori.