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] # s3cmd(1), under -c FILE / --config=FILE: "Config file name. Defaults to # $HOME/.s3cfg". The file is an INI with a [default] section and one # `key = value` per line, and the key names below are the attributes # S3/Config.py defines on its Config class — the same names `s3cmd # --dump-config` writes back out. On Windows the home spelling is # %USERPROFILE%\.s3cfg, which resolves to the same path as ~/.s3cfg. paths = ["~/.s3cfg"] exclude = [] # Not a whole-file secret: the endpoint, bucket location, ACL, encryption and # transfer settings that surround the keys are worth carrying. Only the # credential lines are lifted out, below. secret = [] # The AWS credential triple the man page documents — access_key "AWS Access # Key", secret_key "AWS Secret Key", access_token "AWS Access Token" — plus # gpg_passphrase, the passphrase S3/Config.py hands to gpg for --encrypt. [[dotfiles.secret_paths]] file = "~/.s3cfg" match = { prefix = ["access_key", "secret_key", "access_token", "gpg_passphrase"] } # Absolute paths to things installed on this machine, all named in # S3/Config.py: gpg_command (the gpg binary), ca_certs_file (the CA bundle), # ssl_client_cert_file and ssl_client_key_file (the client certificate and its # key), and cache_file (the local file-list cache --cache-file writes). A path # to a key is not the key, so these are machine lines rather than secrets. [[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"]