id = "czkawka"
name = "Czkawka"
homepage = "https://github.com/qarmin/czkawka"
description = "Multi functional app to find duplicates, empty folders, similar images etc."
executables = ["czkawka_cli", "czkawka_gui", "krokiet"]
[dotfiles]
paths = [
"[configHome]/czkawka/",
"[appData]/pl.Qarmin.Czkawka/",
"%APPDATA%/Qarmin/Czkawka/config/",
"[configHome]/krokiet/",
"[appData]/pl.Qarmin.Krokiet/",
"%APPDATA%/Qarmin/Krokiet/config/",
]
secret = []
side_effect = false
[commands]
format = 1
label = "Czkawka CLI"
description = "Scan directories with czkawka_cli. Modelled subcommands: dup (duplicate files) and empty-folders. Other tools (big, music, image, video, ...) are not covered. Short flags only, as listed in the clap source."
quality = "ai-draft"
parser = { end_of_options = "--", interleave = "permute", long_equals = true, short_attached = true, short_bundles = false }
[[commands.subcommand]]
path = ["dup"]
label = "Find duplicate files"
description = "Scan for duplicate files. Without -D nothing is deleted; -Q previews."
[[commands.subcommand.source]]
id = "src"
kind = "manual"
url = "https://github.com/qarmin/czkawka/blob/master/czkawka_cli/src/commands.rs"
revision = "master 2026-10-27"
evidence = """
czkawka dup -d /home/rafal -e /home/rafal/Obrazy -m 25 -x 7z rar IMAGE -s hash -f results.txt -D aeo
-d Directory(ies) to search
-e Excluded directory(ies)
-x Allowed file extension(s)
-m Minimum size in bytes
-s Search method (NAME, SIZE, SIZE_NAME, HASH)
-f Save results to formatted text file (file-name)
-D Delete method (AEN, AEO, ON, OO, AEB, AES, OB, OS, HARD)
-Q Dry run - preview operations
-y Move items to trash
-R Prevents recursive check of folders
"""
[[commands.subcommand.field]]
id = "directories"
label = "Directories to search"
type = "path"
option = ["-d"]
multiple = true
path = { kind = "directory", role = "input", must_exist = true }
sources = ["src"]
[[commands.subcommand.field]]
id = "excluded"
label = "Excluded directories"
type = "path"
option = ["-e"]
multiple = true
path = { kind = "directory", role = "input", must_exist = false }
sources = ["src"]
[[commands.subcommand.field]]
id = "extensions"
label = "Allowed extensions"
description = "Extensions or macros such as IMAGE, TEXT, VIDEO, MUSIC."
type = "string"
option = ["-x"]
multiple = true
sources = ["src"]
[[commands.subcommand.field]]
id = "min_size"
label = "Minimum size (bytes)"
type = "integer"
option = ["-m"]
sources = ["src"]
[[commands.subcommand.field]]
id = "method"
label = "Search method"
type = "enum"
option = ["-s"]
choices = [{ value = "NAME", label = "Name" }, { value = "SIZE", label = "Size" }, { value = "SIZE_NAME", label = "Size and name" }, { value = "HASH", label = "Hash (slowest, exact)" }]
sources = ["src"]
[[commands.subcommand.field]]
id = "save"
label = "Save results to file"
type = "path"
option = ["-f"]
path = { kind = "file", role = "output", must_exist = false }
effect = "overwrite"
sources = ["src"]
[[commands.subcommand.field]]
id = "delete_method"
label = "Delete method"
description = "Which files in each group get deleted. Leave unset to only report."
type = "enum"
option = ["-D"]
choices = [{ value = "AEN", label = "All except newest" }, { value = "AEO", label = "All except oldest" }, { value = "ON", label = "Only newest" }, { value = "OO", label = "Only oldest" }, { value = "AEB", label = "All except biggest" }, { value = "AES", label = "All except smallest" }, { value = "OB", label = "Only biggest" }, { value = "OS", label = "Only smallest" }, { value = "HARD", label = "Replace with hard links" }]
effect = "delete"
sources = ["src"]
[[commands.subcommand.field]]
id = "dry_run"
label = "Dry run"
type = "boolean"
option = ["-Q"]
sources = ["src"]
[[commands.subcommand.field]]
id = "trash"
label = "Move to trash instead of deleting"
type = "boolean"
option = ["-y"]
sources = ["src"]
[[commands.subcommand.field]]
id = "not_recursive"
label = "Do not recurse"
type = "boolean"
option = ["-R"]
sources = ["src"]
[[commands.subcommand.task]]
id = "report"
label = "Report duplicates"
set = { method = ["HASH"] }
fields = ["directories", "excluded", "extensions", "min_size", "method", "save"]
required = ["directories"]
[[commands.subcommand.task]]
id = "preview-delete"
label = "Preview deletion (dry run)"
set = { dry_run = [true], delete_method = ["AEO"] }
lock = ["dry_run"]
fields = ["directories", "excluded", "extensions", "delete_method", "dry_run", "trash"]
required = ["directories", "delete_method"]
[[commands.subcommand.group]]
id = "basic"
label = "Basic"
fields = ["directories", "excluded", "extensions", "method", "min_size", "save"]
[[commands.subcommand.group]]
id = "advanced"
label = "Advanced"
fields = ["delete_method", "dry_run", "trash", "not_recursive"]
[[commands.subcommand]]
path = ["empty-folders"]
label = "Find empty folders"
description = "Scan for empty folders; -D deletes them."
[[commands.subcommand.source]]
id = "src"
kind = "manual"
url = "https://github.com/qarmin/czkawka/blob/master/czkawka_cli/src/commands.rs"
revision = "master 2026-10-27"
evidence = """
czkawka empty-folders -d /home/rafal/rr /home/gateway -f results.txt
-d Directory(ies) to search
-e Excluded directory(ies)
-f Save results to formatted text file (file-name)
-D Delete found items
-Q Dry run - preview operations
-y Move items to trash
"""
[[commands.subcommand.field]]
id = "directories"
label = "Directories to search"
type = "path"
option = ["-d"]
multiple = true
path = { kind = "directory", role = "input", must_exist = true }
sources = ["src"]
[[commands.subcommand.field]]
id = "excluded"
label = "Excluded directories"
type = "path"
option = ["-e"]
multiple = true
path = { kind = "directory", role = "input", must_exist = false }
sources = ["src"]
[[commands.subcommand.field]]
id = "save"
label = "Save results to file"
type = "path"
option = ["-f"]
path = { kind = "file", role = "output", must_exist = false }
effect = "overwrite"
sources = ["src"]
[[commands.subcommand.field]]
id = "delete"
label = "Delete found folders"
type = "boolean"
option = ["-D"]
effect = "delete"
sources = ["src"]
[[commands.subcommand.field]]
id = "dry_run"
label = "Dry run"
type = "boolean"
option = ["-Q"]
sources = ["src"]
[[commands.subcommand.field]]
id = "trash"
label = "Move to trash instead of deleting"
type = "boolean"
option = ["-y"]
sources = ["src"]
[[commands.subcommand.task]]
id = "report"
label = "List empty folders"
fields = ["directories", "excluded", "save"]
required = ["directories"]
[[commands.subcommand.task]]
id = "clean"
label = "Delete empty folders (trash)"
set = { delete = [true], trash = [true] }
fields = ["directories", "excluded", "delete", "trash", "dry_run"]
required = ["directories"]
[[commands.subcommand.group]]
id = "basic"
label = "Basic"
fields = ["directories", "excluded", "save"]
[[commands.subcommand.group]]
id = "advanced"
label = "Advanced"
fields = ["delete", "dry_run", "trash"]