2010-01-04 32 views

Respuesta

89

¿Qué tal si acabamos de obtener una lista del tarball y desechamos la salida, en lugar de descomprimir el archivo?

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

Editado según el comentario. Gracias zrajm!

Editar como por comentario. Gracias Frozen Flame! Esta prueba de ninguna manera implica la integridad de los datos. Debido a que fue diseñado como una utilidad de archivado de cintas, la mayoría de las implementaciones de tar permitirán múltiples copias del mismo archivo.

+10

¿Por qué usar '-v' si solo está conectando la salida a'/dev/null'? – zrajm

+1

True @zrajm. ¡Adivina que es mi memoria muscular pateando! (-: –

+3

La opción '-z' tampoco es necesaria. No hace nada en el modo de extracción o de lista. – asmeurer

80

que probablemente se podría utilizar la opción -t gzip para probar la integridad de los archivos

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

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

Para probar el archivo gzip no está dañado:

gunzip -t file.tar.gz 

Para probar que el archivo tar no está dañado en el interior:

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

Como parte de la copia de seguridad probablemente solo podría ejecutar el último comando y comprobar el valor de $? luego para un valor de 0 (éxito). Si el tar o el gzip tienen un problema, $? tendrá un valor distinto de cero.

+2

'gunzip -t file.gz': Esta prueba puede pasar, sin embargo, no prueba la integridad del archivo de archivo de cinta (tar). –

+0

Gracias Felipe, he incorporado tu valioso aporte en la respuesta. – spacediver

+0

Y 'bzip2 -t file.bz2' para archivos bz2. – asmeurer

24

Si desea hacer un extracto de prueba real de un archivo tar sin extraerlo al disco, use la opción -O. Esto arroja el extracto a la salida estándar en lugar del sistema de archivos. Si el archivo tar está dañado, el proceso abortará con un error.

Ejemplo de ensayo de la bola de alquitrán fallado ...

$ 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.* 

Ejemplo de trabajo ...

$ 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

Me parece que la mejor prueba es esta. Realmente extrae cada archivo y se asegura de que no haya errores. – sleeves

+0

Realmente útil. He hecho un script de shell, agregué un argumento hook para pasar la ruta del archivo y ponerlo en mi ruta :) [tar -xvzf $ 1 -O>/dev/null] – smonff

+0

@sleeves ¿Por qué crees que es mejor que la respuesta aceptada? tar -tvzf hello.tgz>/dev/null también da el mismo error. – dash17291

0

> use the -O option. [...] If the tar file is corrupt, the process will abort with an error.

A veces sí, pero a veces no. Veamos un ejemplo de un archivo dañado:

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 

Muestra:

my_name 
Fool 

Aunque ejecute

echo $? 

alquitrán dijo que no hubo error:

0 

pero el archivo estaba dañado, tiene n ow "Fool" en lugar de "Pete".

+0

La gente raramente usa archivos tar sin ninguna compresión. Supongo que su comentario se refiere solo a los archivos sin comprimir. – Jarekczek

+3

Estás confundiendo la integridad con la corrupción. Su archivo ha perdido su integridad, pero sigue siendo un formato de archivo aceptable. – Phil

9

También puede consultar los contenidos de * .tag.gz archivo usando pigz (gzip paralelo) a speedup la comprobación de archivo:

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

Una buena opción es utilizar tar -tvvf <filePath> que añade una línea que informa sobre el tipo de archivo.

Ejemplo de un archivo tar válido:

> 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 

dañado archivo tar:

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

Esto ocurre en BSD tar pero no en GNU tar. – mcallister

3

He intentado el siguiente comando y funcionan bien.

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

Sin embargo, podemos encontrar que estos dos comandos son lentos. Quizás necesitemos una forma más rápida de determinar la integridad de los archivos comprimidos.

0

Estas son soluciones muy poco óptimas. Desde el GZIP spec

ID2 (IDentification 2)
These have the fixed values ID1 = 31 (0x1f, \037), ID2 = 139 (0x8b, \213), to identify the file as being in gzip format.

tiene que ser codificado en cualquier idioma que está utilizando.

Cuestiones relacionadas