rclone copy: Upload Files to Any Cloud Storage
rclone copy copies new or changed files from a source to a destination remote, leaving existing destination files in place.
copy is the additive transfer: it never deletes at the destination, so it is the safe choice for pushing build artifacts to a bucket. The remote:path syntax works the same across S3, GCS, Azure Blob, and Backblaze B2.
What it does
rclone copy copies files from source to destination, skipping files that are already identical (by size and modification time or hash). Nothing at the destination is deleted, unlike rclone sync. Either side can be a local path or a remote:bucket/path.
Common usage
rclone copy ./dist s3remote:my-bucket/site --transfers 16
rclone copy s3remote:my-bucket/cache ./cache --checkers 32
# copy a single file
rclone copyto ./build.tar.gz s3remote:artifacts/build-${GITHUB_SHA}.tar.gzOptions
| Flag | What it does |
|---|---|
| --transfers N | Number of file transfers to run in parallel (default 4) |
| --checkers N | Number of checks to run in parallel when comparing files (default 8) |
| -P / --progress | Show live transfer progress |
| --dry-run | Show what would be transferred without doing it |
| --exclude <pattern> | Skip files matching the pattern |
| --s3-no-check-bucket | Skip the bucket-exists check (needs only object permissions) |
In CI
Raise --transfers and --checkers to saturate the runner network for many small files (uploading a static site or node_modules cache). Prefer OIDC or an instance role over static keys: set env_auth = true in the remote so rclone reads AWS_ROLE_ARN or the instance metadata rather than baking keys into config.
Common errors in CI
"directory not found" means the source path does not exist on the runner (a build step did not produce ./dist). "Failed to copy: AccessDenied: Access Denied" means the credentials lack s3:PutObject on the target prefix. "NoSuchBucket: The specified bucket does not exist" means a typo in the remote or wrong region. "didn't find section in config file" means the named remote is not defined; run rclone config or point RCLONE_CONFIG at the right file.