Come verificare se un file Unix .tar.gz è un file valido senza decomprimerlo?
-
18-09-2019 - |
Domanda
Ho trovato la domanda Come determinare se i dati sono un file tar valido senza un file?, ma mi chiedevo:esiste una soluzione da riga di comando già pronta?
Soluzione
Che ne dici di ottenere semplicemente 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 Fiamma Congelata! Questo test non implica in alcun modo l'integrità dei dati.Poiché è stato progettato come un'utilità di archiviazione su nastro, la maggior parte delle implementazioni di tar consentirà più copie dello stesso file!
Altri suggerimenti
probabilmente potresti usare l'opzione gzip -t per testare l'integrità dei file
http://linux.about.com/od/commands/l/blcmdl1_gzip.htm
Per verificare che il file gzip non sia corrotto:
gunzip -t file.tar.gz
Per verificare che il file tar all'interno non sia danneggiato:
gunzip -c file.tar.gz | tar t > /dev/null
Come parte del backup potresti probabilmente semplicemente eseguire quest'ultimo comando e controllare il valore di $?successivamente per un valore 0 (successo).Se il catrame o il gzip hanno un problema, $?avrà un valore diverso da zero.
Se vuoi eseguire un vero estratto di prova di un file tar senza estrarlo su disco, usa l'opzione -O.Questo invia l'estratto all'output standard invece che al filesystem.Se il file tar è danneggiato, il processo si interromperà con un errore.
Esempio di test con 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 funzionante...
$ 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*
Puoi anche controllare il contenuto del file *.tag.gz usando pigz
(gzip parallelo) per velocizzare il controllo dell'archivio:
pigz -cvdp number_of_threads /[...]path[...]/archive_name.tar.gz | tar -tv > /dev/null
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.
Una bella 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.
Queste sono tutte soluzioni molto subottimali.Dal Specifiche GZIP
ID2 (Identificazione 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 in qualunque lingua tu stia utilizzando.
> 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 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 c'erano errori:
0
ma il file era danneggiato, ora c'è "Fool" invece di "Pete".