Если у вас нет старых и новых версий файлов на одной машине, тогда алгоритмы, подобные rsync, - это путь вперед (см. Предыдущие ответы). Если у вас есть как старые, так и новые версии файлов на одном компьютере, вы можете делать лучше, чем rsync: создавать сжатые различия и отправлять их по сети.
Для создания эффективных различий ознакомьтесь с бинарным дельта-сжатием VCDIFF (RFC 3284). Одна хорошая реализация - xdelta (www.xdelta.org). Довольно легко реализовать декодер/декомпрессор, если вы хотите избежать использования xdelta на принимающей стороне из-за проблем с лицензией. Написание собственного генератора дифференциальных данных VCDIFF, создающего компактные различия, намного сложнее (например, поиск перемещенных блоков в качестве примера).
В VCDIFF различия также могут быть излишними, что означает, что они распаковываются в целевой файл без какого-либо исходного файла (файл, к которому применяется diff) - в VCDIFF сжатие файла является особым случаем создания сжатая дельта между двумя файлами. Это полезно, потому что вы можете использовать тот же формат независимо от того, имеет ли место назначения версию вашего файла.
Это на самом деле даже лучше, чем это - он использует скользящую контрольную сумму, которая может обнаруживать равные блоки, даже если они были перенесены в местоположения, не привязанные к блокам. – ephemient
Пока я писал свой ответ, я понял, что вы забыли упомянуть о хорошей точке продажи rsync: он работает без одновременной синхронизации обеих версий файла на машине-отправителе. – Alexander