O melhor que eu pude chegar até agora é (ksh93, usando filefrag
de e2fsprogs
1.42.9 (algumas versões mais antigas têm uma API diferente), em sistemas de arquivos baseados em extensão no Linux):
#! /bin/ksh93
export LC_ALL=C
for file do
filefrag -vb1 -- "$file" |
while IFS=": ." read -A a; do
[[ $a = +([0-9]) ]] && [[ ${a[@]} != *unwritten* ]] &&
command /opt/ast/bin/head -s "${a[1]}" -c "${a[7]}" -- "$file"
done
done
filefrag
informa as extensões do arquivo usando o FIEMAP ioctl para os sistemas de arquivos que o suportam.
A parte *unwritten*
cobre os arquivos (não esparsos, mas ainda cheios de zeros nos quais não estou interessado) que foram fallocated
, mas não gravados em.
As versões recentes de bsdtar
ou star
podem usar algumas dessas APIs para gerar um arquivo tar
que identifica as seções esparsas como tal. Isso criaria uma solução mais portátil , mas seria necessário analisar o arquivo tar gerado para obter as seções não esparsas.