| Crates.io | bcmr |
| lib.rs | bcmr |
| version | 0.3.25 |
| created_at | 2025-01-07 21:20:46.789521+00 |
| updated_at | 2026-01-14 06:32:06.263813+00 |
| description | Better Copy Move Remove (BCMR) - A modern CLI tool for file operations with progress bar and advanced features |
| homepage | |
| repository | https://github.com/Bengerthelorf/bcmr |
| max_upload_size | |
| id | 1507709 |
| size | 1,818,413 |
Making file operations simpler and more modern! BCMR is a command-line tool written in Rust that lets you elegantly copy, move, and remove files.

brew tap Bengerthelorf/tap
brew install bcmr
curl -fsSL https://bcmr.snaix.homes/ | bash
cargo install bcmr
git clone https://github.com/Bengerthelorf/bcmr
cd bcmr
cargo build --release
The compiled binary will be available at target/release/bcmr.
BCMR provides flexible shell integration similar to zoxide. You can customize command names with prefixes or replace native commands.
Basic syntax:
bcmr init [shell] [options]
Available options:
--cmd <prefix>: Set command prefix (e.g., 'b' creates bcp, bmv, brm)--prefix <prefix>: Explicitly set command prefix (overrides --cmd)--suffix <suffix>: Set command suffix--no-cmd: Don't create command aliases--path <path>: Add directory to PATHExamples:
# Add to your ~/.bashrc or ~/.zshrc:
# Use custom prefix (creates testcp, testmv, testrm)
eval "$(bcmr init zsh --cmd test)"
# Replace native commands (creates cp, mv, rm)
eval "$(bcmr init zsh --cmd '')"
# Use 'b' prefix (creates bcp, bmv, brm)
eval "$(bcmr init bash --cmd b)"
# Use prefix and suffix (creates pcp+, pmv+, prm+)
eval "$(bcmr init zsh --cmd --prefix p --suffix +)"
Supported shells:
Basic syntax:
bcmr copy [OPTIONS] <SOURCES>... <DESTINATION>
Arguments:
<SOURCES>... Source files/directories
<DESTINATION> Target directory
Options:
-r, --recursive: Recursively copy directories-p, --preserve: Preserve file attributes-f, --force: Overwrite existing files-y, --yes: Skip overwrite confirmation-e, --exclude <PATTERN>: Exclude files/directories matching regex-t, --tui: Use plain text mode-V, --verify: Verify file integrity after copy-C, --resume: Resume interrupted copy (Size + Mtime check)-s, --strict: Use strict hash verification for resume-a, --append: Append to existing file (ignores mtime/hash)-n, --dry-run: Dry run (no changes)--reflink <MODE>: Control copy-on-write behavior (auto/force/disable)--sparse <MODE>: Control sparse file handling (auto/force/disable)-h, --help: Print help informationExamples:
# Copy a single file
bcmr copy document.txt backup/
# Copy multiple files (Shell Globbing supported!)
bcmr copy *.txt *.md backup/
# Recursively copy a directory
bcmr copy -r projects/ backup/
# Dry run (Preview what will be copied)
bcmr copy -r -n projects/ backup/
# Copy with attribute preservation
bcmr copy --preserve important.conf /etc/
# Force overwrite without prompting
bcmr copy -f -y source.txt destination.txt
# Copy with Regex exclusions (exclude .git folder and .tmp files)
bcmr copy -r --exclude="\.git","\.tmp$" src/ dest/
# Copy with verification
bcmr copy --verify critical_data.db /backup/
Basic syntax:
bcmr move [options] <source>... <destination>
Available options:
-r, --recursive: Recursively move directories-p, --preserve: Preserve file attributes-f, --force: Force overwrite existing files-y, --yes: Skip overwrite confirmation-n, --dry-run: Preview operation without making changes-e, --exclude=<pattern>: Exclude matching files (Regex)-t, --tui: Use plain text mode-V, --verify: Verify file integrity after move-C, --resume: Resume interrupted move (cross-device fallback only)-s, --strict: Use strict hash verification for resume-a, --append: Append to existing file (ignores mtime/hash)Examples:
# Move a single file
bcmr move old_file.txt new_location/
# Move multiple files
bcmr move file1.txt file2.txt new_location/
# Recursively move a directory
bcmr move -r old_project/ new_location/
# Dry run
bcmr move -n old_project/ new_location/
# Move with exclusions (Regex)
bcmr move -r --exclude="^node_modules","\.log$" project/ new_place/
Basic syntax:
bcmr remove [options] <path>...
Available options:
-r, --recursive: Recursively remove directories-f, --force: Force removal without confirmation-i, --interactive: Prompt before each removal-v, --verbose: Show detailed removal process-d, --dir: Remove empty directories-n, --dry-run: Preview operation without making changes-e, --exclude=<pattern>: Exclude matching files (Regex)-t, --tui: Use plain text modeExamples:
# Remove a single file
bcmr remove unnecessary.txt
# Remove multiple files (Globbing)
bcmr remove *.log
# Recursively remove a directory
bcmr remove -r old_project/
# Dry run (safe check)
bcmr remove -r -n potentially_important_folder/
# Interactive removal of multiple files
bcmr remove -i file1.txt file2.txt file3.txt
# Remove with exclusions (Regex)
bcmr remove -r --exclude="\.important$","\.backup$" trash/
BCMR provides two progress display modes:
fancy mode (Default) and plain text mode (enable with --tui or -t).
You can fully customize the progress bar by creating a configuration file at ~/.config/bcmr/config.toml:
[progress]
style = "fancy" # "fancy" (default), "plain" (same as --tui)
[progress.theme]
# Define progress bar gradient (Hex colors) - Default is a Morandi purple gradient
bar_gradient = ["#CABBE9", "#7E6EAC"]
bar_complete_char = "█"
bar_incomplete_char = "░"
text_color = "reset" # "reset" (default), "black", "red", "green", "yellow", "blue", "magenta", "cyan", "white", or Hex "#RRGGBB"
border_color = "#9E8BCA"
title_color = "#9E8BCA"
[progress.layout]
box_style = "rounded" # "rounded" (default), "double", "heavy", "single"
[copy]
reflink = "auto" # "auto" (default), "never"
sparse = "never" # "never" (default), "auto" (detect zero blocks >= 4KB)
GPL-3.0 © Zane Leong