Come verificare se un file Unix .tar.gz è un file valido senza decomprimerlo?


Risposte:


122

Che ne dici di ottenere un elenco del tarball e buttare via l'output, invece di decomprimere il file?

tar -tzf my_tar.tar.gz >/dev/null

Modificato come da commento. Grazie zrajm!

Modifica come da commento. Grazie Frozen Flame! Questo test non implica in alcun modo l'integrità dei dati. Poiché è stata progettata come utilità di archiviazione su nastro, la maggior parte delle implementazioni di tar consentirà più copie dello stesso file!


13
Perché usarlo -vse stai solo collegando l'uscita a /dev/null?
zrajm

2
Vero @zrajm. Immagino sia la mia memoria muscolare che entra in gioco! (-:
Rob Wells

5
Anche l' -zopzione non è necessaria. Non fa nulla in modalità di estrazione o elenco.
asmeurer

1
@asmeurer Re: -zQuesto è sicuramente il caso di GNU tar - sai se questo è vero altrove (BSD, ecc.)?
belacqua

2
@bobwells Ma la corretta decompressione o l'elenco dei file di contenuto implica l'integrità dei dati di tar.gz? Qualche informazione di supporto?
Frozen Flame

99

probabilmente potresti usare l'opzione gzip -t per testare l'integrità dei file

http://linux.about.com/od/commands/l/blcmdl1_gzip.htm

da: http://unix.ittoolbox.com/groups/technical-functional/shellscript-l/how-to-test-file-integrity-of-targz-1138880

Per verificare che il file gzip non sia danneggiato:

gunzip -t file.tar.gz

Per testare il file tar all'interno non è danneggiato:

gunzip -c file.tar.gz | tar -t > /dev/null

Come parte del backup potresti probabilmente eseguire l'ultimo comando e controllare il valore di $? successivamente per un valore 0 (successo). Se il tar o il gzip hanno un problema, $? avrà un valore diverso da zero.


3
E bzip2 -t file.bz2per i file bz2.
asmeurer

4
Non sta usando solo due comandi per fare quello che fa "tar -tzf my_tar.tar.gz> / dev / null"?
Rob Wells

Non dovrebbe essere tar -t > /dev/null(nota: tvs -t)?
Intrastellar Explorer

1
@IntrastellarExplorer che è un errore di battitura da parte mia, anche se dovrebbe comunque funzionare senza il trattino. Sono solo abituato alle opzioni del vecchio stile su tar. unix.stackexchange.com/questions/394060/…
John Boker

32

Se vuoi fare un vero estratto di prova di un file tar senza estrarlo su disco, usa l'opzione -O. Questo restituisce l'estratto allo standard output invece che al filesystem. Se il file tar è danneggiato, il processo si interromperà con un errore.

Esempio di test della palla di catrame fallito ...

$ echo "this will not pass the test" > hello.tgz
$ tar -xvzf hello.tgz -O > /dev/null
gzip: stdin: not in gzip format
tar: Child returned status 1
tar: Error exit delayed from previous errors
$ rm hello.*

Esempio di lavoro ...

$ ls hello*
ls: hello*: No such file or directory
$ echo "hello1" > hello1.txt
$ echo "hello2" > hello2.txt
$ tar -cvzf hello.tgz hello[12].txt
hello1.txt
hello2.txt
$ rm hello[12].txt
$ ls hello*
hello.tgz
$ tar -xvzf hello.tgz -O
hello1.txt
hello1
hello2.txt
hello2
$ ls hello*
hello.tgz
$ tar -xvzf hello.tgz
hello1.txt
hello2.txt
$ ls hello*
hello1.txt  hello2.txt  hello.tgz
$ rm hello*

1
Mi sembra che il test migliore sia questo. Estrae veramente ogni file e si assicura che non ci siano errori.
maniche

Davvero utile. Ho creato uno script di shell, aggiungo un argomento hook per passare il percorso del file e inserirlo nel mio percorso :) [tar -xvzf $ 1 -O> / dev / null]
smonff

@sleeves Perché pensi che sia migliore della risposta accettata? Anche tar -tvzf hello.tgz> / dev / null restituisce lo stesso errore.
dash 17291

