Synchronize local directories with FTP servers.



4.0, Date: Sep 06, 2023

Build Status PyPI Version License Documentation Status



Major version updates (e.g. 3.0 => 4.0, …) introduce breaking changes to the previous versions. Make sure to adjust your scripts accordingly after update.


Version 4.0 drops support for Python 2.


  • This is a command line tool…

  • … and a library for use in custom Python projects.

  • Recursive synchronization of folders on file system and/or FTP targets.

  • Upload, download, and bi-directional synchronization mode.

  • Configurable conflict resolution strategies.

  • Unlike naive implementations, pyftpsync maintains additional meta data to detect conflicts and decide whether to replicate a missing file as deletion or addition.

  • Unlike more complex implementations, pyftpsync does not require a database or a service running on the targets.

  • Optional SFTP and FTPS (TLS) support.

  • Architecture is open to add other target types.

The command line tool adds:

  • Runs on Linux, macOS, and Windows.

  • Remember passwords in system keyring.

  • Interactive conflict resolution mode.

  • Dry-run mode.


Known Limitations

  • The FTP server must support the MLSD command.

  • pyftpsync uses file size and modification dates to detect file changes. This is efficient, but not as robust as CRC checksums could be.

  • pyftpsync tries to detect conflicts (i.e. simultaneous modifications of local and remote targets) by storing last sync time and size in a separate meta data file inside the local folders. This is not bullet proof and may fail under some conditions.

  • Currently conflicts are not detected, when a file is edited on one target and the parent folder is removed on the peer target: The folder will be removed on sync.

In short: Make sure you have backups.


Releases are hosted on PyPI and can be installed using pip:

$ pip install pyftpsync --upgrade
$ pyftpsync --help

See Command Line Interface for details.

In addition to the direct invocation of upload, download, or sync commands, version 3.x allows to define a pyftpsync_yaml file in your project’s root folder which then can be executed like so:

$ pyftpsync run

See Run from pyftpsync.yaml for details.