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.
text-processing
sparse-files
Stéphane Chazelas
fonte
fonte
strings
?tr
porque ainda lê o arquivo inteiro e faz mais do que apenas remover os bytes NUL.Respostas:
O melhor que pude apresentar até agora é (ksh93, usando a
filefrag
partir dee2fsprogs
1.42.9 (algumas versões mais antigas têm uma API diferente), em sistemas de arquivos baseados em extensão no Linux):filefrag
relata as extensões do arquivo usando o FIEMAP ioctl para os sistemas de arquivos que o suportam.A
*unwritten*
parte cobre os arquivos (não esparsos, mas ainda cheios de zeros nos quais não estou interessado) que foramfallocated
mas não foram gravados.Versões recentes
bsdtar
oustar
podem usar algumas dessas APIs para gerar umtar
arquivo que identifica as seções esparsas como tais. Isso tornaria uma solução mais portátil , mas seria necessário analisar o arquivo tar gerado para obter as seções não esparsas.fonte