Pyftpsync¶
Synchronize local directories with FTP servers.
- Project
- Version
4.0, Date: Sep 06, 2023

Warning
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.
Warning
Version 4.0 drops support for Python 2.
Features¶
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.
Note
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.
Quickstart¶
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.