Se você conseguir acessar o disco bruto (sem criptografia), poderá fazer:
dd if=/dev/sda bs=1M count=100 2>/dev/null | tr -d '$ time { { { sudo dd if=/dev/sdX bs=100M 2> >(grep -oP '[0-9]+(?=\s*bytes)' 1>&2 ) | tr -d '766568020/999292928
' | wc -c; } 2>&1; } | { read -d '' a b; echo "$b/$a"; }; }
' | wc -c
Isso vai ler 100Mega byte do disco, remover todos os zeros e contar o número de bytes restantes.
Eu não sei se esse é o método mais rápido, mas deve ser bastante rápido, supondo que haja mais zeros que os dados.
O comando acima lerá 100 vezes 1Mega byte
ou 100*2^20
(104857600) bytes (se estiverem disponíveis). Tente com um número pequeno (10 ou 100) para testar a velocidade e como o comando funciona. Para ler todo o disco apenas remova a opção count, deixe o lado do disco limitar o comando.
Extraindo os dois valores que importam (contagem total de bytes em disco e número de bytes diferentes de zero), o comando se torna mais complexo:
$ bc <<<'(1-766568020/999292928)*100'
23.28895776994831289400
Que imprimirá os dois valores como: non-zero/disk
, como:
dd if=/dev/sda bs=1M count=100 2>/dev/null | tr -d '$ time { { { sudo dd if=/dev/sdX bs=100M 2> >(grep -oP '[0-9]+(?=\s*bytes)' 1>&2 ) | tr -d '766568020/999292928
' | wc -c; } 2>&1; } | { read -d '' a b; echo "$b/$a"; }; }
' | wc -c
Calcule 1-766568020/999292928
para encontrar a porcentagem de zero bytes:
$ bc <<<'(1-766568020/999292928)*100'
23.28895776994831289400