oans v1.2.0
The first release carrying the fork's full feature set — 31 commits since 1.1.1. Everything is additive and backward-compatible; the CLI is a superset of duperemove's and hashfiles rebuild automatically.
✨ New features
--stats— inspect a hashfile: file/hash counts, duplication ratio, file-size summary, the top duplicate groups with an example path, and how much aVACUUMwould reclaim.- Run history & metrics — every run is recorded in the hashfile.
--historyshows space reclaimed over time and a lifetime total;--jsonexports current metrics for a dashboard. - Self-describing hashfile — each run stores its options, paths and excludes, so
oans --hashfile=FILE(no other arguments) replays the last run incrementally. Refuses rather than pruning if every stored path has vanished. --autotune— benchmarks your backing storage (NAS/HDD/RAID) and picks the fastest--io-threads, persisting the winner in the hashfile.- systemd timer templates —
make install-systemd, thensystemctl enable --now oans@<name>.timerfor weekly, idle-priority dedupe. Seesystemd/. - NAS quick-start guide — a complete walkthrough from first scan to scheduled, monitored dedupe: docs/nas-quickstart.md.
⚡ Performance
- Skip already-shared files up front instead of re-reading them — warm re-runs on a mostly-stable tree are dramatically faster (a deduped 2M-file / 230 GiB tree rescans in ~92 s vs ~11 min for upstream 0.15.2).
- No cross-generation reprocessing of duplicate groups — dedupe phase ~294 s → ~188 s (~36%), kernel dedupe traffic roughly halved.
- Batched SQLite transactions (~10 s cadence) — ~24% faster rescans, file-lock syscalls cut from hundreds of thousands to a few hundred.
- Parallel directory walk and a compact 64-bit path-hash index for large trees.
🎯 Reporting & correctness
- Honest reclaimed-space reporting — the summary now shows the disk space actually freed (one physical copy kept per group), not the fiemap "net change in shared extents" that double-counted pairs. The stable
net change in shared extentsline is still emitted for scripts (piped /-q). - Safe concurrent report modes —
--stats/--history/--jsonopen the hashfile read-only, so they're safe to run while a scan or dedupe is in progress. - Hardlink safety fix —
INSERT OR REPLACEcould cascade-delete other hardlinks' rows and silently empty the hashfile; guarded, with a regression test. - Permission hint when a hashfile can't be opened; several dedupe-progress display fixes.
🧹 Housekeeping
- Removed
--fdupesand legacy/testing options (--hash-threads,-D,--read/--write-hashes); project-wide dead-code cleanup. - Reworked README leading with the value proposition; build-dependency install commands for Fedora and Debian/Ubuntu.
📦 Install
make && sudo make install # oans + a duperemove compat symlink
sudo make install-systemd # optional: the oans@ timer/service templatesRequires Linux 3.13+ on btrfs or XFS. Build deps and full details in the README.