{"id":25467702,"url":"https://github.com/m-manu/rsync-sidekick","last_synced_at":"2025-08-06T16:20:11.190Z","repository":{"id":49900690,"uuid":"358839772","full_name":"m-manu/rsync-sidekick","owner":"m-manu","description":"Propagate file renames, movements and timestamp changes before rsync runs","archived":false,"fork":false,"pushed_at":"2025-02-16T09:47:12.000Z","size":80,"stargazers_count":101,"open_issues_count":7,"forks_count":2,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-03-31T09:07:23.611Z","etag":null,"topics":["backups","command-line-tool","command-line-utility","go","golang","media"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/m-manu.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-04-17T09:41:25.000Z","updated_at":"2025-03-30T18:17:01.000Z","dependencies_parsed_at":"2024-06-19T02:53:16.035Z","dependency_job_id":"261230e4-97c8-4e1a-af3f-1d524670c41c","html_url":"https://github.com/m-manu/rsync-sidekick","commit_stats":null,"previous_names":[],"tags_count":11,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/m-manu%2Frsync-sidekick","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/m-manu%2Frsync-sidekick/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/m-manu%2Frsync-sidekick/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/m-manu%2Frsync-sidekick/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/m-manu","download_url":"https://codeload.github.com/m-manu/rsync-sidekick/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247640462,"owners_count":20971557,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["backups","command-line-tool","command-line-utility","go","golang","media"],"created_at":"2025-02-18T07:22:12.619Z","updated_at":"2025-04-07T11:05:25.549Z","avatar_url":"https://github.com/m-manu.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# rsync-sidekick\n\n[![build-and-test](https://github.com/m-manu/rsync-sidekick/actions/workflows/build-and-test.yml/badge.svg)](https://github.com/m-manu/rsync-sidekick/actions/workflows/build-and-test.yml)\n[![Go Report Card](https://goreportcard.com/badge/github.com/m-manu/rsync-sidekick)](https://goreportcard.com/report/github.com/m-manu/rsync-sidekick)\n[![Go Reference](https://pkg.go.dev/badge/github.com/m-manu/rsync-sidekick.svg)](https://pkg.go.dev/github.com/m-manu/rsync-sidekick)\n[![License](https://img.shields.io/badge/License-Apache%202-blue.svg)](./LICENSE)\n\n## Introduction\n\n`rsync` is a fantastic tool. Yet, by itself, it's a pain to use for repeated backing up of media files (videos, music,\nphotos, etc.) _that are reorganized frequently_.\n\n`rsync-sidekick` is a safe and simple tool that is designed to run **before** `rsync` is run.\n\n## What does this do?\n\n`rsync-sidekick` propagates following changes (or any combination) from _source directory_ to _destination directory_:\n\n1. Change in file modification timestamp\n2. Rename of file/directory\n3. Moving a file from one directory to another\n\nNote:\n\n* This tool **does not delete** any files or folders (under any circumstances) -- that's why safe-to-use 😌\n    * Your files are just _moved around_\n    * Now, if you're uncomfortable with this tool even moving your files around, there is a `--shellscript` option, that\n      just generates a script for you to read and run (think of it like a `--dry-run` option)\n* This tool **does not** actually **transfer** files -- that's for `rsync` to do 🙂\n* Since you'd run `rsync` after this tool is run, any changes that this tool couldn't propagate would just be propagated\n  by `rsync`\n    * So the most that you might lose is some time with `rsync` doing more work than it could have -- Which is likely\n      still much less than not using this tool at all 😄\n\n## How to install?\n\n1. Install Go version at least **1.22**\n    * On Ubuntu: `snap install go`\n    * On Mac: `brew install go`\n    * For anything else: [Go downloads page](https://go.dev/dl/)\n2. Run command:\n   ```bash\n   go install github.com/m-manu/rsync-sidekick@latest\n   ```\n3. Add following line in your `.bashrc`/`.zshrc` file:\n   ```bash\n   export PATH=\"$PATH:$HOME/go/bin\"\n   ```\n\n## How to use?\n\n**Step 1**: Run this tool\n\n```bash\nrsync-sidekick /Users/manu/Photos/ /Volumes/Portable/Photos/\n```\n\n**Step 2**: Run `rsync` as you would normally do\n\n```bash\n# Note the trailing slashes below. Without them, rsync's behavior is different!\nrsync -av /Users/manu/Photos/ /Volumes/Portable/Photos/ \n```\n\n## Command line options\n\nRunning `rsync-sidekick --help` displays following information:\n\n```\nrsync-sidekick is a tool to propagate file renames, movements and timestamp changes from a source directory to a destination directory.\n\nUsage:\n\t rsync-sidekick \u003cflags\u003e [source-dir] [destination-dir]\n\nwhere,\n\t[source-dir]        Source directory\n\t[destination-dir]   Destination directory\n\nflags: (all optional)\n  -x, --exclusions string            path to file containing newline separated list of file/directory names to be excluded\n                                     (even if this is not set, files/directories such these will still be ignored: $RECYCLE.BIN, desktop.ini, Thumbs.db etc.)\n  -h, --help                         display help\n      --list                         list files along their metadata for given directory\n  -s, --shellscript                  instead of applying changes directly, generate a shell script\n                                     (this flag is useful if you want 'dry run' this tool or want to run the shell script as a different user)\n  -p, --shellscript-at-path string   similar to --shellscript option but you can specify output script path\n                                     (this flag cannot be specified if --shellscript option is specified)\n  -v, --verbose                      generates extra information, even a file dump (caution: makes it slow!)\n      --version                      show application version (v1.5.0) and exit\n\nMore details here: https://github.com/m-manu/rsync-sidekick\n```\n\n## Running this from a Docker container\n\nBelow is a simple example:\n\n```shell\n# Run rsync-sidekick:\ndocker run --rm -v /Users/manu:/mnt/homedir manumk/rsync-sidekick rsync-sidekick /mnt/homedir/Photos/ /mnt/homedir/Photos_backup/\n\n# Then run rsync: (note the trailing slashes -- without them, rsync's behavior is different)\ndocker run --rm -v /Users/manu:/mnt/homedir manumk/rsync-sidekick rsync /mnt/homedir/Photos/ /mnt/homedir/Photos_backup/\n```\n\n## FAQs\n\n### Why was this tool created?\n\n`rsync` options such as `--detect-renamed`, `--detect-renamed-lax`, `--detect-moved` and `--fuzzy` don't work reliably\nand sometimes are dangerous! `rsync-sidekick` is reliable alternative to all these options and much more.\n\n### How will I benefit from using this tool?\n\nUsing `rsync-sidekick` before `rsrync` makes your backup process significantly faster than using only `rsync`. Sometimes\nthis performance benefit can even be 100x😲, if the only changes at your _source directory_ are the 3 types mentioned\nearlier in this article.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fm-manu%2Frsync-sidekick","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fm-manu%2Frsync-sidekick","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fm-manu%2Frsync-sidekick/lists"}