id = "s3cmd"
name = "s3cmd"
homepage = "https://s3tools.org/s3cmd"
description = "A free command line tool and client for uploading, retrieving and managing data in Amazon S3."
executables = ["s3cmd"]
[dotfiles]
paths = ["~/.s3cfg"]
exclude = []
secret = []
[[dotfiles.secret_paths]]
file = "~/.s3cfg"
match = { prefix = ["access_key", "secret_key", "access_token", "gpg_passphrase"] }
[[dotfiles.machine_lines]]
file = "~/.s3cfg"
match = { prefix = [
"gpg_command",
"ca_certs_file",
"ssl_client_cert_file",
"ssl_client_key_file",
"cache_file",
] }
[commands]
format = 1
label = "s3cmd"
description = "Sync, upload and list objects in S3-compatible storage. Other commands (buckets, ACLs, policies, CloudFront) and credential switches are left out; configure access with s3cmd --configure."
quality = "ai-draft"
parser = { end_of_options = "--", interleave = "permute", long_equals = true, short_attached = true, short_bundles = false }
[[commands.subcommand]]
path = ["sync"]
label = "Synchronize"
description = "Synchronize a directory tree to S3, from S3, or between buckets."
[[commands.subcommand.source]]
id = "man"
kind = "manual"
url = "https://github.com/s3tools/s3cmd/blob/master/s3cmd.1"
revision = "2026-10-27"
evidence = """
s3cmd sync LOCAL_DIR s3://BUCKET[/PREFIX] or s3://BUCKET[/PREFIX] LOCAL_DIR or s3://BUCKET[/PREFIX] s3://BUCKET[/PREFIX]
-n, --dry-run
--skip-existing
--delete-removed
--no-check-md5
--exclude=GLOB
--include=GLOB
-P, --acl-public
--progress
"""
[[commands.subcommand.field]]
id = "source"
label = "Source"
description = "Local directory or s3://BUCKET[/PREFIX]."
type = "string"
position = 0
min = 1
sources = ["man"]
[[commands.subcommand.field]]
id = "destination"
label = "Destination"
description = "Local directory or s3://BUCKET[/PREFIX]."
type = "string"
position = 1
min = 1
sources = ["man"]
[[commands.subcommand.field]]
id = "dry_run"
label = "Dry run"
type = "boolean"
option = ["--dry-run", "-n"]
sources = ["man"]
[[commands.subcommand.field]]
id = "delete_removed"
label = "Delete removed files"
description = "Delete destination objects with no corresponding source file."
type = "boolean"
option = ["--delete-removed"]
effect = "delete"
sources = ["man"]
[[commands.subcommand.field]]
id = "skip_existing"
label = "Skip existing"
type = "boolean"
option = ["--skip-existing"]
sources = ["man"]
[[commands.subcommand.field]]
id = "no_check_md5"
label = "Compare sizes only"
description = "Do not check MD5 sums; faster but may miss changed files."
type = "boolean"
option = ["--no-check-md5"]
sources = ["man"]
[[commands.subcommand.field]]
id = "exclude"
label = "Exclude glob"
type = "string"
option = ["--exclude"]
multiple = true
sources = ["man"]
[[commands.subcommand.field]]
id = "include"
label = "Include glob"
type = "string"
option = ["--include"]
multiple = true
sources = ["man"]
[[commands.subcommand.field]]
id = "acl_public"
label = "Public-read ACL"
type = "boolean"
option = ["--acl-public", "-P"]
sources = ["man"]
[[commands.subcommand.task]]
id = "preview"
label = "Preview a sync"
set = { dry_run = [true] }
lock = ["dry_run"]
fields = ["source", "destination", "dry_run", "delete_removed", "exclude", "include"]
required = ["source", "destination"]
[[commands.subcommand.task]]
id = "sync"
label = "Sync"
fields = ["source", "destination", "skip_existing", "delete_removed", "exclude", "include", "acl_public"]
required = ["source", "destination"]
[[commands.subcommand.group]]
id = "basic"
label = "Basic"
fields = ["source", "destination", "dry_run", "delete_removed"]
[[commands.subcommand.group]]
id = "advanced"
label = "Advanced"
fields = ["skip_existing", "no_check_md5", "exclude", "include", "acl_public"]
[[commands.subcommand]]
path = ["put"]
label = "Upload files"
description = "Put files into a bucket."
[[commands.subcommand.source]]
id = "man"
kind = "manual"
url = "https://github.com/s3tools/s3cmd/blob/master/s3cmd.1"
revision = "2026-10-27"
evidence = """
s3cmd put FILE [FILE...] s3://BUCKET[/PREFIX]
-n, --dry-run
-f, --force
-r, --recursive
-P, --acl-public
--storage-class=CLASS
--progress
"""
[[commands.subcommand.field]]
id = "files"
label = "Files"
type = "path"
position = 0
multiple = true
min = 1
path = { kind = "any", role = "input" }
sources = ["man"]
[[commands.subcommand.field]]
id = "destination"
label = "Destination"
description = "s3://BUCKET[/PREFIX]"
type = "string"
position = 1
min = 1
sources = ["man"]
[[commands.subcommand.field]]
id = "recursive"
label = "Recursive"
type = "boolean"
option = ["--recursive", "-r"]
sources = ["man"]
[[commands.subcommand.field]]
id = "dry_run"
label = "Dry run"
type = "boolean"
option = ["--dry-run", "-n"]
sources = ["man"]
[[commands.subcommand.field]]
id = "force"
label = "Force overwrite"
type = "boolean"
option = ["--force", "-f"]
effect = "overwrite"
sources = ["man"]
[[commands.subcommand.field]]
id = "acl_public"
label = "Public-read ACL"
type = "boolean"
option = ["--acl-public", "-P"]
sources = ["man"]
[[commands.subcommand.field]]
id = "storage_class"
label = "Storage class"
type = "string"
option = ["--storage-class"]
suggestions = [{ value = "STANDARD", label = "Standard" }, { value = "STANDARD_IA", label = "Standard-IA" }, { value = "GLACIER", label = "Glacier" }, { value = "DEEP_ARCHIVE", label = "Deep Archive" }]
sources = ["man"]
[[commands.subcommand.task]]
id = "upload"
label = "Upload files"
fields = ["files", "destination", "recursive", "acl_public", "storage_class"]
required = ["files", "destination"]
[[commands.subcommand.group]]
id = "basic"
label = "Basic"
fields = ["files", "destination", "recursive", "dry_run"]
[[commands.subcommand.group]]
id = "advanced"
label = "Advanced"
fields = ["force", "acl_public", "storage_class"]
[[commands.subcommand]]
path = ["ls"]
label = "List objects or buckets"
description = "List objects or buckets."
[[commands.subcommand.source]]
id = "man"
kind = "manual"
url = "https://github.com/s3tools/s3cmd/blob/master/s3cmd.1"
revision = "2026-10-27"
evidence = """
s3cmd ls [s3://BUCKET[/PREFIX]]
-r, --recursive
-H, --human-readable-sizes
"""
[[commands.subcommand.field]]
id = "target"
label = "Bucket or prefix"
description = "s3://BUCKET[/PREFIX]; empty lists all buckets."
type = "string"
position = 0
min = 0
sources = ["man"]
[[commands.subcommand.field]]
id = "recursive"
label = "Recursive"
type = "boolean"
option = ["--recursive", "-r"]
sources = ["man"]
[[commands.subcommand.field]]
id = "human"
label = "Human-readable sizes"
type = "boolean"
option = ["--human-readable-sizes", "-H"]
sources = ["man"]
[[commands.subcommand.task]]
id = "list"
label = "List"
fields = ["target", "recursive", "human"]
[[commands.subcommand.group]]
id = "basic"
label = "Basic"
fields = ["target", "recursive", "human"]