5
@ dash17291 Dico questo perché mi aspetto che sia un problema difficile dimostrare che per tutti i casi, un -tvf rileverà tutti gli errori o le corruzioni che un -xvf. In altre parole, -xvf catturerà tutto ciò -tvf, ma non posso dire che sia vero il contrario.
maniche

Forse dovresti usarlo anche > /dev/nullper l'esempio funzionante.
moi

12

Puoi anche controllare il contenuto del file * .tag.gz usando pigz(parallel gzip) per velocizzare il controllo dell'archivio:

pigz -cvdp number_of_threads /[...]path[...]/archive_name.tar.gz | tar -tv > /dev/null

Mini benchmark: eseguirlo con pigz -cvd: 80s, mentre gira con la risposta accettata tar -tzv: 143s su un archivio 22G.
Wadih M.

come si rimuove la notifica da cronjob riguardo a "tar: rimozione di" / "dai nomi dei membri" quando si utilizza questo metodo?
MaXi32

3

Ho provato il seguente comando e funzionano bene.

bzip2 -t file.bz2
gunzip -t file.gz

Tuttavia, possiamo scoprire che questi due comandi richiedono molto tempo. Forse abbiamo bisogno di un modo più rapido per determinare l'integrità dei file compressi.


2

Una buona opzione è usare tar -tvvf <filePath>che aggiunge una riga che riporta il tipo di file.

Esempio in un file .tar valido:

> tar -tvvf filename.tar 
drwxr-xr-x  0 diegoreymendez staff       0 Jul 31 12:46 ./testfolder2/
-rw-r--r--  0 diegoreymendez staff      82 Jul 31 12:46 ./testfolder2/._.DS_Store
-rw-r--r--  0 diegoreymendez staff    6148 Jul 31 12:46 ./testfolder2/.DS_Store
drwxr-xr-x  0 diegoreymendez staff       0 Jul 31 12:42 ./testfolder2/testfolder/
-rw-r--r--  0 diegoreymendez staff      82 Jul 31 12:42 ./testfolder2/testfolder/._.DS_Store
-rw-r--r--  0 diegoreymendez staff    6148 Jul 31 12:42 ./testfolder2/testfolder/.DS_Store
-rw-r--r--  0 diegoreymendez staff  325377 Jul  5 09:50 ./testfolder2/testfolder/Scala.pages
Archive Format: POSIX ustar format,  Compression: none

File .tar danneggiato:

> tar -tvvf corrupted.tar 
tar: Unrecognized archive format
Archive Format: (null),  Compression: none
tar: Error exit delayed from previous errors.

Ciò si verifica su tar BSD ma non su tar GNU.
mcallister

1

Queste sono tutte soluzioni molto subottimali. Dalle specifiche GZIP

ID2 (IDentification 2)
Questi hanno i valori fissi ID1 = 31 (0x1f, \ 037), ID2 = 139 (0x8b, \ 213), per identificare il file come in formato gzip.

Deve essere codificato nella lingua che stai utilizzando.


se il file è stato troncato, sarebbe necessaria una decompressione completa per essere rilevato
philwalk

0

> usa l'opzione -O. [...] Se il file tar è danneggiato, il processo si interromperà con un errore.

A volte sì, ma a volte no. Vediamo un esempio di un file danneggiato:

echo Pete > my_name
tar -cf my_data.tar my_name 

# // Simulate a corruption
sed < my_data.tar 's/Pete/Fool/' > my_data_now.tar
# // "my_data_now.tar" is the corrupted file

tar -xvf my_data_now.tar -O

Mostra:

my_name
Fool  

Anche se esegui

echo $?

tar ha detto che non ci sono stati errori:

0

ma il file era danneggiato, ora ha "Fool" invece di "Pete".


Le persone usano raramente i file tar senza alcuna compressione. Immagino che la tua osservazione riguardi solo i file non compressi.
Jarekczek

6
Confondi l'integrità con la corruzione. Il tuo file ha perso la sua integrità, ma è ancora un formato di archivio accettabile.
Phil
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.