rsync же под это заточен. Если имя файла одно и то же и блоки данных внутри попадают в одно и тоже место, то rsync посчитает контрольные суммы по блочно и передаст только изменения.
Так же разницу между большими бинарными файлами можно сделать с помощью xdelta. Задачу впрямую не решает, но вдруг пригодится.