Storage drives accumulate redundant duplicate files over time—including downloaded media copies, cloned virtual environments, project backups, and identical build assets. While traditional tools like fdupes or rmlint scan files sequentially, fclones is an ultra-fast, multi-threaded duplicate file finder written in Rust. It leverages asynchronous I/O, pipelined hashing, and cache-friendly data structures to scan millions of files across NVMe drives and network mounts in seconds.
Why Choose fclones Over Traditional Deduplicators?
Scanning massive storage pools for duplicate content often imposes high I/O latency and heavy CPU loads. fclones optimises this process through a distinct four-stage pipeline:
- Stage 1 (File tree walk): Gathers file sizes and directory metadata using parallel filesystem traversal.
- Stage 2 (Size grouping): Immediately discards files with unique file sizes without reading any disk content.
- Stage 3 (Prefix/suffix hashing): Computes fast partial hashes of only the file header and trailer blocks to filter out dissimilar files.
- Stage 4 (Full content hashing): Applies cryptographic hashing (such as MetroHash or BLAKE3) exclusively to files sharing identical sizes and boundary blocks.
This design prevents unnecessary disk reads on non-duplicate files, making fclones significantly faster than classic alternatives.
Installing fclones on Linux Distributions
Method 1: Installing via Cargo
If your system has a Rust toolchain configured, install fclones directly via Cargo:
cargo install fclones
Confirm the executable is reachable in your active shell:
fclones --version
Method 2: Pre-compiled GitHub Binaries
For Debian, Ubuntu, Fedora, or Rocky Linux servers without Rust, download the latest official release archive:
curl -sSL https://github.com/pkolaczk/fclones/releases/latest/download/fclones-linux-glibc-x86_64.tar.gz | tar -xz
sudo mv fclones /usr/local/bin/
sudo chmod +x /usr/local/bin/fclones
Method 3: Arch Linux (AUR)
Arch users can install the package directly through paru or yay:
yay -S fclones-bin
Core CLI Syntax and Scanning Modes
The operational workflow of fclones consists of two core phases: grouping (finding duplicates and writing an audit report) and processing (acting upon that report).
Step 1: Finding and Grouping Duplicate Files
To scan a directory tree and save the duplicate findings to a record file:
fclones group /path/to/media > duplicates.txt
The resulting duplicates.txt file contains structured metadata identifying matching file paths grouped by unique hash signatures.
| Flag / Parameter | Description | Recommended Scenario |
|---|---|---|
--min-size <size> |
Ignores files smaller than the threshold (e.g., --min-size 10MB). |
Targeting large ISOs, video files, and VM disks. |
--max-depth <n> |
Restricts recursive directory scanning depth. | Shallow directory audits. |
--threads <n> |
Explicitly sets parallel worker thread count. | Tuning performance on multi-core servers. |
--isolate |
Restricts duplicate grouping strictly across different target directories. | Comparing an archive against an active workspace. |
Deduplicating Files: Removal, Hardlinking, and Softlinking
Once you have generated your grouping report, pipe the output into the fclones action subcommands.
Method 1: Safe Hardlinking (Recommended)
Hardlinking replaces duplicate files with pointers to the same underlying filesystem inode. This reclaims 100% of the duplicate disk space without breaking file paths for applications reading the data:
fclones link < duplicates.txt
Note: Hardlinks require all duplicate files to reside on the same filesystem partition.
Method 2: Softlinking (Symbolic Links)
If duplicate files exist across separate disk partitions or network NFS/SMB shares where hardlinks are unsupported, replace redundant copies with symbolic links:
fclones link --soft < duplicates.txt
Method 3: Deleting Duplicate Copies
To permanently erase redundant copies and keep only the first instance in each group:
fclones remove < duplicates.txt
Warning: Always inspect the contents of duplicates.txt with a text editor or pager before running the remove command to avoid accidental data loss.
Advanced Filtering and Exclusion Rules
Prevent fclones from traversing version control directories, virtual environments, or temporary swap locations by applying glob patterns:
fclones group \
--exclude ".git/**" \
--exclude "node_modules/**" \
--exclude "*.tmp" \
--min-size 1MB \
/home/user/projects > project_dupes.txt
Troubleshooting Common fclones Issues
- “Cross-device link” error during hardlinking: Hardlinks cannot bridge distinct mount points or filesystem boundaries (e.g., between
/homeand/mnt/storage). Use--softto create symbolic links instead. - Permission denied on system folders: Run
fclones groupwithsudoif inspecting system-wide package caches or multi-user directories to ensure read permissions on all inodes. - Excessive memory usage on billions of files: When scanning petabyte-scale storage arrays, combine
--min-sizewith path chunking to prevent the in-memory grouping table from swelling.