No lado do servidor, você pode usar dd
e md5sum
na soma de verificação de cada parte do arquivo:
#!/bin/bash
FILENAME="$1"
FILESIZE='stat --printf="%s" $FILENAME'
CHUNKSIZE=536870912 # 512MB
CHUNKNUM=0
while ! grep -q 'cannot skip' hash.log 2> /dev/null ; do
dd if=$FILENAME bs=$CHUNKSIZE skip=$CHUNKNUM count=1 2> hash.log | md5sum >> $FILENAME.md5
CHUNKNUM=$(( CHUNKNUM + 1 ))
done
rm hash.log
Você ficará com um único arquivo $FILENAME.md5
com todos os hashes de fragmentos.
Agora você pode fazer o download desse arquivo grande e das somas de verificação, executar esse script no arquivo e comparar os hashes. Se alguma peça tiver um hash incompatível, você poderá usar o curl para baixar apenas parte do arquivo (se o servidor suportar RANGE) e corrigir o arquivo com dd.
Por exemplo, se o bloco 2 tiver uma incompatibilidade de hash:
curl -s -r 536870912-1073741824 | dd of=somelargetarfile.tar seek=536870912 conv=notrunc
Isso fará o download do fragmento 2 e corrigirá o arquivo tar grande com ele.