Ho trovato la domanda Come determinare se i dati sono un file tar valido senza un file? , ma mi chiedevo: esiste una soluzione a riga di comando già pronta?
Ho trovato la domanda Come determinare se i dati sono un file tar valido senza un file? , ma mi chiedevo: esiste una soluzione a riga di comando già pronta?
Risposte:
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!
-z
opzione non è necessaria. Non fa nulla in modalità di estrazione o elenco.
-z
Questo è sicuramente il caso di GNU tar - sai se questo è vero altrove (BSD, ecc.)?
tar.gz
? Qualche informazione di supporto?
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 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.
bzip2 -t file.bz2
per i file bz2.
tar -t > /dev/null
(nota: t
vs -t
)?
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*
> /dev/null
per l'esempio funzionante.
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
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 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.
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.
> 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".
-v
se stai solo collegando l'uscita a/dev/null
?