# CopyAcross
[](https://opensource.org/licenses/MIT)
**CopyAcross** is a cross-platform, bi-directional file synchronization tool built in Python. It supports local-to-local, local-to-remote, remote-to-local, and remote-to-remote file and folder sync.
---
## Features
- One-way or bi-directional sync between sources and destinations.
- Supports local folders and remote hosts over SSH/SFTP.
- SHA-256 verification to ensure files are copied correctly.
- Parallel transfers for faster synchronization.
- Easy YAML-based configuration.
- Logs progress and errors with optional log files.
- Dry-run mode (planned for future release) to simulate sync without copying files.
---
## Limitations (Current Version)
- **Dry-run not yet implemented:** Currently, all sync operations will copy files; dry-run will be supported in a future release.
- **Remote verification skipped:** Verification is only done for local sources.
- **No conflict resolution:** For bi-directional sync, conflicts (e.g., modified files on both ends) are not automatically resolved.
- **Large folders:** Performance for extremely large directories (>100k files) may require tuning `parallel` and system resources.
- **Platform-dependent path issues:** Some path inconsistencies may appear when syncing between Windows and Linux/Unix.
---
## Future Improvements
- Full **dry-run** support for previewing sync actions.
- Conflict resolution strategies (latest file wins, merge strategies).
- Incremental sync (only changed files) for large datasets.
- Windows UNC and SMB share support.
- Progress bars for file and folder transfers.
- Advanced logging and optional email notifications on sync completion/failure.
---
## Project Aim
The goal of **CopyAcross** is to provide a **simple, reliable, and cross-platform file synchronization tool** that:
- Can handle both local and remote directories.
- Supports multi-threaded transfer for faster operations.
- Provides verification to ensure file integrity.
- Serves both **newbies** (easy config and usage) and **experienced users** (customizable, scriptable, and extendable).
---
## Installation
```bash
# Using pip (PyPI release coming soon)
pip install copyacross
````
Or install from source:
```bash
git clone https://github.com/compilersutra/copyacross.git
cd copyacross
pip install .
```
---
> For more example see example folder
## Quick Start
### 1. Create a config file (`config.yaml`):
```yaml
sync_direction: one-way
log_config: true
parallel: 4
ssh_key: null
sources:
- path: "/home/user/source_folder/"
type: folder
host: null
destinations:
- path: "/home/user/destination_folder/"
type: folder
host: user@192.168.0.100
```
### 2. Run from Python
```python
import copyacross
# Run sync with config file
copyacross.sync("config.yaml")
```
### 3. Run from Command Line
```bash
python -m copyacross.cli --config config.yaml
```
---
## Logging
* By default, logs are printed to stdout.
* Optional `log_file` parameter can write logs to a file.
* Example:
```python
copyacross.sync("config.yaml", log_file="sync.log")
```
---
## Example Usage
```python
import copyacross
# One-way sync
copyacross.sync("config.yaml")
# Future dry-run (simulation without copying files)
# copyacross.sync("config.yaml", dry_run=True)
```
---
## Developer Guide
### Structure
```
copyacross/
├── copyacross/ # Main package
│ ├── cli.py # CLI entry point
│ ├── config.py # YAML config loader
│ ├── logger.py # Logging setup
│ ├── sync_engine.py # Core sync logic
│ ├── transport.py # Handles file transfers
│ ├── verifier.py # File verification
│ ├── exceptions.py # Custom exceptions
├── example/ # Example scripts
├── tests/ # Unit tests needed to be done
├── config.yaml # Sample configuration
├── LICENSE
├── README.md
├── setup.cfg
├── pyproject.toml
```
---
## License
This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details.
---
## Contact
Created by [osc@compilersutra.com](mailto:osc@compilersutra.com).
For questions or feature requests, please open an issue on GitHub.
```
Raw data
{
"_id": null,
"home_page": "https://github.com/compilersutra/copyacross",
"name": "copyacross",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": null,
"keywords": "scp, file-transfer, sync, ssh, verification, devops",
"author": "Tiwari Abhinav Ashok Kumar",
"author_email": "Compilersutra <osc@compilersutra.com>",
"download_url": "https://files.pythonhosted.org/packages/89/a9/6fd2b041c7392567e7efc35542fe8436b2c75945fb32bbbf889aeb0d66e5/copyacross-0.1.0.tar.gz",
"platform": null,
"description": "# CopyAcross\n\n[](https://opensource.org/licenses/MIT)\n\n**CopyAcross** is a cross-platform, bi-directional file synchronization tool built in Python. It supports local-to-local, local-to-remote, remote-to-local, and remote-to-remote file and folder sync. \n\n---\n\n## Features\n\n- One-way or bi-directional sync between sources and destinations.\n- Supports local folders and remote hosts over SSH/SFTP.\n- SHA-256 verification to ensure files are copied correctly.\n- Parallel transfers for faster synchronization.\n- Easy YAML-based configuration.\n- Logs progress and errors with optional log files.\n- Dry-run mode (planned for future release) to simulate sync without copying files.\n\n---\n\n## Limitations (Current Version)\n\n- **Dry-run not yet implemented:** Currently, all sync operations will copy files; dry-run will be supported in a future release. \n- **Remote verification skipped:** Verification is only done for local sources. \n- **No conflict resolution:** For bi-directional sync, conflicts (e.g., modified files on both ends) are not automatically resolved. \n- **Large folders:** Performance for extremely large directories (>100k files) may require tuning `parallel` and system resources. \n- **Platform-dependent path issues:** Some path inconsistencies may appear when syncing between Windows and Linux/Unix.\n\n---\n\n## Future Improvements\n\n- Full **dry-run** support for previewing sync actions.\n- Conflict resolution strategies (latest file wins, merge strategies). \n- Incremental sync (only changed files) for large datasets. \n- Windows UNC and SMB share support. \n- Progress bars for file and folder transfers. \n- Advanced logging and optional email notifications on sync completion/failure.\n\n---\n\n## Project Aim\n\nThe goal of **CopyAcross** is to provide a **simple, reliable, and cross-platform file synchronization tool** that:\n\n- Can handle both local and remote directories.\n- Supports multi-threaded transfer for faster operations.\n- Provides verification to ensure file integrity.\n- Serves both **newbies** (easy config and usage) and **experienced users** (customizable, scriptable, and extendable).\n\n---\n\n## Installation\n\n```bash\n# Using pip (PyPI release coming soon)\npip install copyacross\n````\n\nOr install from source:\n\n```bash\ngit clone https://github.com/compilersutra/copyacross.git\ncd copyacross\npip install .\n```\n\n---\n\n> For more example see example folder\n\n\n## Quick Start\n\n### 1. Create a config file (`config.yaml`):\n\n```yaml\nsync_direction: one-way\nlog_config: true\nparallel: 4\nssh_key: null\n\nsources:\n - path: \"/home/user/source_folder/\"\n type: folder\n host: null\n\ndestinations:\n - path: \"/home/user/destination_folder/\"\n type: folder\n host: user@192.168.0.100\n```\n\n### 2. Run from Python\n\n```python\nimport copyacross\n\n# Run sync with config file\ncopyacross.sync(\"config.yaml\")\n```\n\n### 3. Run from Command Line\n\n```bash\npython -m copyacross.cli --config config.yaml\n```\n\n---\n\n## Logging\n\n* By default, logs are printed to stdout.\n* Optional `log_file` parameter can write logs to a file.\n* Example:\n\n```python\ncopyacross.sync(\"config.yaml\", log_file=\"sync.log\")\n```\n\n---\n\n## Example Usage\n\n```python\nimport copyacross\n\n# One-way sync\ncopyacross.sync(\"config.yaml\")\n\n# Future dry-run (simulation without copying files)\n# copyacross.sync(\"config.yaml\", dry_run=True)\n```\n\n---\n\n## Developer Guide\n\n### Structure\n\n```\ncopyacross/\n\u251c\u2500\u2500 copyacross/ # Main package\n\u2502 \u251c\u2500\u2500 cli.py # CLI entry point\n\u2502 \u251c\u2500\u2500 config.py # YAML config loader\n\u2502 \u251c\u2500\u2500 logger.py # Logging setup\n\u2502 \u251c\u2500\u2500 sync_engine.py # Core sync logic\n\u2502 \u251c\u2500\u2500 transport.py # Handles file transfers\n\u2502 \u251c\u2500\u2500 verifier.py # File verification\n\u2502 \u251c\u2500\u2500 exceptions.py # Custom exceptions\n\u251c\u2500\u2500 example/ # Example scripts\n\u251c\u2500\u2500 tests/ # Unit tests needed to be done\n\u251c\u2500\u2500 config.yaml # Sample configuration\n\u251c\u2500\u2500 LICENSE\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 setup.cfg\n\u251c\u2500\u2500 pyproject.toml\n```\n\n---\n\n## License\n\nThis project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details.\n\n---\n\n## Contact\n\nCreated by [osc@compilersutra.com](mailto:osc@compilersutra.com).\nFor questions or feature requests, please open an issue on GitHub.\n\n```\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Cross-platform file copy & verification tool",
"version": "0.1.0",
"project_urls": {
"Homepage": "https://github.com/compilersutra/copyacross",
"Issues": "https://github.com/compilersutra/copyacross/issues",
"Source": "https://github.com/compilersutra/copyacross"
},
"split_keywords": [
"scp",
" file-transfer",
" sync",
" ssh",
" verification",
" devops"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "46a0c93d0ed1e9a801c372d6324f3dbad51c55ebab4962027e7c1d73ce9ad640",
"md5": "b1b437e640ecd83f5111ada358dfe35c",
"sha256": "583d47762a182691028bd058479263a23a34b0fadfddcccbcce475d2ec59d915"
},
"downloads": -1,
"filename": "copyacross-0.1.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "b1b437e640ecd83f5111ada358dfe35c",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 12928,
"upload_time": "2025-08-27T16:47:58",
"upload_time_iso_8601": "2025-08-27T16:47:58.277046Z",
"url": "https://files.pythonhosted.org/packages/46/a0/c93d0ed1e9a801c372d6324f3dbad51c55ebab4962027e7c1d73ce9ad640/copyacross-0.1.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "89a96fd2b041c7392567e7efc35542fe8436b2c75945fb32bbbf889aeb0d66e5",
"md5": "74e82fc79020f9ee5d29e4146179edb3",
"sha256": "9b015c0ee7b93da7ddc86879cd2c3017910b861ae238f2cad12019216ac84c98"
},
"downloads": -1,
"filename": "copyacross-0.1.0.tar.gz",
"has_sig": false,
"md5_digest": "74e82fc79020f9ee5d29e4146179edb3",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 11378,
"upload_time": "2025-08-27T16:48:00",
"upload_time_iso_8601": "2025-08-27T16:48:00.054351Z",
"url": "https://files.pythonhosted.org/packages/89/a9/6fd2b041c7392567e7efc35542fe8436b2c75945fb32bbbf889aeb0d66e5/copyacross-0.1.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-08-27 16:48:00",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "compilersutra",
"github_project": "copyacross",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"lcname": "copyacross"
}