Skip to content
HN On Hacker News ↗

GitHub - jdefrancesco/dskDitto: Ultra fast and easy duplicate file finder. Awesome TUI/GUI to manage results.

▲ 92 points 18 comments by ingve 5w ago HN discussion ↗

Pangram verdict · v3.3

We believe that this document is a mix of AI-generated, AI-assisted, and human-written content

59 %

AI likelihood · overall

Mixed
22% human-written 48% AI-generated
SEGMENTS · HUMAN 1 of 5
SEGMENTS · AI 3 of 5
WORD COUNT 1,314
PEAK AI % 95% · §1
Analyzed
Jul 26
backend: pangram/v3.3
Segments scanned
5 windows
avg 263 words each
Distribution
22 / 48%
human / AI fraction
Verdict
Mixed
Pangram v3.3

Article text · 1,314 words · 5 segments analyzed

Human AI-generated
§1 AI · 95%

dskDitto The ultra-fast, parallel duplicate-file detector with interactive menus that make clearing unnecessary duplicates hassle free! Features

Blazingly fast duplicate scanning — Parallel processing finds duplicates across large disks instantly. Interactive TUI by default — Browse, compare, and manage duplicates with an intuitive terminal interface powered by Bubble Tea. Optional GUI — Use the experimental Raylib GUI for a graphical alternative to the TUI. Safe deletion & symlink conversion — Remove duplicates or replace them with symlinks, with confirmation dialogs to prevent accidents. Smart single-file search — Hash a specific file and instantly find all its duplicates across your filesystem. Flexible hashing — Choose between SHA-256 (default) or BLAKE3 for content verification. Fine-grained filtering — Skip files by size, depth, hidden files, symlinks, virtual filesystems, and filesystem boundaries. Export results — Save findings to CSV, JSON, or plain text for reporting or automation. Unix hard-link aware — Treats hard-linked files intelligently to avoid false duplicates.

Install Install straight from source using Go 1.22+: go install github.com/jdefrancesco/dskDitto/cmd/dskDitto@latest This drops the CLI/TUI binary at $(go env GOPATH)/bin/dskDitto (or ~/go/bin by default). The default install does not build the optional Raylib GUI. To install a GUI-capable binary, make sure Raylib and CGo are available, then build with the gui tag: go install -tags gui github.com/jdefrancesco/dskDitto/cmd/dskDitto@latest Usage dskDitto [options] PATH ... Common flags:

Flag Description

--version Print the current version and exit

--no-banner Skip the startup banner

--gui Review results in the experimental Raylib GUI instead of the default TUI; requires a GUI build

--profile <file> Write a CPU profile to the given file

--time-only Exit immediately after the scan, printing only the elapsed time

--min-size <bytes> Ignore files smaller than the provided size

--max-size <bytes> Skip files larger than the provided size (default 4 GiB;

§2 AI · 75%

use 0 for no limit)

--all-sizes Scan files of any size; clearer equivalent to --max-size 0

--hidden Include dot files and dot-directories

--exclude <path> Exclude a path from scanning (repeatable; excludes descendants)

--no-symlinks Skip symbolic links

--empty Include zero-byte files

--include-vfs Include virtual filesystem directories such as /proc or /dev

--one-file-system Do not descend into directories on a different filesystem device; --xdev is a short alias

--dir-concurrency <int> Limit concurrent directory reads; values <= 0 use automatic tuning

--no-cache On supported platforms, ask the OS not to populate the filesystem cache while hashing

--current Restrict the scan to only the specified paths (no recursion)

--depth <levels> Limit recursion to <levels> directories below the starting paths

--dups <count> Only show groups that contain at least <count> files

--text, --bullet Render duplicates without launching the TUI

--remove <keep> Operate on duplicates, keeping the first <keep> entries per group

--link With --remove, convert extra duplicates to symlinks instead of deleting them

--file <path> Only report duplicates of the given file; with --name-only, match by that file's exact name

--name-only Shallow mode: group files by exact file name, ignoring content and size

--file-shallow <path> Shallow mode: only report files with the same exact name as <path>

--fuzzy Content-based near-duplicate mode (file similarity, not filename similarity)

--fuzzy-threshold <pct> Minimum similarity percentage in fuzzy mode (default 75)

--fuzzy-same-ext In fuzzy mode, only compare files that share the same extension

--hash <algo> Select hash algorithm: sha256 (default) or blake3

--csv-out <file> Write duplicate groups to CSV

§3 AI · 91%

--json-out <file> Write duplicate groups to JSON

--fs-detect <path> Print the filesystem type that contains <path>

--color-safe Use a high-compatibility TUI theme that avoids custom colors (best for problematic terminal themes)

--no-confirm Skip interactive confirmation codes for TUI/GUI delete and link actions

