¿Cómo comprobar si un archivo .tar.gz de Unix es un archivo válido sin descomprimirlo?

Respuestas:

121

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

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

Editado según comentario. ¡Gracias zrajm!

Edite según el 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 archivo en cinta, la mayoría de las implementaciones de tar permitirán múltiples copias del mismo archivo.

Rob Wells
fuente
13
¿Por qué usarlo -vsi solo está canalizando la salida /dev/null?
zrajm
2
Verdadero @zrajm. ¡Supongo que es mi memoria muscular entrando en acción! (-:
Rob Wells
5
La -zopción también es innecesaria. No hace nada en el modo de extracción o lista.
asmeurer
1
@asmeurer Re: -zEse es definitivamente el caso con GNU tar. ¿Sabes si esto es cierto en otros lugares (BSD, etc.)?
belacqua
2
@bobwells ¿Pero la descompresión exitosa o la lista de archivos de contenido implican la integridad de los datos del tar.gz? ¿Alguna información de apoyo?
Frozen Flame
99

probablemente podría usar la opción gzip -t 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 que el archivo gzip no está dañado:

gunzip -t file.tar.gz

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

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

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

John Boker
fuente
3
Y bzip2 -t file.bz2para archivos bz2.
asmeurer
4
¿No es esto solo usar dos comandos para hacer lo que hace "tar -tzf my_tar.tar.gz> / dev / null"?
Rob Wells
¿No se supone que debe ser tar -t > /dev/null(nota: tvs -t)?
Explorador intraestelar
1
@IntrastellarExplorer que es un error tipográfico de mi parte, aunque todavía debería funcionar sin el guión. Estoy acostumbrado a las opciones de estilo antiguo en alquitrán. unix.stackexchange.com/questions/394060/…
John Boker
32

Si desea hacer una extracción 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 se cancelará con un error.

Ejemplo de prueba fallida de bola de alquitrán ...

$ 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*
Ossie Moore
fuente
1
Me parece que la mejor prueba es esta. Realmente extrae cada archivo y se asegura de que no haya errores.
mangas
Realmente util. Hice un script de shell, agregué un gancho de argumento para pasar la ruta del archivo y ponerlo en mi ruta :) [tar -xvzf $ 1 -O> / dev / null]
smonff
@sleeves ¿Por qué crees que es mejor que la respuesta aceptada? tar -tvzf hello.tgz> / dev / null también da el mismo error.
dash17291
5
@ dash17291 Digo esto porque espero que sea un problema difícil demostrar que en todos los casos, un -tvf detectará todos los errores o corrupciones que un -xvf. En otras palabras, -xvf capturará todo ese -tvf, pero no puedo decir que lo contrario sea cierto.
Mangas
Quizás también debería usarlo > /dev/nullpara el ejemplo de trabajo.
moi
12

También puede verificar el contenido del archivo * .tag.gz usando pigz(gzip paralelo) para acelerar la verificación del archivo:

pigz -cvdp number_of_threads /[...]path[...]/archive_name.tar.gz | tar -tv > /dev/null
ein
fuente
Mini benchmark: ejecutándolo con pigz -cvd: 80s, mientras se ejecuta con la respuesta aceptada tar -tzv: 143s en un archivo 22G.
Wadih M.
¿Cómo se elimina la notificación de cronjob sobre "tar: Eliminando el` / 'inicial de los nombres de los miembros "cuando se usa este método?
MaXi32
3

He probado el siguiente comando y funcionan bien.

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

Sin embargo, podemos encontrar que estos dos comandos requieren mucho tiempo. Tal vez necesitemos una forma más rápida de determinar si los archivos comprimidos están intactos.

Shicheng Guo
fuente
2

Una buena opción es usar tar -tvvf <filePath>que agrega una línea que informa el tipo de archivo.

Ejemplo en 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

Archivo .tar dañado:

> tar -tvvf corrupted.tar 
tar: Unrecognized archive format
Archive Format: (null),  Compression: none
tar: Error exit delayed from previous errors.
diegoreymendez
fuente
Esto ocurre en BSD tar pero no en GNU tar.
mcallister
1

Todas estas son soluciones muy subóptimas. De la especificación GZIP

ID2 (IDentificación 2)
Estos tienen los valores fijos ID1 = 31 (0x1f, \ 037), ID2 = 139 (0x8b, \ 213), para identificar el archivo en formato gzip.

Tiene que estar codificado en el idioma que esté utilizando.

Kevin Liu
fuente
si el archivo se ha truncado, parece que se requiere una descompresión completa para detectarlo
philwalk
0

> use la opción -O. [...] Si el archivo tar está dañado, el proceso se cancelará con un 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  

Incluso si ejecutas

echo $?

tar dijo que no había ningún error:

0

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

Sys
fuente
La gente rara vez usa archivos tar sin compresión. Supongo que su comentario se refiere solo a archivos sin comprimir.
Jarekczek
6
Confundes integridad con corrupción. Su archivo ha perdido su integridad pero sigue siendo un formato de archivo aceptable.
Phil