A concurrent sync tool which works similar to rsync
. It supports syncing given sources with multiple targets
concurrently.
Python >= 3.8 is required. (CPython and PyPy are both supported)
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
$ 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.
/mnt/Source
/mnt/Source/File1
/mnt/Source/File2
/mnt/Source/Folder1
/mnt/Source/Folder2
/mnt/Source/Folder2/File3
/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
/mnt/Source1
/mnt/Source1/File1
/mnt/Source1/File2
/mnt/Source2
/mnt/Source2/File3
/mnt/Source2/File4
/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
/mnt/Source
/mnt/Source/File1
/mnt/Source/File2
/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
While syncing subdirectories of source paths with target paths, redundant files/folders are removed.
/mnt/Source
/mnt/Source/Folder
/mnt/Source/Folder/File1
/mnt/Source/Folder/File2
/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.
/mnt/Source
/mnt/Source/File1
/mnt/Source/File2
/mnt/Target1
/mnt/Target2
Following command is executed:
python3 -m csync /mnt/Source /mnt/Target1 --target /mnt/Target2
After the sync is completed, targets become:
/mnt/Target1
/mnt/Target1/Source
/mnt/Target1/Source/File1
/mnt/Target1/Source/File2
/mnt/Target2
/mnt/Target2/Source
/mnt/Target2/Source/File1
/mnt/Target2/Source/File2