Eu escrevi um programa C ++ curto para fazer isso, fonte disponível aqui .
Para construí-lo:
wget -O iszero.cpp https://gist.github.com/Elusive138/5070989/raw/2aba8075f8ccd7eb72a718be040bb6204f70404a/iszero.cpp
g++ -o iszero iszero.cpp
Para executá-lo:
dd if=/dev/sdX 2>/dev/null | ./iszero
Ele mostrará a posição e o valor de quaisquer bytes diferentes de zero. Você pode redirecionar essa saída para um arquivo com >
, por exemplo:
dd if=/dev/sdX 2>/dev/null | ./iszero >nonzerochars.txt
Você pode tentar alterar BUFFER_SIZE
para uma melhor eficiência. Não tenho certeza de qual seria o valor ideal. Observe que isso também afeta a frequência com que o progresso é impresso, o que afetará a velocidade (a saída da impressão para o console é lenta ). Adicione 2>/dev/null
para se livrar da saída do progresso.
Estou ciente de que isso não está usando bash padrão, nem mesmo builtins, mas não deve exigir privilégios extras. A solução da @Hennes ainda é mais rápida (eu realmente não otimizei nada - essa é a solução ingênua); No entanto, esse pequeno programa pode dar uma idéia melhor de quantos bytes seu limpador perdeu e em que local. Se você desativar a saída do progresso, ela ainda será mais rápida do que a maioria dos discos rígidos dos consumidores pode ler (> 150 MB / s), então isso não é um grande problema.
Uma versão mais rápida com saída menos detalhada está disponível aqui . No entanto, ainda é um pouco mais lento que a solução da @Hennes. Este, no entanto, será encerrado no primeiro caractere diferente de zero encontrado, por isso é potencialmente muito mais rápido se houver um número diferente de zero próximo ao início do fluxo.
Adicionando fonte para postar para manter a resposta melhor autônoma:
#include <cstdio>
#define BUFFER_SIZE 1024
int main() {
FILE* file = stdin;
char buffer[BUFFER_SIZE];
long long bytes_read = 0;
long long progress = 0;
long long nonzero = 0;
while (bytes_read = fread(buffer, 1, BUFFER_SIZE, file)) {
for (long long i = 0; i < bytes_read; i++) {
progress++;
if (buffer[i] != 0) {
nonzero++;
printf("%lld: %x\n", progress, buffer[i]);
}
}
fprintf(stderr, "%lld bytes processed\r", progress);
}
fprintf(stderr, "\n");
int error = 0;
if (error = ferror(file)) {
fprintf(stderr, "Error reading file, code: %d\n", error);
return -1;
}
printf("%lld nonzero characters encountered.\n", nonzero);
return nonzero;
}