Skip to content

rbackup: a Rust-based backup tool that copies only new or modified files from a source to a destination directory. Supports multithreading, language localization, logging, and progress display.

License

Notifications You must be signed in to change notification settings

ilovemikael/rBackup

Β 
Β 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

rBackup Logo rBackup

rBackup is a fast, cross-platform, and multithreaded command-line utility written in Rust for performing incremental backups of directories. It is inspired by tools like rsync and robocopy, but designed with simplicity, portability, and localization in mind.

Build Status Latest Release License: MIT Platform

πŸ“‹ View recent changes (Changelog)


✨ Features

  • πŸš€ Incremental backup – copies only new or modified files
  • ⚑ Multithreaded – uses all CPU cores to speed up large backups
  • 🌍 Multilingual support – English and Italian (with auto-detection)
  • πŸ“¦ Portable – no installation required, single binary
  • 🧾 Optional logging – write backup reports to a file
  • πŸ“Š Progress bar – display graphical progress bar during copy process
  • 🀫 Quiet mode – suppress all output for silent operation

πŸ“¦ Installation

Packaging status

🐧 AUR (Arch Linux)

AUR

yay -S rfortune
# or
paru -S rfortune

🍺 Homebrew (macOS/Linux)

Homebrew

brew tap umpire274/tap
brew install rbackup

πŸ¦€ Crates.io (Rust)

Crates.io

cargo install rbackup

πŸš€ Usage

rbackup <source> <destination> [OPTIONS]

Note: If rbackup is executed without any subcommand or positional arguments, the program will print the full help message and exit successfully with status code 0. This behavior is intended so invoking the binary with no arguments acts as a safe help display rather than an error.


βœ… Basic example

rbackup ~/Documents /mnt/backup_drive/Documents

🧩 Options

Global options (applicable to all commands)

Option Description
-q, --quiet Suppress console output
-t, --timestamp Prepend timestamp to messages
--log <FILE> Write output to a log file
-l, --lang <code> Force language (e.g. en, it)
-V, --version Show version
-h, --help Show help message

πŸ“Œ Commands

Below are the top-level commands with the most relevant options and quick usage notes for each. This layout is easier to scan than a dense table when commands have many options.

copy

Description: Perform an incremental backup from a source directory to a destination directory. Only new or modified files are copied.

Usage:

rbackup copy <source> <destination> [OPTIONS]

Important options:

  • <source> <destination> β€” required positional arguments
  • -q, --quiet β€” suppress console output
  • -t, --timestamp β€” prepend timestamps to messages
  • --log <FILE> β€” write output to a log file
  • -x, --exclude <PATTERN> β€” exclude files matching the given glob pattern (repeatable)
  • --absolute-exclude β€” match exclude patterns against absolute source paths
  • --ignore-case β€” perform case-insensitive matching for exclude patterns
  • --dry-run β€” perform a dry-run without copying files

Example:

rbackup copy C:\source\folder D:\backup\folder --exclude "*.tmp" --dry-run --log dryrun.log

config

Description: Manage the configuration file (view, initialize or edit).

Usage:

rbackup config [OPTIONS]

Important options:

  • --init β€” initialize a default configuration file
  • --print β€” print the current configuration to stdout
  • --edit β€” open the configuration in the user's editor
  • --editor <EDITOR> β€” specify the editor to use (overrides $EDITOR/$VISUAL)

Example:

rbackup config --init

help

Usage:

rbackup help [COMMAND]

Description: Print help for a specific command (e.g. rbackup help copy).


πŸ”Ž Exclude patterns (--exclude)

rbackup copy supports flexible exclude patterns to skip files and directories during a backup. The --exclude <PATTERN> option can be used multiple times to provide multiple glob patterns.

