Concurrent Sync

A concurrent sync tool which works similar to rsync. It supports syncing given sources with multiple targets
concurrently.

Requirements

Python >= 3.8 is required. (CPython and PyPy are both supported)

Installation

Concurrent Sync can be either installed directly via pip:

pip install concurrent-sync

Or it can be installed from the source:

git clone https://github.com/simsekhalit/concurrent-sync.git
python3 -m pip install ./concurrent-sync

Manual

$ python3 -m csync --help
usage: csync [-h] [--max-memory MAX_MEMORY] [--target TARGET] SOURCE [SOURCE ...] TARGET

A concurrent sync tool which works similar to rsync. It supports syncing given sources with multiple targets concurrently.

positional arguments:
  SOURCE                specify source directories/files
  TARGET                specify target directory

optional arguments:
  -h, --help            show this help message and exit
  --max-memory MAX_MEMORY
                        specify allowed max memory usage as percent
  --target TARGET       specify additional target directories

For more information: https://github.com/simsekhalit/concurrent-sync

Concurrent Sync takes one or more source paths and one or more target paths as arguments.
All the given source paths are synced with each given target path concurrently.

  • Only the missing or changed files are copied from source to target.
  • While checking if a file is changed, its modification time and size are used similar to rsync.
  • Trailing slash at the end of the source is interpreted in a similar way to rsync.

Following Examples section clarifies the working mechanics in a more clear way.

Examples

1. One source path and one target path are given

Source

/mnt/Source
/mnt/Source/File1
/mnt/Source/File2
/mnt/Source/Folder1
/mnt/Source/Folder2
/mnt/Source/Folder2/File3

Target

/mnt/Target

Following command is executed:

python3 -m csync /mnt/Source /mnt/Target

After the sync is completed, target becomes:

/mnt/Target
/mnt/Target/Source
/mnt/Target/Source/File1
/mnt/Target/Source/File2
/mnt/Target/Source/Folder1
/mnt/Target/Source/Folder2
/mnt/Target/Source/Folder2/File3

2. Two source paths and one target are given

Source 1

/mnt/Source1
/mnt/Source1/File1
/mnt/Source1/File2

Source 2

/mnt/Source2
/mnt/Source2/File3
/mnt/Source2/File4

Target

/mnt/Target

Following command is executed:

python3 -m csync /mnt/Source1 /mnt/Source2 /mnt/Target

After the sync is completed, target becomes:

/mnt/Target
/mnt/Target/Source1
/mnt/Target/Source1/File1
/mnt/Target/Source1/File2
/mnt/Target/Source2
/mnt/Target/Source2/File3
/mnt/Target/Source2/File4

3. Source with trailing slash and target are given

Source

/mnt/Source
/mnt/Source/File1
/mnt/Source/File2

Target

/mnt/Target

Following command is executed:

python3 -m csync /mnt/Source/ /mnt/Target

After the sync is completed, target becomes:

/mnt/Target
/mnt/Target/File1
/mnt/Target/File2

4. Source and target with common paths

While syncing subdirectories of source paths with target paths, redundant files/folders are removed.

Source

/mnt/Source
/mnt/Source/Folder
/mnt/Source/Folder/File1
/mnt/Source/Folder/File2

Target

/mnt/Target
/mnt/Target/Source
/mnt/Target/Source/Folder
/mnt/Target/Source/Folder/File3

Following command is executed:

python3 -m csync /mnt/Source /mnt/Target

After the sync is completed, target becomes:

/mnt/Target
/mnt/Target/Source
/mnt/Target/Source/Folder
/mnt/Target/Source/Folder/File1
/mnt/Target/Source/Folder/File2

Since File3 is no longer in the source path it’s deleted from the target as well.

5. One source path and two target paths are given

Source

/mnt/Source
/mnt/Source/File1
/mnt/Source/File2

Target 1

/mnt/Target1

Target 2

/mnt/Target2

Following command is executed:

python3 -m csync /mnt/Source /mnt/Target1 --target /mnt/Target2

After the sync is completed, targets become:

Target 1

/mnt/Target1
/mnt/Target1/Source
/mnt/Target1/Source/File1
/mnt/Target1/Source/File2

Target 2

/mnt/Target2
/mnt/Target2/Source
/mnt/Target2/Source/File1
/mnt/Target2/Source/File2

GitHub

View Github