ATT ksh93, bash e dash (mas não pdksh ou mksh) e pelo menos algumas configurações do BusyBox suportam aritmética de 64 bits mesmo em plataformas de 32 bits.
Você não precisa de aritmética de shell de 64 bits, desde que seus arquivos não sejam maiores que 4EB. Chame bc
de uma vez por todas para contar o número de blocos de 1GB no arquivo e, em seguida, chame dd
uma vez por bloco.
typeset size=$(ls -log -- "${1}" | awk 'NR==1 {print $3}')
typeset blocks=$(echo "($size - 1) / 1073741824" | bc)
typeset -i b
for ((b = 0; b < blocks; b++)); do
dd if="$1" bs=1073741824 skip=$b | …
done
Como alternativa, você pode chamar dd
em um loop, com todo o loop lendo do arquivo. A dificuldade é perceber quando a entrada está vazia; dd
informa sobre seu erro padrão.
while
case "$({ LC_ALL=C dd bs=1048576 count=1024 2>&3 | … 1>&4; } 3>&1)" in
'0+0 records in'*) false;;
esac
do
:
done <"$1" 4>&1
Se o tamanho do arquivo for um múltiplo exato do tamanho do bloco, o aplicativo será executado com um arquivo vazio na última vez. Isso parece difícil de evitar; uma solução desajeitada seria ler o próximo byte, embora tenha cuidado, pois, se você o ler em uma variável shell, precisará tomar cuidado para que, se for um byte nulo, você receba uma string vazia.