Imagine um arquivo criado com:
truncate -s1T file
echo test >> file
truncate -s2T file
Agora eu tenho um arquivo de 2 tebibytes (que ocupa 4kiB no disco), com "test\n"
escrito no meio.
Como eu recuperaria isso com "test"
eficiência, ou seja, sem ter que ler o arquivo inteiro.
tr -d '\0' < file
Me daria o resultado, mas isso levaria horas.
O que eu gostaria é algo que produz apenas as partes não esparsas do arquivo (tão acima apenas "test\n"
ou mais provavelmente, o bloco 4kiB alocado no disco que armazena esses dados).
Existem APIs para descobrir qual parte do arquivo está alocada (FIBMAP, FIEMAP, SEEK_HOLE, SEEK_DATA ...), mas que ferramentas as expõem?
Uma solução portátil (pelo menos para os sistemas operacionais que suportam essas APIs) seria apreciada.
tr
porque ainda lê o arquivo inteiro e faz mais do que apenas remover os bytes NUL.
strings
?