Where patterns are matched

  • By default, patterns are matched against the path relative to the source directory. Example: with source /home/me/project, pattern build/** matches /home/me/project/build/foo.
  • Use --absolute-exclude to match the pattern against the absolute path of the source file instead.
  • The matcher also tests the file basename (the filename only). This means a simple pattern like $RECYCLE.BIN or Thumbs.db will match files whose name equals that string anywhere in the source tree.

Case sensitivity

  • By default, matching is case-sensitive.
  • Use --ignore-case to enable case-insensitive matching for exclude patterns.

Examples

  • Exclude macOS DMG files and Thumbs.db files (case-insensitive):
rbackup copy /source /dest --log backup.log --exclude '*.dmg' --exclude 'Thumbs.db' --ignore-case
  • Exclude the Windows Recycle Bin directory by basename and hidden files starting with a dot:
rbackup copy /source /dest --exclude '$RECYCLE.BIN' --exclude '.*'

Tip: In zsh/bash wrap patterns that contain $ or other special characters in single quotes: '$RECYCLE.BIN'.

Absolute vs relative matching

  • Relative match (default): --exclude 'temp/**' will skip anything under source/temp/.
  • Absolute match: --absolute-exclude with --exclude '/home/me/project/temp/**' will match only that absolute path.

Dry-run and logging

  • Combine --dry-run with --log to generate a report of what would be copied or skipped β€” but without changing the destination:
rbackup copy /source /dest --exclude '*.tmp' --dry-run --log dryrun.log
  • The log file contains both Copied and Skipped entries. Skipped entries include the exclude pattern that caused the skip when applicable, which helps debugging complex exclude sets. Skipped files are also printed to the console unless the --quiet option is used.

Use-cases

  • Backup only source code files, ignoring build artifacts:
rbackup copy /home/dev/project /backup/project --exclude 'target/**' --exclude '*.o' --exclude '*.class'
  • Mirror a user's Documents folder but exclude large media files and the Recycle Bin:
rbackup copy ~/Documents /mnt/backup/Documents --exclude '*.mp4' --exclude '$RECYCLE.BIN' --exclude 'Thumbs.db' --ignore-case
  • Debug why a file is skipped: run a dry-run with logging and inspect the log β€” each skipped line shows the pattern that caused the skip.

Use cases (CLI & developer)

This section provides concise, copy-pastable examples for common CLI workflows and for managing translations during development.

1) Incremental backup (copy)

  • Basic backup:
rbackup C:\Users\alice\Documents D:\Backups\alice\Documents
  • Backup with logging, timestamps and quiet off:
rbackup C:\source\folder D:\backup\folder --log backup.log --timestamp
  • Dry-run to debug excludes and generate a report (Windows cmd.exe):
rbackup C:\source D:\dest --exclude "*.tmp" --dry-run --log dryrun.log

2) Manage configuration

  • Initialize a default configuration file:
rbackup config --init
  • Edit configuration using the default editor (Windows will use Notepad if $EDITOR not set):
rbackup config --edit

3) Developer: translations workflow (translations_tool)

A small helper script is provided at scripts/translations_tool to validate translations and to generate/apply language templates.

  • Validate all language entries have the same keys (must be run from the repo root):
cd scripts\translations_tool
cargo run -- validate
  • Generate a template for a new language es and print it (prefill with English values):
cd scripts\translations_tool
cargo run -- template es --fill-en
  • Apply (insert) a template for es into assets/translations.json, creating a timestamped backup, and do not overwrite if es already exists:
cd scripts\translations_tool
cargo run -- apply es --fill-en
  • Force overwrite an existing language entry (use with caution):
cd scripts\translations_tool
cargo run -- apply es --fill-en --force

Notes:

  • The apply command creates a backup file under assets/ named like translations.json.YYYYMMDD_HHMMSS.bak before modifying assets/translations.json.
  • After applying a template, translate the values in-place with your editor, then run cargo run -- validate to ensure key consistency.

πŸ“ Example

rbackup /home/alex/Projects /mnt/usb-backup --log backup.log --timestamp

πŸ§ͺ Build from source

To compile rbackup yourself:

git clone https://github.com/your-username/rbackup.git
cd rbackup
cargo build --release

For Windows, rbackup.rc will be embedded automatically in the executable.


🧭 Maintainers: Manual Release Trigger

If you need to manually build and publish a new release (or rebuild an existing one),
you can trigger the β€œBuild, Package and Release” workflow directly from GitHub Actions.

πŸ”Ή Standard release (safe)

  1. Go to Actions β†’ Build, Package and Release
  2. Click Run workflow
  3. Leave force_replace = false
  4. Confirm β†’ the workflow will only create the release if it does not already exist.

πŸ”Ή Force rebuild of an existing release

  1. Open the same workflow in Actions
  2. Click Run workflow
  3. Set force_replace = true
  4. Confirm β†’ the workflow will delete the existing GitHub release and tag, then recreate them with the latest artifacts.

πŸ’‘ For command-line users: you can also trigger this manually via GitHub CLI:

gh workflow run "Build, Package and Release" -f force_replace=true

This ensures you can safely regenerate signed release packages when needed,
without affecting your normal automated release process.


πŸ”’ License

This project is licensed under the MIT License.

Β© 2025 Alessandro Maestri


πŸ’‘ Contributing

Pull requests are welcome! If you’d like to add support for more languages, improve performance, or fix bugs, feel free to fork the repo and contribute.

About

rbackup: a Rust-based backup tool that copies only new or modified files from a source to a destination directory. Supports multithreading, language localization, logging, and progress display.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Rust 100.0%