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?

È stato utile?

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

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 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".

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top