Cross-platform duplicate file finder and cleaner
Project description
dupegun 🔫
A fast, cross-platform command-line tool to find and eliminate duplicate files.
What is dupegun?
dupegun scans your folders, detects duplicate files using a fast 3-pass hashing engine, and lets you delete, move, or hard-link them — all from your terminal. It works on every file type and every major operating system.
No GUI. No bloat. Just fast, safe, and simple.
Install
# Core install
pip install dupegun
# With TUI browser
pip install "dupegun[tui]"
# With watch mode
pip install "dupegun[watch]"
# Everything
pip install "dupegun[all]"
Requires Python 3.9 or higher.
Quick Start
# Scan a folder and see all duplicates
dupegun scan ~/Downloads
# Interactive TUI browser
dupegun tui ~/Downloads
# Monitor a folder for new duplicates
dupegun watch ~/Downloads
# Preview what would be deleted (nothing actually deleted)
dupegun delete ~/Downloads --strategy newest
# Actually delete duplicates
dupegun delete ~/Downloads --strategy newest --no-dry-run
# Run a system and configuration check
dupegun doctor
Commands
scan — find duplicates
dupegun scan <path> [options]
# Scan a single folder
dupegun scan ~/Downloads
# Scan multiple folders at once
dupegun scan ~/Downloads ~/Documents ~/Desktop
# Skip files smaller than 1 MB
dupegun scan ~/Downloads --min-size 1MB
# Scan specific size ranges (e.g., between 1MB and 100MB)
dupegun scan ~/Downloads --min-size 1MB --max-size 100MB
# Regex filename filter (e.g., files starting with "Copy of")
dupegun scan ~/Downloads --pattern "Copy of.*"
# Limit how deep the scan goes (e.g., 2 levels deep)
dupegun scan ~/Downloads --depth 2
# Speed up scans on SSDs using parallel hashing threads
dupegun scan ~/Downloads --workers 4
# Only scan image files
dupegun scan ~/Downloads --type .jpg --type .png --type .gif
# Skip specific folders
dupegun scan C:\ --exclude Windows --exclude "Program Files"
# Sort results by wasted space, size, count, or path
dupegun scan ~/Downloads --sort wasted
# Clean output for scripts (disable colors)
dupegun scan ~/Downloads --no-color
# Export results
dupegun scan ~/Downloads --json results.json
dupegun scan ~/Downloads --csv results.csv
dupegun scan ~/Downloads --html report.html
tui — interactive terminal browser
Browse duplicates visually, mark files for deletion, and act — all from your keyboard.
# Requires: pip install "dupegun[tui]"
dupegun tui ~/Downloads
dupegun tui ~/Downloads --strategy newest
dupegun tui ~/Downloads --no-dry-run # actually delete (default is dry-run)
Controls:
| Key | Action |
|---|---|
| Arrow keys / j k | Navigate files |
| Space | Toggle file for deletion |
| A | Mark all duplicates in group (keep first) |
| U | Unmark all in group |
| D | Delete all marked files in current group |
| S | Skip to next group |
| Q / Escape | Quit |
watch — monitor for new duplicates
Watch a folder in real time and get an alert whenever a duplicate file appears.
# Requires: pip install "dupegun[watch]"
dupegun watch ~/Downloads
Press Ctrl+C to stop watching.
delete — remove duplicates
dupegun delete <path> [options]
# Preview (dry-run is ON by default — nothing deleted)
dupegun delete ~/Downloads --strategy newest
# Actually delete
dupegun delete ~/Downloads --strategy newest --no-dry-run
# Auto-delete by age (only delete copies older than 30 days)
dupegun delete ~/Downloads --older-than 30 --no-dry-run
# Save a log of everything deleted
dupegun delete ~/Downloads --no-dry-run --log deleted.log
symlink & hardlink — save space
Replace duplicates with links pointing to a single kept file. Symlinks work across different drives, whereas hardlinks must be on the same drive.
dupegun symlink ~/Photos --strategy newest --no-dry-run
dupegun hardlink ~/Videos --no-dry-run
move — quarantine duplicates
dupegun move ~/Downloads --dest ~/quarantine --no-dry-run
Utilities: compare, stats, open, doctor, config, completion
compare: Find files that exist in both folders by content. Great for backups.
dupegun compare ~/Downloads ~/Backup
stats: Get a quick overview of total files, duplicate groups, and wasted space.
dupegun stats ~/Downloads
open: Open a file directly using your OS default application.
dupegun open ~/Downloads/duplicate_file.txt
doctor: Check system health, verify dependencies, and validate your config.
dupegun doctor
completion: Setup shell tab-completion for Bash, Zsh, or Fish.
dupegun completion
config: Create and manage your~/.dupegun.tomldefaults.
dupegun config --init
Plugin system
Extend dupegun with custom strategies without touching the core code.
Create a plugin file:
# my_plugin.py
from dupegun.plugins import register_strategy
@register_strategy("by_name")
def keep_alphabetically(paths):
"""Keep the file whose name comes first alphabetically."""
return min(paths, key=lambda p: p.name.lower())
Use it:
dupegun delete ~/Downloads --plugin my_plugin.py --strategy by_name --no-dry-run
Options
| Option | Commands | Description | Default |
|---|---|---|---|
--strategy <name> |
delete, move, symlink, hardlink, tui | Which copy to keep: shortest, newest, oldest, or plugin | shortest |
--dry-run |
delete, move, symlink, hardlink, tui | Preview without making any changes | ON |
--no-dry-run |
delete, move, symlink, hardlink, tui | Actually perform the action | — |
--older-than <days> |
delete | Only delete copies modified more than this many days ago | — |
--log <file> |
delete | Append a TSV log of every deleted file | — |
--plugin <file> |
delete, tui | Load a plugin .py file (repeatable) | — |
--config <file> |
all | Path to a config TOML file | ~/.dupegun.toml |
--min-size <size> |
all | Skip files smaller than this (e.g. 1MB) | 1 byte |
--max-size <size> |
all | Skip files larger than this (e.g. 100MB) | no limit |
--pattern <regex> |
all | Only scan filenames matching this regex | none |
--depth <n> |
all | Maximum directory depth to scan | unlimited |
--workers <n> |
all | Number of parallel hashing threads | 1 |
--type <ext> |
all | Only include files with this extension (repeatable) | all types |
--exclude <name> |
all | Skip any folder with this name (repeatable) | none |
--sort <key> |
scan | Sort output by size, count, path, or wasted | — |
--summary |
scan | Print total wasted space only, no file list | OFF |
--count |
scan | Print group count and wasted space, then exit | OFF |
--no-color |
all | Disable colored terminal output | OFF |
--json <file> |
scan | Export scan results to JSON | — |
--csv <file> |
scan | Export scan results to CSV | — |
--html <file> |
scan | Export a self-contained HTML report | — |
How it works
dupegun uses a 3-pass engine to detect duplicates accurately and efficiently:
Pass 1 — Group files by exact byte size
(files with unique sizes are skipped immediately)
Pass 2 — Hash the first 4 KB of each size-match
(quick pre-filter before full hashing)
Pass 3 — Full SHA-256 hash of remaining candidates
(guaranteed accurate duplicate detection)
Supported file types
dupegun works on all file types — it compares raw file contents, not names or extensions.
| Category | Examples |
|---|---|
| Documents | .pdf .docx .xlsx .txt |
| Images | .jpg .png .gif .webp |
| Videos | .mp4 .mkv .avi .mov |
| Audio | .mp3 .wav .flac .aac |
| Archives | .zip .rar .7z .tar .gz |
| Code | .py .js .html .css .java |
Platform support
| Platform | Supported |
|---|---|
| Windows | Yes |
| Linux | Yes |
| macOS | Yes |
Changelog
v2.3.0
opencommand: Quickly open a file directly using your OS default application.--no-colorflag: Disable colored terminal output for CI pipelines and logging.- Shell Completion: Use
dupegun completionfor Bash, Zsh, and Fish setup instructions. doctorcommand: Instantly check system health, dependencies, and validate config files.
v2.2.0
symlinkcommand: Replace duplicates with symbolic links.- Parallel Hashing: Added
--workers <n>to utilize concurrent threads for a massive speed boost on SSDs. - Recursion Limits: Added
--depth <n>flag to limit how deep a scan navigates. - Sorting: Added
--sortflag toscanfor ordering by size, count, path, or wasted space.
v2.1.0
- Stability improvements and quick win optimizations for the core scanner.
v2.0.0
tuicommand: Interactive terminal UI — browse duplicate groups, mark files, delete with keyboard shortcuts.watchcommand: Monitor a folder in real time and alert when a duplicate appears.configcommand: Create and manage~/.dupegun.tomlto save your preferred defaults.- Plugin system: Register custom keep-strategies with
@register_strategy("name").
v1.3.0
statscommand: Show total files, size, duplicate groups, and wasted space percentage.--htmlflag: Generate a self-contained HTML report.--logflag: Append a TSV audit log of every deleted file.
v1.2.0
comparecommand: Compare two directories to find cross-duplicates.--older-thanflag: Auto-delete files based on age.- Size parsing supports human-readable formats (e.g.,
1MB,2GB).
v1.1.0
--typefilter: Scan only specific file extensions.--excludefilter: Skip folders by name.
v1.0.0
- Initial release:
scan,delete,move,hardlinkcommands.
Contributing
Pull requests are welcome! To get started:
git clone [https://github.com/Prasanna-Balakrishnan/dupegun.git](https://github.com/Prasanna-Balakrishnan/dupegun.git)
cd dupegun
pip install -e ".[all]"
pip install pytest
python -m pytest tests/ -v
License
MIT — see LICENSE for details.
Author
Made by Prasanna B
GitHub: https://github.com/Prasanna-Balakrishnan/dupegun
If this tool helped you, consider giving it a star on GitHub!
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file dupegun-2.3.1.tar.gz.
File metadata
- Download URL: dupegun-2.3.1.tar.gz
- Upload date:
- Size: 42.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
920358752ae6baa2a87e3dc10cf0bf1673eb30a5d2e2d2efdffa94677aa61758
|
|
| MD5 |
06bfa3f1cf8790ecaa73dba2efdad856
|
|
| BLAKE2b-256 |
a091c5be8216f10c12bad79718b46956a33b8d00def90d109e2ab0806d830fdc
|
File details
Details for the file dupegun-2.3.1-py3-none-any.whl.
File metadata
- Download URL: dupegun-2.3.1-py3-none-any.whl
- Upload date:
- Size: 32.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
851f947c87e75743bd656db3d2834e7478d9b8eb5db2392ecfeeaa4bea8143b9
|
|
| MD5 |
3b662401c44fb5e1901dc360b338f960
|
|
| BLAKE2b-256 |
0616e8732072d483ace1c7ef8dd5ef37af2bba6ca3e3a3d2d5ccdbe735332e8e
|