English | 简体中文
A native macOS app that finds and removes duplicate files on local disks and network volumes (NAS) — fast by default, with safety checks before cleanup.
- Turbo scan — Size buckets + multi-point xxHash; trusted for default keep/delete marks
- Precise compare — Optional per-group full-file check; becomes a green Compared badge when done
- Packages as wholes —
.app, disc packages, etc. stay opaque; compared as single items (structure + light content checks) - Purpose-risk safety — Locale / multi-product / package-shell roles are flagged and not pre-checked for delete (different filenames alone are fine)
- User-controlled cleanup — Checkbox selection per item; Clean Up uses your marks; Trash by default
- Network / NAS aware — Lower concurrency, path-ordered hashing, sequential-friendly network path
- Scan cache — Reuse hashes across runs; package fingerprints skip interior walks when mtime is unchanged
- Modern UI — Dense outline results, filters (All / Needs review / Packages), search, timing breakdown
- Language — English & Simplified Chinese, follows macOS Language & Region (no in-app language switch)
- Settings — Gear or ⌘, (standard Settings window)
- macOS 13 or later
- Apple Silicon recommended (
build.shtargetsarm64)
Download the latest FastDuplicateFinder.zip from the
Releases page:
- Unzip the file
- Drag
Fast Duplicate Finder.appinto/Applications - First launch: right-click the app → Open (ad-hoc signed, not notarized)
git clone https://github.com/kDolphin/Fast_Duplicate_Finder.git
cd Fast_Duplicate_Finder
bash build.sh
open "build/Fast Duplicate Finder.app"Install to Applications:
cp -R "build/Fast Duplicate Finder.app" /Applications/open finddup.xcodeproj
# Scheme: finddup · Product: Fast Duplicate Finder- Add one or more folders in the sidebar.
- Click Start Scan.
- Review groups: expand, mark items to delete (or leave purpose-risk groups unchecked).
- Optionally run Precise compare on a group you are unsure about.
- Clean Up → preview → Trash / permanent per Settings.
Settings: ⌘, or the gear icon.
- Default marks — Turbo multi-point matches are trusted; large-file / crowded-bucket “Needs review” heuristics removed so most groups are pre-checked after scan
- Purpose risk — Only locale, multi-product role, and package-shell cases block auto-check (not “different filenames” alone)
- Group titles — Related/same basenames show a representative name; unrelated names use the count label
- Precise compare UX — Per-group action (blue) → green Compared badge; spinner only on the active group; no layout-jumping top progress strip; purpose-risk groups can compare too
- Rescan persistence — After compare, the scan snapshot stores verified/precise groups so the next identical scan keeps Compared
- Scan cache — Split per volume so a home scan does not load NAS hashes; Settings shows real on-disk size
- Precise compare — Results are saved and reused on the next scan; full-file xxHash; can be stopped; UI stays responsive on tens of thousands of groups
- Search + Clean Up — Cleanup, Will free, and the preview only include marked files that match the current search (other marks stay until you clear the search)
- Updates — Optional daily check (and Check for Updates…) against GitHub Releases; never downloads or installs
- Will free — Shows marked copies in the current filter (same scope as Clean Up)
- Search — Typing stays responsive on large result lists
- Folders persist — Chosen scan locations restore on next launch (security-scoped bookmarks)
- First scan — Hash cache loads off the main thread; no more freeze at 5% “Scanning files…”
- Cleanup — Mixed local + NAS batches no longer permanently delete local files; groups update without a full rescan
- Compare cache — Precise SHA-256 verify no longer splits the same content on the next turbo scan
- Sidebar — Add / Clear / drop hit the full control; empty and cancelled scans have their own result screens
- Scan cache — Merge per scan root so NAS (
/Volumes/…) hashes are not wiped by a later home scan; progressive cache flush during long network hashes - NAS progress — Shows
hits · new · concso cache reuse is visible when only new files need hashing
- Results UI — Expand/collapse all is O(1) (no freeze on 10k–40k groups); purpose-risk badge keys precomputed
- Clean Up — Button count and delete batch respect the current filter (All / Needs review / Packages) and search
- Settings cache — Entry count updates immediately after scan or clear (no app relaunch required)
- NAS enumeration — Parallel first-level subtree listing (concurrency 6); reuse package metadata to avoid extra SMB RTTs
- Large-library prepare / finalize — Faster list fingerprints, in-memory hash cache, no incomplete snapshot on cancel; group assembly without filesystem path resolution; async cache write
- Purpose-risk cleanup UX — Toolbar Apply keep suggestions and per-group Mark others (still unchecked by default for safety)
- Scan timing — Breakdown bars sum to wall-clock total; clearer multi-minute duration format
- NAS performance — Three-point sample windows reduced to 12 KB; network hash concurrency fixed at 6
- Cancel / resume — Stopping a scan no longer publishes an incomplete result snapshot (which made the next run look “done” too early). Partial per-file hashes are still kept for faster resume
- Initial public release
| Topic | Detail |
|---|---|
| Sandbox | Only folders you grant access to can be scanned |
| Signing | Ad-hoc signature; not notarized by Apple |
| Heuristics | Purpose-risk rules are path/name heuristics; rare false positives/negatives possible |
| Architecture | build.sh is arm64-focused |
| Action | Detail |
|---|---|
| Read | Folders you select (App Sandbox + user-selected files) |
| Write | Only when you confirm cleanup |
| Network | Only mounted volumes you choose to scan |
| Cloud | Nothing uploaded — all work stays on your Mac |
finddup/ # App sources, assets, localizations
Models/ Services/ Views/
en.lproj/ zh-Hans.lproj/
build.sh # → build/Fast Duplicate Finder.app + zip
finddup.xcodeproj
LICENSE
- Swift / SwiftUI
- CryptoKit + custom xxHash
- No third-party dependencies
bash build.sh
# → build/Fast Duplicate Finder.app
# → build/FastDuplicateFinder.zip| Issue | Try |
|---|---|
| Permission denied | Re-select the folder when prompted |
| Slow on NAS | Keep the volume mounted; first full scan warms the cache |
| Language wrong | Change system / per-app language in System Settings → Language & Region, then relaunch |
| Build fails | Use full Xcode (not only CLT); run bash build.sh from the repo root |
MIT © contributors