Eu tenho um diretório com mais de 400 GiB de dados nele. Eu queria verificar se todos os arquivos podem ser lidos sem erros, então uma maneira simples que pensei foi tar
nisso /dev/null
. Mas, em vez disso, vejo o seguinte comportamento:
$ 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
O terceiro comando acima foi interrompido à força por Ctrl+ Cdepois de já ter sido executado por muito tempo. Além disso, enquanto os dois primeiros comandos estavam funcionando, o indicador de atividade do dispositivo de armazenamento que .
estava quase sempre ocioso. Com o terceiro comando, o indicador fica constantemente aceso, o que significa extrema ocupação.
Portanto, parece que, quando tar
é possível descobrir que seu arquivo de saída é /dev/null
, ou seja, quando /dev/null
é aberto diretamente para ter o identificador de arquivo que tar
grava, o corpo do arquivo aparece ignorado. (A v
opção Adicionar ao tar
imprime todos os arquivos no diretório sendo tar
'vermelhos'.)
Então eu me pergunto, por que isso é assim? É algum tipo de otimização? Se sim, por que você iria tar
querer fazer uma otimização tão duvidosa para um caso tão especial?
Estou usando o GNU tar 1.26 com glibc 2.27 no Linux 4.14.105 amd64.
pv
: tar -cf - | pv >/dev/null
. Isso evita o problema e fornece informações sobre o progresso (as várias pv
opções)
gtar -cf /dev/zero ...
para obter o que você gosta.
find . -type f -exec shasum -a256 -b '{}' +
. Na verdade, ele não apenas lê e soma todos os dados, mas se você armazenar a saída, poderá executá-la novamente mais tarde para verificar se o conteúdo dos arquivos não foi alterado.