Desde que ambas as unidades estejam cheias ou quase cheias, duvido que exista uma solução bonita. Deve ser possível fazer o loop pelos comandos dd. Algo como
#This code is completely untested,
#do NOT just copy paste and use it without proper testing
while [[ $((i*chunkSize)) -lt fileSize ]]; do
dd skip=$i seek=$i bs=$chunkSize count=1 if=fileA of=tmpFileInMemory
dd skip=$i seek=$i bs=$chunkSize count=1 if=fileB of=FileA
dd skip=$i seek=$i bs=$chunkSize count=1 if=tmpFileInMemory of=fileB
done
Algumas verificações são necessárias para quando o arquivo A e o arquivo B tiverem tamanhos diferentes.