Press Ctrl+C at any time to abort a scan. When duplicates are removed or converted through the TUI or GUI, a confirmation dialog prevents accidental mass changes unless --no-confirm is set. Duplicate removal and symlink conversion dskDitto never deletes or rewrites anything unless you explicitly ask it to with --remove.

Dry / interactive modes: by default (or with --text / --bullet) the tool only reports duplicates. Delete extras: use --remove <keep> to delete all but <keep> files in each duplicate group. Convert extras to symlinks: combine --remove <keep> --link to replace extra duplicates with symlinks pointing at one kept file per group.

In the TUI you can also convert the currently marked files into symlinks: mark the duplicates you want to replace, then press L and enter the confirmation code. Each group’s symlinks will point at one unmarked file in that group. Power users can pass --no-confirm to skip the confirmation code in the TUI and GUI. On Unix-like systems, multiple hard links to the same underlying file are treated as a single entry during scanning: dskDitto hashes the content once and does not report those hard-link paths as separate space-wasting duplicates. When using --link, the on-disk layout after the operation looks like this for a group of 3 identical files and --remove 1 --link: /path/to/keep/file.txt # original file kept /path/to/dup/file-copy.txt -> /path/to/keep/file.txt (symlink) /another/location/file.txt -> /path/to/keep/file.txt (symlink)

In the TUI, files that are symlinks are annotated with a [symlink] suffix so you can see which entries were converted. Single-file duplicate search Use --file /path/to/original.ext to hash a specific file first, then scan the provided directories for other files with identical content.

§4 Mixed · 59%

If no duplicates are found in those directories, dskDitto exits cleanly; otherwise, all reporting/removal/export modes are limited to that single duplicate group (with the original file listed first). Shallow filename duplicate search Use --name-only to group files by exact final filename without hashing file contents. For example, dir1/text1 and dir2/text1 are considered duplicates even when their contents differ. Combine --name-only --file /path/to/text1, or use --file-shallow /path/to/text1, to limit shallow results to one exact filename. When the shallow target is a dotfile, dskDitto automatically includes hidden files and directories for that scan. Restore backups are not supported for shallow filename matches because same-name files may contain different data. If --backup is combined with --name-only or --file-shallow, dskDitto prints a warning and exits before scanning or changing files. Fuzzy content matching (near duplicates) Use --fuzzy to find files with similar content even when they are not byte-for-byte identical. This mode compares file content signatures only; it does not use filename similarity. By default, fuzzy mode returns groups at >=75% similarity: dskDitto --fuzzy ~/Downloads Tune the similarity cutoff when needed: dskDitto --fuzzy --fuzzy-threshold 90 ~/Downloads Restrict fuzzy comparisons to matching extensions: dskDitto --fuzzy --fuzzy-same-ext ~/Downloads --fuzzy results are review-only near matches. Automatic mutation flows (--remove / --link) are disabled in fuzzy mode. Hash algorithms By default, dskDitto uses SHA-256 for content hashing:

SHA-256 (--hash sha256): conservative, widely-supported choice with strong collision guarantees. BLAKE3 (--hash blake3): Under many circumstances this is significantly faster on modern CPUs. However, on macOS SHA256 is fine tuned and out performs BLAKE3 most of the time. Thus, we leave SHA-256 as the default for now.

Examples Scan your home directory and interactively review duplicates: dskDitto $HOME Use the experimental Raylib windowed UI: dskDitto --gui $HOME The default install is CLI/TUI-only.

§5 Human · 21%

If --gui reports that GUI support was not built in, reinstall with go install -tags gui github.com/jdefrancesco/dskDitto/cmd/dskDitto@latest. Exclude a directory (or file) from scanning: dskDitto --exclude $HOME/Library/Caches $HOME Exclude multiple paths in one scan (repeat --exclude): dskDitto \ --exclude $HOME/Library/Caches \ --exclude $HOME/.cache \ --exclude $HOME/Downloads \ $HOME Stay on the starting filesystem, like find -xdev or ncdu -x: dskDitto --one-file-system / dskDitto --xdev $HOME List duplicates for scripting or grepping, without launching the TUI: dskDitto --text ~/Pictures ~/Movies | grep "\.jpg$" Find files that share the same exact filename, ignoring contents: dskDitto --name-only --text ~/Downloads ~/Documents Find and safely delete duplicates larger than 100 MiB, keeping one copy per group: dskDitto --min-size 100MiB --remove 1 /mnt/big-disk Shrink a media library by converting duplicates into symlinks instead of deleting them: dskDitto --remove 1 --link ~/Media Export duplicate information to CSV or JSON for offline analysis: dskDitto --csv-out dupes.csv ~/Photos dskDitto --json-out dupes.json ~/Projects Recipes

Clean a downloads folder but keep one copy of each installer: dskDitto --min-size 10MiB