He encontrado la pregunta ¿Cómo determinar si los datos son archivos tar válidos sin un archivo? , pero me preguntaba: ¿existe una solución de línea de comandos preparada?
He encontrado la pregunta ¿Cómo determinar si los datos son archivos tar válidos sin un archivo? , pero me preguntaba: ¿existe una solución de línea de comandos preparada?
Respuestas:
¿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.
-z
opción también es innecesaria. No hace nada en el modo de extracción o lista.
-z
Ese es definitivamente el caso con GNU tar. ¿Sabes si esto es cierto en otros lugares (BSD, etc.)?
tar.gz
? ¿Alguna información de apoyo?
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
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.
bzip2 -t file.bz2
para archivos bz2.
tar -t > /dev/null
(nota: t
vs -t
)?
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*
> /dev/null
para el ejemplo de trabajo.
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
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.
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.
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.
> 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".
-v
si solo está canalizando la salida/dev/null
?