Tengo un directorio con más de 400 GiB de datos. Quería comprobar que todos los archivos se pueden leer sin errores, por lo que una forma sencilla que pensé fue que tar
en /dev/null
. Pero en cambio veo el siguiente comportamiento:
$ time tar cf /dev/null .
real 0m4.387s
user 0m3.462s
sys 0m0.185s
$ time tar cf - . > /dev/null
real 0m3.130s
user 0m3.091s
sys 0m0.035s
$ time tar cf - . | cat > /dev/null
^C
real 10m32.985s
user 0m1.942s
sys 0m33.764s
El tercer comando anterior fue detenido a la fuerza por Ctrl+ Cdespués de haberlo ejecutado durante bastante tiempo. Además, mientras los dos primeros comandos estaban funcionando, el indicador de actividad del dispositivo de almacenamiento que contenía .
casi siempre estaba inactivo. Con el tercer comando, el indicador se ilumina constantemente, lo que significa ocupado extremo.
Por lo tanto, parece que, cuando tar
puede descubrir que su archivo de salida es /dev/null
, es decir, cuando /dev/null
se abre directamente para tener el identificador de archivo en el que tar
escribe, el cuerpo del archivo parece omitido. (Agregar v
opción a tar
imprime todos los archivos en el directorio siendo tar
'rojo').
Entonces me pregunto, ¿por qué es así? ¿Es algún tipo de optimización? En caso afirmativo, ¿por qué tar
querría hacer una optimización tan dudosa para un caso tan especial?
Estoy usando GNU tar 1.26 con glibc 2.27 en Linux 4.14.105 amd64.
pv
: tar -cf - | pv >/dev/null
. Eso evita el problema y le brinda información sobre el progreso (las diversas pv
opciones)
gtar -cf /dev/zero ...
para obtener lo que le gusta.
find . -type f -exec shasum -a256 -b '{}' +
. No sólo hecho de leer y suma de comprobación de todos los datos, pero si almacena la salida, se puede volver a ejecutarlo más tarde para comprobar que el contenido de los archivos no ha cambiado.