lftp é uma ótima ferramenta para isso, é programável usando o comando mirror:
lftp has builtin mirror which can download or update a whole
directory tree. There is also reverse mirror (mirror -R)
which uploads or updates a directory tree on server. Mirror
can also synchronize directories between two remote servers,
using FXP if available.
$ lftp -f
script_file:
open ftp://<user>:<pass>@ftp.blah.org/~
set net:timeout 10
set net:max-retries 2
set net:reconnect-interval-base 5
set net:reconnect-interval-multiplier 1
mirror dir1 dir1
exit