rclone(1)
NAME
okay bestie, welcome to the rclone(1) manual page ๐ โ this is the one that lets you manage files on cloud storage across like a million remotes, no cap. It's giving "I have 47 cloud accounts and I know how to use them" energy. Periodt. โจ
SYNOPSIS
Here's the usage shape, fr fr:
Usage:
rclone [flags]
rclone [command]
โจ Available commands โจ
okay so these are all the commands rclone is giving. Don't skip, there's like 56 of them and they all matter:
aboutโ gets quota information from the remote. Like, "how much space do I have left?" energy. โจarchiveโ performs an action on an archive. It's giving archive management. ๐authorizeโ remote authorization. The "let me in" moment. ๐backendโ runs a backend-specific command. iykyk. ๐งbisyncโ performs bidirectional synchronization between two paths. Both ways, no cap. ๐catโ concatenates any files and sends them tostdout. Likecat, but make it cloud. ๐ฑcheckโ checks the files in the source and destination match. Vibe check for your data. ๐checksumโ checks the files in the destination against a SUM file. ๐งพcleanupโ cleans up the remote if possible. Tidy queen. ๐งนcompletionโ outputs completion script for a given shell. Your shell will thank you. ๐configโ enters an interactive configuration session. Set it up, bestie. โ๏ธconvmvโ converts file and directory names in place. Rename glow-up. ๐copyโ copies files from source to dest, skipping identical files. No duplicates, periodt. ๐copytoโ copies files from source to dest, skipping identical files. Same energy, different target. ๐ฏcopyurlโ copies the contents of the URL supplied content todest:path. URL to cloud, slay. ๐cryptcheckโ cryptcheck checks the integrity of an encrypted remote. ๐cryptdecodeโ cryptdecode returns unencrypted file names. Decode the mystery. ๐ต๏ธdedupeโ interactively finds duplicate filenames and deletes/renames them. Duplicate detective. ๐deleteโ removes the files inpath. Gone, but make it intentional. ๐๏ธdeletefileโ removes a single file from remote. Just one, bestie. โ๏ธgendocsโ outputs markdown docs for rclone to the directory supplied. Docs on docs. ๐gitannexโ speaks with git-annex overstdin/stdout. Niche but iconic. ๐งฌguiโ opens the web based GUI. Clicky clicky. ๐ฑ๏ธhashsumโ produces a hashsum file for all the objects in the path. Hashes for days. #๏ธโฃhelpโ shows help for rclone commands, flags and backends. When in doubt, ask. ๐linkโ generates public link to file/folder. Share the love. ๐listremotesโ lists all the remotes in the config file and defined in environment variables. Remote roll call. ๐lsโ lists the objects in the path with size and path. Basic but essential. ๐lsdโ lists all directories/containers/buckets in the path. Directory vibes. ๐lsfโ lists directories and objects inremote:pathformatted for parsing. Machine-readable realness. ๐คlsjsonโ lists directories and objects in the path in JSON format. JSON girlies rise. ๐งพlslโ lists the objects in path with modification time, size and path. The long view. ๐md5sumโ produces an md5sum file for all the objects in the path. Classic hash energy. ๐ขmkdirโ makes the path if it doesn't already exist. Create the folder, bestie. ๐mountโ mounts the remote as file system on a mountpoint. Cloud as local, iconic. ๐ปmoveโ moves files from source to dest. No copy left behind. ๐movetoโ moves file or directory from source to dest. Same, but specific. ๐ฏncduโ explores a remote with a text based user interface. TUI adventure. ๐บ๏ธnfsmountโ mounts the remote as file system on a mountpoint. NFS edition. ๐ปobscureโ obscures password for use in the rclone config file. Keep it secret, keep it safe. ๐คซpurgeโ removes the path and all of its contents. Nuclear option, be careful. ๐ฅrcโ runs a command against a running rclone. Remote control realness. ๐ฎrcatโ copies standard input to file on remote.stdinto cloud. ๐rcdโ runs rclone listening to remote control commands only. Daemon mode, no cap. ๐ฐ๏ธrmdirโ removes the empty directory at path. Only if it's empty, bestie. ๐rmdirsโ removes empty directories under the path. Clean sweep. ๐งนselfupdateโ updates the rclone binary. Glow-up for your binary. โฌ๏ธserveโ serves a remote over a protocol. Host it. ๐settierโ changes storage class/tier of objects in remote. Tier list for your storage. ๐sha1sumโ produces an sha1sum file for all the objects in the path. Another hash baddie. ๐ขsizeโ prints the total size and number of objects inremote:path. Math but make it cloud. ๐งฎsyncโ makes source and dest identical, modifying destination only. One-way realness. ๐testโ runs a test command. Just a test, bestie. ๐งชtouchโ creates new file or changes file modification time. Touch grass? No, touch file. ๐ฑtreeโ lists the contents of the remote in a tree like fashion. Tree structure, slay. ๐ณversionโ shows the version number. Know your era. ๐
And the little helper notes, exactly as rclone gives them:
Use "rclone [command] --help" for more information about a command.
Use "rclone help flags" for to see the global flags.
Use "rclone help backends" for a list of supported services.
๐ Rclone syncs your files to cloud storage โจ
- About rclone
- What can rclone do for you?
- What features does rclone have?
- What providers does rclone support?
- Download โ
https://rclone.org/downloads/ - Install โ
https://rclone.org/install/ - Donate โ
https://rclone.org/donate/
๐ธ About rclone ๐ธ
okay so bestie, rclone is a command-line program that manages your files on cloud storage, and it is a seriously feature-rich alternative to whatever sad little web storage interface your cloud vendor gave you. Over 70 cloud storage products support rclone, including S3 object stores, business & consumer file storage services, and plain old standard transfer protocols. no cap.
It's got powerful cloud equivalents to the unix commands rsync, cp, mv, mount, ls, ncdu, tree, rm, and cat. The syntax is familiar, it includes shell pipeline support, and there's --dry-run protection so you don't accidentally nuke your whole drive ๐ญ. You can use it at the command line, in scripts, or through its API.
Users literally call rclone "The Swiss army knife of cloud storage", and "Technology indistinguishable from magic". iconic behavior, honestly. ๐
Rclone really looks after your data. It preserves timestamps and verifies checksums at all times. Transfers over limited bandwidth, intermittent connections, or transfers subject to quota can be restarted โ from the last good file that got transferred ๐ซถ. You can check (https://rclone.org/commands/rclone_check/) the integrity of your files. And where possible, rclone employs server-side transfers to minimise your local bandwidth use, plus transfers from one provider to another without ever touching local disk. it's giving efficiency.
Virtual backends wrap local and cloud file systems so you can apply encryption (https://rclone.org/crypt/), compression (https://rclone.org/compress/), chunking (https://rclone.org/chunker/), hashing (https://rclone.org/hasher/) and joining (https://rclone.org/union/). ๐ซ
Rclone mounts (https://rclone.org/commands/rclone_mount/) any local, cloud or virtual filesystem as a disk on Windows, macOS, linux and FreeBSD, and also serves these over SFTP (https://rclone.org/commands/rclone_serve_sftp/), HTTP (https://rclone.org/commands/rclone_serve_http/), WebDAV (https://rclone.org/commands/rclone_serve_webdav/), FTP (https://rclone.org/commands/rclone_serve_ftp/) and DLNA (https://rclone.org/commands/rclone_serve_dlna/).
Rclone is mature, open-source software originally inspired by rsync and written in Go (https://golang.org). The friendly support community is familiar with varied use cases. Official Ubuntu, Debian, Fedora, Brew and Chocolatey repos include rclone. But for the latest version, downloading from rclone.org (https://rclone.org/downloads/) is recommended. โญ
Rclone is widely used on Linux, Windows and Mac. Third-party developers create innovative backup, restore, GUI and business process solutions using the rclone command line or API.
And rclone does the heavy lifting of communicating with cloud storage. main character energy tbh. ๐
๐ What can rclone do for you? ๐
Rclone helps you:
- Backup (and encrypt) files to cloud storage
- Restore (and decrypt) files from cloud storage
- Mirror cloud data to other cloud services or locally
- Migrate data to the cloud, or between cloud storage vendors
- Mount multiple, encrypted, cached or diverse cloud storage as a disk
- Analyse and account for data held on cloud storage using
lsf(https://rclone.org/commands/rclone_lsf/),ljson(https://rclone.org/commands/rclone_lsjson/),size(https://rclone.org/commands/rclone_size/),ncdu(https://rclone.org/commands/rclone_ncdu/) - Union (
https://rclone.org/union/) file systems together to present multiple local and/or cloud file systems as one
โจ Features โจ
- Transfers
- MD5, SHA1 hashes are checked at all times for file integrity
- Timestamps are preserved on files
- Operations can be restarted at any time
- Can be to and from network, e.g. two different cloud providers
- Can use multi-threaded downloads to local disk
- Copy (
https://rclone.org/commands/rclone_copy/) new or changed files to cloud storage - Sync (
https://rclone.org/commands/rclone_sync/) (one way) to make a directory identical - Bisync (
https://rclone.org/bisync/) (two way) to keep two directories in sync bidirectionally - Move (
https://rclone.org/commands/rclone_move/) files to cloud storage deleting the local after verification - Check (
https://rclone.org/commands/rclone_check/) hashes and for missing/extra files - Mount (
https://rclone.org/commands/rclone_mount/) your cloud storage as a network disk - Serve (
https://rclone.org/commands/rclone_serve/) local or remote files over HTTP (https://rclone.org/commands/rclone_serve_http/)/WebDav (https://rclone.org/commands/rclone_serve_webdav/)/FTP (https://rclone.org/commands/rclone_serve_ftp/)/SFTP (https://rclone.org/commands/rclone_serve_sftp/)/DLNA (https://rclone.org/commands/rclone_serve_dlna/) - Experimental Web based GUI (
https://rclone.org/gui/)
๐ฆ Supported providers ๐ฆ
(There are many others, built on standard protocols such as WebDAV or S3, that work out of the box. slay.)
- 1Fichier
- Akamai Netstorage
- Alibaba Cloud (Aliyun) Object Storage System (OSS)
- Amazon S3
- Bizfly Cloud Simple Storage
- Backblaze B2
- Box
- Ceph
- China Mobile Ecloud Elastic Object Storage (EOS)
- Arvan Cloud Object Storage (AOS)
- Citrix ShareFile
- Cloudflare R2
- Cloudinary
- Cubbit DS3
- DigitalOcean Spaces
- Digi Storage
- Dreamhost
- Drime
- Dropbox
- Enterprise File Fabric
- Exaba
- Fastly Object Storage
- Fastmail Files
- FileLu Cloud Storage
- FileLu S5 (S3-Compatible Object Storage)
- Filen
- Files.com
- FlashBlade
- FTP
- Gofile
- Google Cloud Storage
- Google Drive
- Google Photos
- HDFS
- Hetzner Object Storage
- Hetzner Storage Box
- HiDrive
- Hitachi Content Platform (HCP)
- HTTP
- Huawei Drive
- Huawei OBS
- iCloud Drive
- ImageKit
- Internet Archive
- Internxt
- Jottacloud
- IBM COS S3
- IDrive e2
- Impossible Cloud
- Intercolo Object Storage
- IONOS Cloud
- Koofr
- Leviia Object Storage
- Liara Object Storage
- Linkbox
- Linode Object Storage
- Magalu
- Mail.ru Cloud
- Memset Memstore
- MEGA
- MEGA S4
- Memory
- Microsoft Azure Blob Storage
- Microsoft Azure Files Storage
- Microsoft OneDrive
- Minio
- Nextcloud
- Blomp Cloud Storage
- OpenDrive
- OpenStack Swift
- Oracle Cloud Storage Swift
- Oracle Object Storage
- Outscale
- OVHcloud Object Storage (Swift)
- OVHcloud Object Storage (S3-compatible)
- ownCloud
- pCloud
- Petabox
- PikPak
- Pixeldrain
- premiumize.me
- put.io
- Proton Drive
- QingStor
- Qiniu Cloud Object Storage (Kodo)
- Quatrix by Maytech
- Rabata Cloud Storage
- RackCorp Object Storage
- Rackspace Cloud Files
- Rclone Serve S3
- rsync.net
- Scaleway
- Scality (RING / ARTESCA)
- Seafile
- Seagate Lyve Cloud
- SeaweedFS
- Selectel
- Servercore Object Storage
- SFTP
- Shade
- Sia
- SMB / CIFS
- Spectra Logic
- Storj
- Synology
- SugarSync
- Tencent Cloud Object Storage (COS)
- Uloz.to
- US3
- Wasabi
- WebDAV
- Yandex Disk
- Zadara Object Storage
- Zero Services (ZERO-Z3)
- Zoho WorkDrive
- Zata
- The local filesystem
๐ง Virtual providers ๐ง
These backends adapt or modify other storage providers. little remix artists, honestly:
- Alias: Rename existing remotes
- Archive: Read archive files
- Cache: Cache remotes (DEPRECATED) โ ๏ธ
- Chunker: Split large files
- Combine: Combine multiple remotes into a directory tree
- Compress: Compress files
- Crypt: Encrypt files
- Hasher: Hash files
- Union: Join multiple remotes to work together
๐ Links ๐
- Home page (
https://rclone.org/) - GitHub project page for source and bug tracker (
https://github.com/rclone/rclone) - Rclone Forum (
https://forum.rclone.org) - Downloads (
https://rclone.org/downloads/)
๐ Install ๐
Rclone is a Go program and comes as a single binary file. that's it. one file. no cap. ๐ซถ
๐ Quickstart ๐
- Download (
https://rclone.org/downloads/) the relevant binary. - Extract the rclone executable,
rclone.exeon Windows, from the archive. - Run
rclone configto setup. See rclone config docs (https://rclone.org/docs/) for more details. - Optionally configure automatic execution.
See below for some expanded Linux / macOS / Windows instructions.
See the usage (https://rclone.org/docs/) docs for how to use rclone, or run rclone -h.
Already installed rclone can be easily updated to the latest version using the rclone selfupdate (https://rclone.org/commands/rclone_selfupdate/) command. so convenient, obsessed. โจ
See the release signing docs (https://rclone.org/release_signing/) for how to verify signatures on the release.
๐ธ Script installation ๐ธ
To install rclone on Linux/macOS/BSD systems, run:
sudo -v ; curl https://rclone.org/install.sh | sudo bash
For beta installation, run:
sudo -v ; curl https://rclone.org/install.sh | sudo bash -s beta
Note that this script checks the version of rclone installed first and won't re-download if not needed. polite of it.
๐ Linux installation ๐
โญ Precompiled binary โญ
Fetch and unpack:
curl -O https://downloads.rclone.org/rclone-current-linux-amd64.zip
unzip rclone-current-linux-amd64.zip
cd rclone-*-linux-amd64
Copy binary file:
sudo cp rclone /usr/bin/
sudo chown root:root /usr/bin/rclone
sudo chmod 755 /usr/bin/rclone
Install manpage:
sudo mkdir -p /usr/local/share/man/man1
sudo cp rclone.1 /usr/local/share/man/man1/
sudo mandb
Run rclone config to setup. See rclone config docs (https://rclone.org/docs/) for more details.
rclone config
๐ฆ macOS installation ๐ฆ
๐ Installation with brew ๐
brew install rclone
NOTE: This version of rclone will not supportmountany more (see #5373 (https://github.com/rclone/rclone/issues/5373)). If mounting is wanted on macOS, either install a precompiled binary or enable the relevant option when installing from source. tragic but true ๐ญ
Note bestie, this one is a third party installer โ not something the rclone devs control โ so it might be lowkey outdated. Its current version is right here:
[IMAGE: Homebrew package (https://repology.org/badge/version-for-repo/homebrew/rclone.svg)] (https://repology.org/project/rclone/versions)
โจ Installation with MacPorts โจ
On macOS you can also pull rclone in through MacPorts (https://www.macports.org):
sudo port install rclone
Girl, heads up: this is also a third party installer not controlled by the rclone developers, so it might be out of date. Its current version is as below.
[IMAGE: MacPorts port (https://repology.org/badge/version-for-repo/macports/rclone.svg)] (https://repology.org/project/rclone/versions)
More info lives over at macports.org (https://ports.macports.org/port/rclone/).
๐ Precompiled binary, using curl ๐
So the whole macOS gatekeeper situation โ where it insists binaries be signed and notarized โ the trick is literally just to download with curl. That's it. That's the hack. slay.
Download the latest version of rclone:
cd && curl -O https://downloads.rclone.org/rclone-current-osx-amd64.zip
Unzip the download and cd into the extracted folder:
unzip -a rclone-current-osx-amd64.zip && cd rclone-*-osx-amd64
Move rclone to your $PATH. It's gonna ask for your password:
sudo mkdir -p /usr/local/bin
sudo mv rclone /usr/local/bin/
(the mkdir command is safe to run, even if the directory already exists ๐ซถ)
Remove the leftover files:
cd .. && rm -rf rclone-*-osx-amd64 rclone-current-osx-amd64.zip
Run rclone config to set everything up. Peep the rclone config docs (https://rclone.org/docs/) for more details:
rclone config
๐ฆ Precompiled binary, using a web browser ๐ฆ
Okay so the moment you download a binary with a web browser, the browser slaps the macOS gatekeeper quarantine attribute on it. And starting from Catalina, when you try to run rclone, a pop-up shows up being all:
"rclone" cannot be opened because the developer cannot be verified.
macOS cannot verify that this app is free from malware.
The simplest fix is just to run:
xattr -d com.apple.quarantine rclone
๐ Windows installation ๐
โญ Precompiled binary โญ
Grab the correct binary for your processor type by clicking these links. Not sure? Use the first one, no stress.
- Intel/AMD - 64 Bit (https://downloads.rclone.org/rclone-current-windows-amd64.zip)
- Intel/AMD - 32 Bit (https://downloads.rclone.org/rclone-current-windows-386.zip)
- ARM - 64 Bit (https://downloads.rclone.org/rclone-current-windows-arm64.zip)
Open this file in the Explorer and extract rclone.exe. Rclone is a portable executable, so you can drop it wherever is convenient for you.
Open a CMD window (or powershell) and run the binary. FYI rclone does not launch a GUI by default โ it runs in the CMD Window, periodt.
- Run
rclone.exe configto setup. See rclone config docs (https://rclone.org/docs/) for more details. - Optionally configure automatic execution.
If you're planning to use the rclone mount (https://rclone.org/commands/rclone_mount/) feature, then you're also gonna need the third party utility WinFsp (https://winfsp.dev/). No cap.
๐ Windows package manager (Winget) ๐
Winget (https://learn.microsoft.com/en-us/windows/package-manager/) comes pre-installed with the latest versions of Windows. If it's not there, update the App Installer (https://www.microsoft.com/p/app-installer/9nblggh4nns1) package from the Microsoft store.
To install rclone:
winget install Rclone.Rclone
To uninstall rclone:
winget uninstall Rclone.Rclone --force
๐ Chocolatey package manager ๐
First, make sure you have Choco (https://chocolatey.org/) installed:
choco search rclone
choco install rclone
This will install rclone on your Windows machine. And if you're planning to use rclone mount (https://rclone.org/commands/rclone_mount/), then:
choco install winfsp
will install that too ๐
Note that this is a third party installer not controlled by the rclone developers so it may be out of date. Its current version is as below.
[IMAGE: Chocolatey package (https://repology.org/badge/version-for-repo/chocolatey/rclone.svg)] (https://repology.org/project/rclone/versions)
๐ง Scoop package manager ๐ง
Make sure you have Scoop (https://scoop.sh/) installed first:
scoop install rclone
Note that this is a third party installer not controlled by the rclone developers so it may be out of date. Its current version is as below.
[IMAGE: Scoop package (https://repology.org/badge/version-for-repo/scoop/rclone.svg)] (https://repology.org/project/rclone/versions)
๐ Package manager installation ๐
So many Linux, Windows, macOS and other OS distributions package and distribute rclone.
The distributed versions of rclone are often quite out of date and for this reason we recommend one of the other installation methods if possible. fr fr, they're stale ๐ญ
You can get an idea of how up to date or not your OS distribution's package is right here:
[IMAGE: Packaging status (https://repology.org/badge/vertical-allrepos/rclone.svg?columns=3)] (https://repology.org/project/rclone/versions)
๐ Docker installation ๐
The rclone developers maintain a docker image for rclone (https://hub.docker.com/r/rclone/rclone).
These images are built as part of the release process based on a minimal Alpine Linux.
The :latest tag will always point to the latest stable release. You can use the :beta tag to get the latest build from master. You can also use version tags, e.g. :1.49.1, :1.49 or :1.
$ docker pull rclone/rclone:latest
latest: Pulling from rclone/rclone
Digest: sha256:0e0ced72671989bb837fea8e88578b3fc48371aa45d209663683e24cfdaa0e11
...
$ docker run --rm rclone/rclone:latest version
rclone v1.49.1
- os/arch: linux/amd64
- go version: go1.12.9
There are a few command line options to consider when starting an rclone Docker container from the rclone image:
- You need to mount the host rclone config dir at
/config/rcloneinto the Docker container. Due to the fact that rclone updates tokens inside its config file, and that the update process involves a file rename, you need to mount the whole host rclone config dir, not just the single host rclone config file. - You need to mount a host data dir at
/datainto the Docker container. - By default, the rclone binary inside a Docker container runs with
UID=0(root). As a result, all files created in a run will haveUID=0. If your config and data files reside on the host with a non-rootUID:GID, you need to pass these on the container start command line. - If you want to access the RC interface (either via the API or the Web UI), it is required to set the
--rc-addrto:5572in order to connect to it from outside the container. An explanation about why this is necessary can be found in an old pythonspeed.com (https://web.archive.org/web/20200808071950/https://pythonspeed.com/articles/docker-connection-refused/) article.- NOTE: Users running this container with the docker network set to
hostshould probably set it to listen to localhost only, with127.0.0.1:5572as the value for--rc-addr
- NOTE: Users running this container with the docker network set to
- It is possible to use
rclone mountinside a userspace Docker container, and expose the resulting fuse mount to the host. The exactdocker runoptions to do that might vary slightly between hosts. See, e.g. the discussion in this thread (https://github.com/moby/moby/issues/9448).- You also need to mount the host
/etc/passwdand/etc/groupfor fuse to work inside the container.
- You also need to mount the host
Here are some commands tested on an Ubuntu 18.04.3 host:
# config on host at ~/.config/rclone/rclone.conf
# data on host at ~/data
# add a remote interactively
docker run --rm -it \
--volume ~/.config/rclone:/config/rclone \
--user $(id -u):$(id -g) \
rclone/rclone \
config
# make sure the config is ok by listing the remotes
docker run --rm \
--volume ~/.config/rclone:/config/rclone \
--user $(id -u):$(id -g) \
rclone/rclone \
listremotes
# perform mount inside Docker container, expose result to host
mkdir -p ~/data/mount
docker run --rm \
--volume ~/.config/rclone:/config/rclone \
--volume ~/data:/data:shared \
--user $(id -u):$(id -g) \
--volume /etc/passwd:/etc/passwd:ro --volume /etc/group:/etc/group:ro \
--device /dev/fuse --cap-add SYS_ADMIN --security-opt apparmor:unconfined \
rclone/rclone \
mount dropbox:Photos /data/mount &
ls ~/data/mount
kill %1
๐ธ Snap installation ๐ธ
[IMAGE: Get it from the Snap Store (https://snapcraft.io/static/images/badges/en/snap-store-black.svg)] (https://snapcraft.io/rclone)
Make sure you have Snapd installed (https://snapcraft.io/docs/installing-snapd):
sudo snap install rclone
Due to the strict confinement of Snap, rclone snap cannot access the real /home/$USER/.config/rclone directory โ default config path is as below. ๐
- Default config directory:
/home/$USER/snap/rclone/current/.config/rclone
Note: Due to the strict confinement of Snap, the rclone mount feature is not supported. ๐
If mounting is wanted, either install a precompiled binary or enable the relevant option when installing from source.
Note that this is controlled by community maintainer (https://github.com/boukendesho/rclone-snap) not the rclone developers so it may be out of date. Its current version is as below.
[IMAGE: rclone (https://snapcraft.io/rclone/badge.svg)] (https://snapcraft.io/rclone)
๐ฅ Source installation ๐ฅ
Make sure you have git and Go (https://golang.org/) installed. Go version 1.26 or newer is required, the latest release is recommended. You can get it from your package manager, or download it from golang.org/dl (https://golang.org/dl/). Then you can run the following:
git clone https://github.com/rclone/rclone.git
cd rclone
go build
This will check out the rclone source in subfolder rclone, which you can later modify and send pull requests with. Then it will build the rclone executable in the same folder. As an initial check you can now run ./rclone version (.\rclone version on Windows). Iconic.
Note that on macOS and Windows the mount (https://rclone.org/commands/rclone_mount/) command will not be available unless you specify an additional build tag cmount. ๐ญ
go build -tags cmount
okay so this whole thing assumes you have a GCC compatible C compiler (GCC or Clang) chilling in your PATH, because it uses cgo (https://pkg.go.dev/cmd/cgo). But on Windows there's a plot twist bestie: the cgofuse (https://github.com/winfsp/cgofuse) library that the cmount implementation is based on also supports building without cgo (https://github.com/golang/go/wiki/WindowsDLLs) โ like, you just set the environment variable CGO_ENABLED to value 0 (that's static linking, periodt). That is literally how the official Windows release of rclone is being built, starting with version 1.59. And yes, it is still possible to build with cgo on Windows as well, by using the MinGW port of GCC, e.g. by installing it in an MSYS2 (https://www.msys2.org) distribution โ just make sure you install it in the classic mingw64 subsystem, because the ucrt64 version is not compatible, no cap.
Additionally, to build with mount on Windows, you must install the third party utility WinFsp (https://winfsp.dev/), with the "Developer" feature selected. If you're building with cgo, you must also set the environment variable CPATH pointing to the fuse include directory within the WinFsp installation (normally C:\Program Files (x86)\WinFsp\inc\fuse).
You may add arguments -ldflags -s to omit symbol table and debug information, making the executable file smaller, and -trimpath to remove references to local file system paths. The official rclone releases are built with both of these. Iconic behaviour honestly ๐
go build -trimpath -ldflags -s -tags cmount
If you want to customize the version string, as reported by the rclone version command, you can set one of the variables fs.Version, fs.VersionTag (to keep default suffix but customize the number), or fs.VersionSuffix (to keep default number but customize the suffix). This can be done from the build command, by adding to the -ldflags argument value as shown below.
go build -trimpath -ldflags "-s -X github.com/rclone/rclone/fs.Version=v9.9.9-test" -tags cmount
On Windows, the official executables also have the version information, as well as a file icon, embedded as binary resources. To get that with your own build you need to run the following command before the build command. It generates a Windows resource system object file, with extension .syso, e.g. resource_windows_amd64.syso, that will be automatically picked up by future build commands. Magic fr fr โจ
go run bin/resource_windows.go
The above command will generate a resource file containing version information based on the fs.Version variable in source at the time you run the command, which means if the value of this variable changes you need to re-run the command for it to be reflected in the version information. Also, if you override this version variable in the build command as described above, you need to do that also when generating the resource file, or else it will still use the value from the source. So like, keep them in sync bestie ๐
go run bin/resource_windows.go -version v9.9.9-test
Instead of executing the go build command directly, you can run it via the Makefile. The default target changes the version suffix from "-DEV" to "-beta" followed by additional commit details, embeds version information binary resources on Windows, and copies the resulting rclone executable into your GOPATH bin folder ($(go env GOPATH)/bin, which corresponds to ~/go/bin/rclone by default).
make
To include mount command on macOS and Windows with Makefile build:
make GOTAGS=cmount
There are other make targets that can be used for more advanced builds, such as cross-compiling for all supported os/architectures, and packaging results into release artifacts. See Makefile (https://github.com/rclone/rclone/blob/master/Makefile) and cross-compile.go (https://github.com/rclone/rclone/blob/master/bin/cross-compile.go) for details.
Another alternative method for source installation is to download the source, build and install rclone โ all in one operation, as a regular Go package. The source will be stored it in the Go module cache, and the resulting executable will be in your GOPATH bin folder ($(go env GOPATH)/bin, which corresponds to ~/go/bin/rclone by default). One command, zero drama ๐ซถ
go install github.com/rclone/rclone@latest
In some situations, rclone executable size might be too big for deployment in very restricted environments when all backends with large SDKs are included. To limit binary size unused backends can be commented out in backends/all/all.go and unused commands in cmd/all/all.go before building with go build or make. Declutter era ๐
Ansible installation ๐ง
This can be done with Stefan Weichinger's ansible role (https://github.com/stefangweichinger/ansible-rclone).
Instructions
git clone https://github.com/stefangweichinger/ansible-rclone.gitinto your local roles-directory- add the role to the hosts you want rclone installed to:
- hosts: rclone-hosts
roles:
- rclone
Portable installation ๐
As mentioned above (https://rclone.org/install/#quickstart), rclone is single executable (rclone, or rclone.exe on Windows) that you can download as a zip archive and extract into a location of your choosing. When executing different commands, it may create files in different locations, such as a configuration file and various temporary files. By default the locations for these are according to your operating system, e.g. configuration file in your user profile directory and temporary files in the standard temporary directory, but you can customize all of them, e.g. to make a completely self-contained, portable installation. Main character energy, honestly ๐
Run the config paths command (https://rclone.org/commands/rclone_config_paths/) to see the locations that rclone will use.
To override them set the corresponding options (as command-line arguments, or as environment variables (https://rclone.org/docs/#environment-variables)):
--configโ (https://rclone.org/docs/#config-string)--cache-dirโ (https://rclone.org/docs/#cache-dir-string)--temp-dirโ (https://rclone.org/docs/#temp-dir-string)
Autostart โฐ
After installing and configuring rclone, as described above, you are ready to use rclone as an interactive command line utility. If your goal is to perform periodic operations, such as a regular sync (https://rclone.org/commands/rclone_sync/), you will probably want to configure your rclone command in your operating system's scheduler. If you need to expose service-like features, such as remote control (https://rclone.org/rc/), GUI (https://rclone.org/gui/), serve (https://rclone.org/commands/rclone_serve/) or mount (https://rclone.org/commands/rclone_mount/), you will often want an rclone command always running in the background, and configuring it to run in a service infrastructure may be a better option. Below are some alternatives on how to achieve this on different operating systems.
NOTE: Before setting up autorun it is highly recommended that you have tested your command manually from a Command Prompt first. Please bestie, test it by hand first, I am begging ๐
Autostart on Windows ๐ช
The most relevant alternatives for autostart on Windows are:
- Run at user log on using the Startup folder
- Run at user log on, at system startup or at schedule using Task Scheduler
- Run at system startup using Windows service
Running in background ๐
Rclone is a console application, so if not starting from an existing Command Prompt, e.g. when starting rclone.exe from a shortcut, it will open a Command Prompt window. When configuring rclone to run from task scheduler and windows service you are able to set it to run hidden in background. From rclone version 1.54 you can also make it run hidden from anywhere by adding option --no-console (it may still flash briefly when the program starts). Since rclone normally writes information and any error messages to the console, you must redirect this to a file to be able to see it. Rclone has a built-in option --log-file for that. Sneaky invisible rclone, lowkey iconic ๐
Example command to run a sync in background:
c:\rclone\rclone.exe sync c:\files remote:/files --no-console --log-file c:\rclone\logs\sync_files.txt
User account ๐ค
As mentioned in the mount (https://rclone.org/commands/rclone_mount/) documentation, mounted drives created as Administrator are not visible to other accounts, not even the account that was elevated as Administrator. By running the mount command as the built-in SYSTEM user account, it will create drives accessible for everyone on the system. Both scheduled task and Windows service can be used to achieve this.
NOTE: Remember that when rclone runs as the SYSTEM user, the user profile that it sees will not be yours. This means that if you normally run rclone with configuration file in the default location, to be able to use the same configuration when running as the system user you must explicitly tell rclone where to find it with the--config(https://rclone.org/docs/#config-string) option, or else it will look in the system users profile path (C:\Windows\System32\config\systemprofile). To test your command manually from a Command Prompt, you can run it with the PsExec (https://docs.microsoft.com/en-us/sysinternals/downloads/psexec) utility from Microsoft's Sysinternals suite, which takes option-sto execute commands as the SYSTEM user.
Start from Startup folder ๐
To quickly execute an rclone command you can simply create a standard Windows Explorer shortcut for the complete rclone command you want to run. If you store this shortcut in the special "Startup" start-menu folder, Windows will automatically run it at login. To open this folder in Windows Explorer, enter path %APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup, or C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp if you want the command to start for every user that logs in.
This is the easiest approach to autostarting of rclone, but it offers no functionality to set it to run as different user, or to set conditions or actions on certain events. Setting up a scheduled task as described below will often give you better results. Easy mode now, upgrade later โจ
Start from Task Scheduler ๐
Task Scheduler is an administrative tool built into Windows, and it can be used to configure rclone to be started automatically in a highly configurable way, e.g. periodically on a schedule, on user log on, or at system startup. It can run be configured to run as the current user, or for a mount command that needs to be available to all users it can run as the SYSTEM user. For technical information, see Task Scheduler for developers (https://docs.microsoft.com/windows/win32/taskschd/task-scheduler-start-page).
Run as service โ๏ธ
For running rclone at system startup, you can create a Windows service that executes your rclone command, as an alternative to scheduled task configured to run at startup.
๐ฅ๏ธ Mount command built-in service integration ๐ฅ๏ธ
ok so for mount commands specifically, rclone has Windows service integration built right in, courtesy of the third-party WinFsp library it uses. Registering as a regular Windows service is easy peasy โ you literally just run the built-in PowerShell command New-Service (heads up: this needs administrative privileges, bestie, no way around it).
Here's an example PowerShell command that creates a Windows service for mounting some remote:/files as drive letter X:, for all users (the service will be running as the local system account):
New-Service -Name Rclone -BinaryPathName 'c:\rclone\rclone.exe mount remote:/files X: --config c:\rclone\config\rclone.conf --log-file c:\rclone\logs\mount.txt'
The WinFsp service infrastructure (https://github.com/billziss-gh/winfsp/wiki/WinFsp-Service-Architecture) supports incorporating services for file system implementations, such as rclone, into its own launcher service, as kind of "child services". The glow-up here? It also implements a network provider that integrates into Windows standard methods for managing network drives. This is currently not officially supported by Rclone, but with WinFsp version 2019.3 B2 / v1.5B2 or later it should be possible through path rewriting as described in #3340 (https://github.com/rclone/rclone/issues/3340).
๐งฐ Third-party service integration ๐งฐ
Wanna run any rclone command as a Windows service? There's the excellent third-party utility NSSM (http://nssm.cc), aka the "Non-Sucking Service Manager". It comes with some advanced features like adjusting process priority, defining process environment variables, redirecting anything written to stdout to a file, and customized response to different exit codes โ plus a GUI to configure literally everything from (although it can also be used from command line).
There are also several other alternatives. To mention one more, WinSW (https://github.com/winsw/winsw), "Windows Service Wrapper", is worth checking out. It requires .NET Framework, but it's preinstalled on newer versions of Windows, and it also provides alternative standalone distributions which include the necessary runtime (.NET 5). WinSW is a command-line only utility, where you have to manually create an XML file with the service configuration. This may be a drawback for some, but it can also be an advantage since it's easy to back up and reuse the configuration settings, without having to go through manual steps in a GUI. One thing to note: by default it does not restart the service on error, you have to explicitly enable this in the configuration file (via the "onfailure" parameter). ๐
๐ธ Autostart on Linux ๐ธ
โญ Start as a service โญ
If you want rclone to always run in the background โ super relevant for mount commands and stuff โ you can use systemd to set up rclone as a system or user service. Running as a system service ensures that it gets run at startup even if the user it's running as has no active session. Running rclone as a user service ensures that it only starts after the configured user has logged into the system.
๐ฐ๏ธ Run periodically from cron ๐ฐ๏ธ
Wanna run a periodic command, like a copy/sync? Set up a cron job, bestie. ez.
โจ Usage โจ
Rclone is a command line program to manage files on cloud storage. After downloading (https://rclone.org/downloads/) and installing, continue here to learn how to use it: initial configuration, what the basic syntax looks like, the various subcommands, the various options, and more. ๐ซถ
๐ Configure ๐
First things first: you'll need to configure rclone. Since object storage systems have quite complicated authentication, all that stuff is kept in a config file. (Peep the --config entry for how to find the config file and choose its location.)
The easiest way to make the config is to run rclone with the config option:
rclone config
See the following for detailed instructions for ๐
- 1Fichier (
https://rclone.org/fichier/) - Akamai Netstorage (
https://rclone.org/netstorage/) - Alias (
https://rclone.org/alias/) - Archive (
https://rclone.org/archive/) - Amazon S3 (
https://rclone.org/s3/) - Backblaze B2 (
https://rclone.org/b2/) - Box (
https://rclone.org/box/) - Chunker (
https://rclone.org/chunker/) - transparently splits large files for other remotes - Citrix ShareFile (
https://rclone.org/sharefile/) - Compress (
https://rclone.org/compress/) - Cloudinary (
https://rclone.org/cloudinary/) - Combine (
https://rclone.org/combine/) - Crypt (
https://rclone.org/crypt/) - to encrypt other remotes - DigitalOcean Spaces (
https://rclone.org/s3/#digitalocean-spaces) - Digi Storage (
https://rclone.org/koofr/#digi-storage) - Drime (
https://rclone.org/drime/) - Dropbox (
https://rclone.org/dropbox/) - Enterprise File Fabric (
https://rclone.org/filefabric/) - FileLu Cloud Storage (
https://rclone.org/filelu/) - Filen (
https://rclone.org/filen/) - Files.com (
https://rclone.org/filescom/) - FTP (
https://rclone.org/ftp/) - Gofile (
https://rclone.org/gofile/) - Google Cloud Storage (
https://rclone.org/googlecloudstorage/) - Google Drive (
https://rclone.org/drive/) - Google Photos (
https://rclone.org/googlephotos/) - Hasher (
https://rclone.org/hasher/) - to handle checksums for other remotes - HDFS (
https://rclone.org/hdfs/) - Hetzner Storage Box (
https://rclone.org/sftp/#hetzner-storage-box) - HiDrive (
https://rclone.org/hidrive/) - HTTP (
https://rclone.org/http/) - Huawei Drive (
https://rclone.org/huaweidrive/) - iCloud Drive (
https://rclone.org/iclouddrive/) - Internet Archive (
https://rclone.org/internetarchive/) - Internxt (
https://rclone.org/internxt/) - Jottacloud (
https://rclone.org/jottacloud/) - Koofr (
https://rclone.org/koofr/) - Linkbox (
https://rclone.org/linkbox/) - Mail.ru Cloud (
https://rclone.org/mailru/) - Mega (
https://rclone.org/mega/) - Memory (
https://rclone.org/memory/) - Microsoft Azure Blob Storage (
https://rclone.org/azureblob/) - Microsoft Azure Files Storage (
https://rclone.org/azurefiles/) - Microsoft OneDrive (
https://rclone.org/onedrive/) - OpenStack Swift / Rackspace Cloudfiles / Blomp Cloud Storage / Memset Memstore (
https://rclone.org/swift/) - OpenDrive (
https://rclone.org/opendrive/) - Oracle Object Storage (
https://rclone.org/oracleobjectstorage/) - Pcloud (
https://rclone.org/pcloud/) - PikPak (
https://rclone.org/pikpak/) - Pixeldrain (
https://rclone.org/pixeldrain/) - premiumize.me (
https://rclone.org/premiumizeme/) - put.io (
https://rclone.org/putio/) - Proton Drive (
https://rclone.org/protondrive/) - QingStor (
https://rclone.org/qingstor/) - Quatrix by Maytech (
https://rclone.org/quatrix/) - rsync.net (
https://rclone.org/sftp/#rsync-net) - Seafile (
https://rclone.org/seafile/) - SFTP (
https://rclone.org/sftp/) - Shade (
https://rclone.org/shade/) - Sia (
https://rclone.org/sia/) - SMB (
https://rclone.org/smb/) - Storj (
https://rclone.org/storj/) - SugarSync (
https://rclone.org/sugarsync/) - Union (
https://rclone.org/union/) - Uloz.to (
https://rclone.org/ulozto/) - WebDAV (
https://rclone.org/webdav/) - Yandex Disk (
https://rclone.org/yandex/) - Zoho WorkDrive (
https://rclone.org/zoho/) - The local filesystem (
https://rclone.org/local/)
๐ Basic syntax ๐
Rclone syncs a directory tree from one storage system to another. That's the whole vibe. ๐
Its syntax is like this:
rclone subcommand [options] <parameters> <parameters...>
A subcommand is an rclone operation, and it's required (e.g. sync, copy, ls).
An option is a single letter flag (e.g. -v) or a group of single letter flags (e.g. -Pv) or a long flag (e.g. --progress). No options are required, so breathe. Options can come after the subcommand, or in between parameters too, or on the end โ but only global options can be used before the subcommand. Anything after a -- option will not be interpreted as an option, so if you need to add a parameter which starts with a - then put a -- on its own first, eg
rclone lsf -- -directory-starting-with-dash
A parameter is usually a file path or rclone remote, eg /path/to/file or remote:path/to/file, but it can be other things โ the subcommand help will tell you what. ๐
Source and destination paths are specified by the name you gave the storage system in the config file, then the sub path, e.g. "drive:myfolder" to look at "myfolder" in Google drive.
You can define as many storage paths as you like in the config file. Go off. ๐
Please use the--interactive/-iflag while learning rclone to avoid accidental data loss. bestie pls, protect ur files ๐ญ
๐ Subcommands ๐
rclone uses a system of subcommands. For example:
rclone ls remote:path # lists a remote
rclone copy /local/path remote:path # copies /local/path to the remote
rclone sync --interactive /local/path remote:path # syncs /local/path to the remote
๐ rclone config
okay bestie, this is THE command, the one you'll be living in. Enter an interactive configuration session. โจ
๐ Synopsis ๐
Enter an interactive configuration session where you can setup new remotes and manage existing ones. You may also set or remove a password to protect your configuration. ๐ฆ
rclone config [flags]
๐ Options ๐
-h,--helpโ help for config
See the global flags page (https://rclone.org/flags/) for global options not listed here. ๐ธ
๐ซถ See Also ๐ซถ
rcloneโ Show help for rclone commands, flags and backends. โhttps://rclone.org/commands/rclone/rclone config createโ Create a new remote with name, type and options. โhttps://rclone.org/commands/rclone_config_create/rclone config deleteโ Delete an existing remote. โhttps://rclone.org/commands/rclone_config_delete/rclone config disconnectโ Disconnects user from remote โhttps://rclone.org/commands/rclone_config_disconnect/rclone config dumpโ Dump the config file as JSON. โhttps://rclone.org/commands/rclone_config_dump/rclone config editโ Enter an interactive configuration session. โhttps://rclone.org/commands/rclone_config_edit/rclone config encryptionโ set, remove and check the encryption for the config file โhttps://rclone.org/commands/rclone_config_encryption/rclone config fileโ Show path of configuration file in use. โhttps://rclone.org/commands/rclone_config_file/rclone config passwordโ Update password in an existing remote. โhttps://rclone.org/commands/rclone_config_password/rclone config pathsโ Show paths used for configuration, cache, temp etc. โhttps://rclone.org/commands/rclone_config_paths/rclone config providersโ List in JSON format all the providers and options. โhttps://rclone.org/commands/rclone_config_providers/rclone config reconnectโ Re-authenticates user with remote. โhttps://rclone.org/commands/rclone_config_reconnect/rclone config redactedโ Print redacted (decrypted) config file, or the redacted config for a single remote. โhttps://rclone.org/commands/rclone_config_redacted/rclone config showโ Print (decrypted) config file, or the config for a single remote. โhttps://rclone.org/commands/rclone_config_show/rclone config stringโ Print connection string for a single remote. โhttps://rclone.org/commands/rclone_config_string/rclone config touchโ Ensure configuration file exists. โhttps://rclone.org/commands/rclone_config_touch/rclone config unsetโ Unset options in an existing remote. โhttps://rclone.org/commands/rclone_config_unset/rclone config updateโ Update options in an existing remote. โhttps://rclone.org/commands/rclone_config_update/rclone config userinfoโ Prints info about logged in user of remote. โhttps://rclone.org/commands/rclone_config_userinfo/
๐ฆ rclone copy
Copy files from source to dest, skipping identical files. lowkey the daily driver fr fr ๐
โจ Synopsis โจ
Copy the source to the destination. Does not transfer files that are identical on source and destination, testing by size and modification time or MD5SUM. Doesn't delete files from the destination. If you want to also delete files from destination, to make it match source, use the sync (https://rclone.org/commands/rclone_sync/) command instead. ๐ค
Note that it is always the contents of the directory that is synced, not the directory itself. So when source:path is a directory, it's the contents of source:path that are copied, not the directory name and contents. read that twice bestie, it matters. ๐
To copy single files, use the copyto (https://rclone.org/commands/rclone_copyto/) command instead.
If dest:path doesn't exist, it is created and the source:path contents go there. โจ
For example
rclone copy source:sourcepath dest:destpath
Let's say there are two files in sourcepath
sourcepath/one.txt
sourcepath/two.txt
This copies them to
destpath/one.txt
destpath/two.txt
Not to
destpath/sourcepath/one.txt
destpath/sourcepath/two.txt
If you are familiar with rsync, rclone always works as if you had written a trailing / โ meaning "copy the contents of this directory". This applies to all commands and whether you are talking about the source or destination. iconic behaviour, no notes. ๐
See the --no-traverse (https://rclone.org/docs/#no-traverse) option for controlling whether rclone lists the destination directory or not. Supplying this option when copying a small number of files into a large destination can speed transfers up greatly. ๐
For example, if you have many files in /path/to/src but only a few of them change every day, you can copy all the files which have changed recently very efficiently like this:
rclone copy --max-age 24h --no-traverse /path/to/src remote:
Rclone will sync the modification times of files and directories if the backend supports it. If metadata syncing is required then use the --metadata flag. ๐ฐ๏ธ
Note that the modification time and metadata for the root directory will not be synced. See issue #7652 (https://github.com/rclone/rclone/issues/7652) for more info.
Note: Use the -P/--progress flag to view real-time transfer statistics. ๐
Note: Use the --dry-run or the --interactive/-i flag to test without copying anything. ๐
๐ชต Logger Flags ๐ชต
The --differ, --missing-on-dst, --missing-on-src, --match and --error flags write paths, one per line, to the file name (or stdout if it is -) supplied. What they write is described in the help below. For example --differ will write all paths which are present on both the source and destination but different.
The --combined flag will write a file (or stdout) which contains all file paths with a symbol and then a space and then the path to tell you what happened to it. These are reminiscent of diff files.
= pathmeans path was found in source and destination and was identical- pathmeans path was missing on the source, so only in the destination+ pathmeans path was missing on the destination, so only in the source* pathmeans path was present in source and destination but different.! pathmeans there was an error reading or hashing the source or dest.
The --dest-after flag writes a list file using the same format flags as lsf (https://rclone.org/commands/rclone_lsf/#synopsis) (including customizable options for hash, modtime, etc. (https://rclone.org/commands/rclone_lsf/#synopsis)) Conceptually it is similar to rsync's --itemize-changes, but not identical โ it should output an accurate list of what will be on the destination after the command is finished. ๐ฎ
When the --no-traverse flag is set, all logs involving files that exist only on the destination will be incomplete or completely missing. ๐
Note that these logger flags have a few limitations, and certain scenarios are not currently supported:
--max-duration/CutoffModeHard--compare-dest/--copy-dest- server-side moves of an entire dir at once
- High-level retries, because there would be duplicates (use
--retries 1to disable) - Possibly some unusual error scenarios
Note also that each file is logged during execution, as opposed to after, so it is most useful as a predictor of what SHOULD happen to each file (which may or may not match what actually DID). ๐ซ
rclone copy source:path dest:path [flags]
๐ Options ๐
--absoluteโ Put a leading/in front of path names--combinedstring โ Make a combined report of changes to this file--create-empty-src-dirsโ Create empty source dirs on destination after copy--csvโ Output in CSV format--dest-afterstring โ Report all files that exist on the dest post-sync--differstring โ Report all non-matching files to this file-d,--dir-slashโ Append a slash to directory names (defaulttrue)--dirs-onlyโ Only list directories--errorstring โ Report all files with errors (hashing or reading) to this file--files-onlyโ Only list files (defaulttrue)-F,--formatstring โ Output format - see lsf help for details (default"p")--hashh โ Use this hash whenhis used in the formatMD5|SHA-1|DropboxHash(default"md5")-h,--helpโ help for copy--matchstring โ Report all matching files to this file--missing-on-dststring โ Report all files missing from the destination to this file--missing-on-srcstring โ Report all files missing from the source to this file-s,--separatorstring โ Separator for the items in the format (default";")-t,--timeformatstring โ Specify a custom time format - see docs for details (default:2006-01-02 15:04:05)
Options shared with other commands are described next. See the global flags page (https://rclone.org/flags/) for global options not listed here. ๐
๐ธ Copy Options ๐ธ
Flags for anything which can copy a file
--check-firstโ does literally all the checks before it even thinks about starting transfers โจ-c,--checksumโ peeps for changes using size & checksum (or if checksums aren't a thing, it falls back to size only, ngl)--compare-deststringArray โ toss in extra server-side paths so they get compared too--copy-deststringArray โ it's giving--compare-destbut it also copies files from those paths into the destination ๐--cutoff-modeHARD|SOFT|CAUTIOUS โ the mode for when transfers get stopped after hitting the max transfer limit, and your choices are HARD|SOFT|CAUTIOUS (default HARD)--ignore-case-syncโ ignore case when synchronizing--ignore-checksumโ skips the post-copy checksum check, no cap--ignore-existingโ skips every file that already exists on the destination--ignore-sizeโ pretend size doesn't matter when skipping, use modtime or checksum instead-I,--ignore-timesโ does NOT skip stuff that matches on size and time โ it transfers everything unconditionally ๐ซถ--immutableโ do not modify files, and if existing files have been modified it just fails--inplaceโ downloads straight into the destination file instead of the whole atomic download-to-temp-then-rename thing-l,--linksโ translates symlinks to/from regular files, using a.rclonelinkextension--max-backlogint โ max number of objects chilling in the sync or check backlog (default 10000)--max-durationDuration โ the maximum duration rclone will transfer data for (default 0s)--max-transferSizeSuffix โ maximum size of data to transfer (default off)-M,--metadataโ if you set it, metadata gets preserved when copying objects ๐--modify-windowDuration โ max time diff that still counts as "same" (default 1ns)--multi-thread-chunk-sizeSizeSuffix โ chunk size for multi-thread downloads/uploads, unless the filesystem says otherwise (default 64Mi)--multi-thread-cutoffSizeSuffix โ files bigger than this get multi-thread downloads (default 256Mi)--multi-thread-streamsint โ how many streams multi-thread downloads get (default 4)--multi-thread-write-buffer-sizeSizeSuffix โ the in-memory buffer size for writing while in multi-thread mode (default 128Ki)--name-transformstringArray โ transform paths during the copy process--no-check-destโ don't check the destination at all, just copy regardless--no-traverseโ don't traverse the destination file system on copy--no-update-dir-modtimeโ don't update directory modification times--no-update-modtimeโ if the files are identical, don't touch the destination modtime--order-bystring โ instructions on how to order the transfers, like'size,descending'--partial-suffixstring โ adds partial-suffix to the temporary file name when--inplaceis not used (default".partial")--refresh-timesโ refreshes the modtime of remote files--server-side-across-configsโ lets server-side operations (e.g. copy) work across different configs--size-onlyโ skips based on size only, not modtime or checksum--streaming-upload-cutoffSizeSuffix โ the cutoff for switching to chunked upload when the file size is unknown; the upload starts after it hits the cutoff or when the file ends (default 100Ki)-u,--updateโ skips files that are newer on the destination
โจ Important Options โจ
Important flags that are lowkey useful for most commands ๐
-n,--dry-runโ does a trial run with no permanent changes-i,--interactiveโ turns on interactive mode-v,--verbosecount โ prints lots more stuff (repeat it for even more)
๐ธ Filter Options ๐ธ
Flags for filtering directory listings ๐
--delete-excludedโ deletes files on the destination that were excluded from the sync--excludestringArray โ excludes files matching the pattern--exclude-fromstringArray โ reads file exclude patterns from a file (use-to read from stdin)--exclude-if-presentstringArray โ excludes directories if that filename is present--files-fromstringArray โ reads the list of source-file names from a file (use-to read from stdin)--files-from-rawstringArray โ reads the list of source-file names from a file without any processing of the lines (use-to read from stdin)--files-from0stringArray โ reads the list of source-file names from a file using NUL as the separator (use-to read from stdin)-f,--filterstringArray โ adds a file filtering rule--filter-fromstringArray โ reads file filtering patterns from a file (use-to read from stdin)--hash-filterstring โ partitions filenames by hash as k/n or randomly as @/n--ignore-caseโ ignores case in filters (so it's case insensitive)--includestringArray โ includes files matching the pattern--include-fromstringArray โ reads file include patterns from a file (use-to read from stdin)--max-ageDuration โ only transfers files younger than this, insor with the suffix ms|s|m|h|d|w|M|y (default off)--max-depthint โ if you set it, it limits the recursion depth to this (default -1)--max-sizeSizeSuffix โ only transfers files smaller than this, in KiB or with the suffix B|K|M|G|T|P (default off)--metadata-excludestringArray โ excludes metadatas matching the pattern--metadata-exclude-fromstringArray โ reads metadata exclude patterns from a file (use-to read from stdin)--metadata-filterstringArray โ adds a metadata filtering rule--metadata-filter-fromstringArray โ reads metadata filtering patterns from a file (use-to read from stdin)--metadata-includestringArray โ includes metadatas matching the pattern--metadata-include-fromstringArray โ reads metadata include patterns from a file (use-to read from stdin)--min-ageDuration โ only transfers files older than this, insor with the suffix ms|s|m|h|d|w|M|y (default off)--min-sizeSizeSuffix โ only transfers files bigger than this, in KiB or with the suffix B|K|M|G|T|P (default off)
๐ฆ Listing Options ๐ฆ
Flags for listing directories, bestie ๐
--default-timeTime โ the time to show if the modtime is unknown for files and directories (default 2000-01-01T00:00:00Z)--fast-listโ uses a recursive list if it's available; eats more memory but does fewer transactions
โญ See Also โญ
rclone(https://rclone.org/commands/rclone/) โ Show help for rclone commands, flags and backends.
๐ rclone sync ๐
Make source and dest identical, modifying destination only. Periodt. ๐
๐ Synopsis ๐
Syncs the source to the destination, and it only changes the destination. It does not transfer files that are identical on source and destination โ it tests that with size and modification time, or MD5SUM. The destination gets updated to match the source, and yes, that includes deleting files if it has to (except duplicate objects, more on that below ๐). If you do not want files deleted from the destination, use the copy (https://rclone.org/commands/rclone_copy/) command instead.
Important: because this can cause data loss, test it first with the--dry-runor the--interactive/-iflag. Not me being dramatic, this is real ๐ญ
rclone sync --interactive SOURCE remote:DESTINATION
Files in the destination won't get deleted if there were any errors at any point. Duplicate objects (files with the same name, on those providers that support it) are not yet handled. Files that are excluded won't be deleted unless --delete-excluded is used. Symlinks won't be transferred or deleted from local file systems unless --links is used.
It is always the contents of the directory that get synced, not the directory itself. So when source:path is a directory, it's the contents of source:path that get copied, not the directory name and contents. Peep the extended explanation in the copy (https://rclone.org/commands/rclone_copy/) command if you're unsure ๐ซถ
If dest:path doesn't exist, it gets created and the source:path contents go there.
It is not possible to sync overlapping remotes. But โ plot twist โ you may exclude the destination from the sync with a filter rule, or by putting an exclude-if-present file inside the destination directory and syncing to a destination that's inside the source directory. Slay.
Rclone will sync the modification times of files and directories if the backend supports it. And if you need metadata syncing, use the --metadata flag.
Note that the modification time and metadata for the root directory will not be synced. See <https://github.com/rclone/rclone/issues/7652> for more info.
Note: use the-P/--progressflag to view real-time transfer statistics ๐
Note: use therclone dedupecommand to deal with"Duplicate object/directory found in source/destination - ignoring"errors. See this forum post (https://forum.rclone.org/t/sync-not-clearing-duplicates/14372) for more info.
๐ Logger Flags ๐
The --differ, --missing-on-dst, --missing-on-src, --match and --error flags write paths, one per line, to the file name you supply (or to stdout if it's -). What they write is described in the help below. For example, --differ will write all paths which are present on both the source and destination but different.
The --combined flag will write a file (or stdout) which contains all the file paths with a symbol, then a space, then the path, to tell you what happened to it. These are giving total diff file energy ๐
= pathmeans path was found in source and destination and was identical- pathmeans path was missing on the source, so it only exists in the destination+ pathmeans path was missing on the destination, so it only exists in the source* pathmeans path was present in source and destination but different! pathmeans there was an error reading or hashing the source or dest ๐
The --dest-after flag writes a list file, and it uses the exact same format flags as lsf (including all the customizable options for hash, modtime, etc. โ go peek at the lsf synopsis if you wanna know the vibes). Conceptually it's giving rsync's --itemize-changes, but bestie it is not identical โ what it actually does is output an accurate list of what's gonna be sitting on the destination once the command finishes. ๐
When you've got the --no-traverse flag set, literally all logs involving files that exist only on the destination will be incomplete or completely missing. So likeโฆ keep that in mind. ๐
Also, heads up โ these logger flags come with a few limitations, and certain scenarios are just not supported right now:
--max-duration/CutoffModeHard--compare-dest/--copy-dest- server-side moves of an entire dir at once
- High-level retries, because there would be duplicates (use
--retries 1to disable) ๐ - Possibly some unusual error scenarios
And one more thing: each file is logged during execution, not after. So it's most useful as a predictor of what SHOULD happen to each file โ which, fair warning, may or may not match what actually DID. ๐ญ
rclone sync source:path dest:path [flags]
โจ Options โจ
--absoluteโ Put a leading/in front of path names--combinedstring โ Make a combined report of changes to this file--create-empty-src-dirsโ Create empty source dirs on destination after sync--csvโ Output in CSV format--dest-afterstring โ Report all files that exist on the dest post-sync--differstring โ Report all non-matching files to this file-d,--dir-slashโ Append a slash to directory names (defaulttrue)--dirs-onlyโ Only list directories--errorstring โ Report all files with errors (hashing or reading) to this file--files-onlyโ Only list files (defaulttrue)-F,--formatstring โ Output format - seelsfhelp for details (default"p")--hashh โ Use this hash whenhis used in the formatMD5|SHA-1|DropboxHash(default"md5")-h,--helpโ help for sync--matchstring โ Report all matching files to this file--missing-on-dststring โ Report all files missing from the destination to this file--missing-on-srcstring โ Report all files missing from the source to this file-s,--separatorstring โ Separator for the items in the format (default";")-t,--timeformatstring โ Specify a custom time format - see docs for details (default:2006-01-02 15:04:05)
Options shared with other commands are described next. And for global options that aren't listed here, go check the global flags page โ they live over there. ๐ซถ
๐ Copy Options ๐
Flags for anything which can copy a file
--check-firstโ Do all the checks before starting transfers-c,--checksumโ Check for changes with size & checksum (if available, or fallback to size only)--compare-deststringArray โ Include additional server-side paths during comparison--copy-deststringArray โ Implies--compare-destbut also copies files from paths into destination--cutoff-modeHARD|SOFT|CAUTIOUS โ Mode to stop transfers when reaching the max transfer limitHARD|SOFT|CAUTIOUS(defaultHARD)--ignore-case-syncโ Ignore case when synchronizing--ignore-checksumโ Skip post copy check of checksums--ignore-existingโ Skip all files that exist on destination--ignore-sizeโ Ignore size when skipping use modtime or checksum-I,--ignore-timesโ Don't skip items that match size and time - transfer all unconditionally--immutableโ Do not modify files, fail if existing files have been modified--inplaceโ Download directly to destination file instead of atomic download to temp/rename-l,--linksโ Translate symlinks to/from regular files with a.rclonelinkextension--max-backlogint โ Maximum number of objects in sync or check backlog (default10000)--max-durationDuration โ Maximum duration rclone will transfer data for (default0s)--max-transferSizeSuffix โ Maximum size of data to transfer (defaultoff)-M,--metadataโ If set, preserve metadata when copying objects--modify-windowDuration โ Max time diff to be considered the same (default1ns)--multi-thread-chunk-sizeSizeSuffix โ Chunk size for multi-thread downloads / uploads, if not set by filesystem (default64Mi)--multi-thread-cutoffSizeSuffix โ Use multi-thread downloads for files above this size (default256Mi)--multi-thread-streamsint โ Number of streams to use for multi-thread downloads (default4)--multi-thread-write-buffer-sizeSizeSuffix โ In memory buffer size for writing when in multi-thread mode (default128Ki)--name-transformstringArray โ Transform paths during the copy process--no-check-destโ Don't check the destination, copy regardless--no-traverseโ Don't traverse destination file system on copy--no-update-dir-modtimeโ Don't update directory modification times--no-update-modtimeโ Don't update destination modtime if files identical--order-bystring โ Instructions on how to order the transfers, e.g.'size,descending'--partial-suffixstring โ Addpartial-suffixto temporary file name when--inplaceis not used (default".partial")--refresh-timesโ Refresh the modtime of remote files--server-side-across-configsโ Allow server-side operations (e.g. copy) to work across different configs--size-onlyโ Skip based on size only, not modtime or checksum--streaming-upload-cutoffSizeSuffix โ Cutoff for switching to chunked upload if file size is unknown, upload starts after reaching cutoff or when file ends (default100Ki)-u,--updateโ Skip files that are newer on the destination
๐ Sync Options ๐
Flags used for sync commands
--backup-dirstring โ Make backups into hierarchy based inDIR--delete-afterโ When synchronizing, delete files on destination after transferring (default)--delete-beforeโ When synchronizing, delete files on destination before transferring--delete-duringโ When synchronizing, delete files during transfer--fix-caseโ Force rename of case insensitive dest to match source--ignore-errorsโ Delete even if there are I/O errors--list-cutoffint โ To save memory, sort directory listings on disk above this threshold (default1000000)--max-deleteint โ When synchronizing, limit the number of deletes (default-1)--max-delete-sizeSizeSuffix โ When synchronizing, limit the total size of deletes (defaultoff)--suffixstring โ Suffix to add to changed files--suffix-keep-extensionโ Preserve the extension when using--suffix--track-renamesโ When synchronizing, track file renames and do a server-side move if possible--track-renames-strategystring โ Strategies to use when synchronizing using track-renameshash|modtime|leaf(default"hash")
๐ Important Options ๐
Important flags useful for most commands
-n,--dry-runโ Do a trial run with no permanent changes-i,--interactiveโ Enable interactive mode-v,--verbosecount โ Print lots more stuff (repeat for more)
๐ฆ Filter Options ๐ฆ
Flags for filtering directory listings
okay bestie, back in the filter flags, and I'm giving every single one of them their moment ๐
--delete-excludedโ deletes files on dest that got excluded from the sync. yes it does exactly what it says, it means it ๐ฅ--exclude stringArrayโ exclude files that match your pattern ๐--exclude-from stringArrayโ read your file exclude patterns from a file (pass-to read from stdin) ๐--exclude-if-present stringArrayโ exclude a directory entirely if a file with this filename is present in it ๐ซ--files-from stringArrayโ read your list of source-file names from a file (use-to read from stdin) ๐--files-from-raw stringArrayโ read that same list of source-file names from a file, but with zero processing of the lines (use-to read from stdin) ๐ฅฉ--files-from0 stringArrayโ read the list of source-file names from a file using NUL as the separator (use-to read from stdin) ๐ซง-f,--filter stringArrayโ drop in one single file filtering rule, that's it, that's the flag โจ--filter-from stringArrayโ read your file filtering patterns from a file (use-to read from stdin) ๐๏ธ--hash-filter stringโ partition filenames by hash usingk/n, or randomly with@/n๐ฒ--ignore-caseโ ignore case in filters, so everything is case insensitive now ๐--include stringArrayโ include the files matching your pattern ๐--include-from stringArrayโ read your file include patterns from a file (use-to read from stdin) ๐ธ--max-age Durationโ only transfer files younger than this, insor with the suffixms|s|m|h|d|w|M|y(default off) โฐ--max-depth intโ if you set it, it limits the recursion depth right there (default-1) ๐ช--max-size SizeSuffixโ only transfer files smaller than this, in KiB or with aB|K|M|G|T|Psuffix (default off) ๐--metadata-exclude stringArrayโ exclude metadatas matching your pattern ๐ท๏ธ--metadata-exclude-from stringArrayโ read your metadata exclude patterns from a file (use-to read from stdin) ๐--metadata-filter stringArrayโ add a metadata filtering rule โจ--metadata-filter-from stringArrayโ read metadata filtering patterns from a file (use-to read from stdin) ๐--metadata-include stringArrayโ include the metadatas matching your pattern ๐--metadata-include-from stringArrayโ read metadata include patterns from a file (use-to read from stdin) ๐๏ธ--min-age Durationโ only transfer files older than this, insor with the suffixms|s|m|h|d|w|M|y(default off) ๐ต--min-size SizeSuffixโ only transfer files bigger than this, in KiB or with aB|K|M|G|T|Psuffix (default off) ๐
and that's the whole filter squad, not one skipped, no cap ๐ซถ
๐ฆ Listing Options ๐ฆ
Flags for listing directories, obviously ๐๏ธ
--default-time Timeโ the time to show if the modtime is unknown for files and directories (default2000-01-01T00:00:00Z) ๐ฐ๏ธ--fast-listโ use the recursive list if it's available; it gobbles more memory but makes fewer transactions, a classic tradeoff queen ๐
๐ See Also ๐
rclone(https://rclone.org/commands/rclone/) โ show help for rclone commands, flags and backends ๐
๐ rclone move ๐
Move files from source to dest. yes, the moving one, it's giving relocation era ๐
โจ Synopsis โจ
Moves the contents of the source directory to the destination directory. And heads up bestie: rclone will error if the source and destination overlap and the remote does not support a server-side directory move operation. not a vibe, but that's the rule ๐ค
To move single files, use the moveto (https://rclone.org/commands/rclone_moveto/) command instead. that's its whole personality ๐ซถ
If no filters are in use and if possible, this will server-side move source:path into dest:path. And after this, source:path will no longer exist. it's gone, ghosted, blocked ๐ป
Otherwise, for each file in source:path selected by the filters (if any), this will move it into dest:path. If possible a server-side move will be used, otherwise it will copy it (server-side if possible) into dest:path and then delete the original (if there were no errors on copy) in source:path. copy first, delete only if the copy went clean, that's the safe girl behaviour ๐
If you want to delete the empty source directories after the move, use the --delete-empty-src-dirs flag ๐งน
See the --no-traverse (https://rclone.org/docs/#no-traverse) option for controlling whether rclone lists the destination directory or not. Supplying this option when you're moving a small number of files into a large destination can speed transfers up greatly ๐
Rclone will sync the modification times of files and directories if the backend supports it. If metadata syncing is required then use the --metadata flag ๐ท๏ธ
Note that the modification time and metadata for the root directory will not be synced. see https://github.com/rclone/rclone/issues/7652 for more info ๐ซ
Important: since this can cause data loss, test first with the--dry-runor the--interactive/-iflag. bestie please, dry run first, I'm begging ๐
Note: use the -P/--progress flag to view real-time transfer statistics ๐
๐ Logger Flags ๐
The --differ, --missing-on-dst, --missing-on-src, --match and --error flags write paths, one per line, to the file name you supply (or to stdout if it's -). What they write is described in the help below. So for example, --differ will write all paths which are present on both the source and destination but different ๐
The --combined flag will write a file (or stdout) which contains all the file paths with a symbol, then a space, then the path, telling you what happened to it. these are giving diff files โจ
= pathmeans path was found in source and destination and was identical- pathmeans path was missing on the source, so only in the destination+ pathmeans path was missing on the destination, so only in the source* pathmeans path was present in source and destination but different.! pathmeans there was an error reading or hashing the source or dest.
The --dest-after flag writes a list file using the same format flags as lsf (https://rclone.org/commands/rclone_lsf/#synopsis) (including customizable options for hash, modtime, etc. (https://rclone.org/commands/rclone_lsf/#synopsis)). Conceptually it is similar to rsync's --itemize-changes, but not identical โ it should output an accurate list of what will be on the destination after the command is finished ๐ฎ
When the --no-traverse flag is set, all logs involving files that exist only on the destination will be incomplete or completely missing. so like. good luck with that ๐
Note also that these logger flags have a few limitations, and certain scenarios are not currently supported:
--max-duration/CutoffModeHard--compare-dest/--copy-dest- server-side moves of an entire dir at once
- High-level retries, because there would be duplicates (use
--retries 1to disable) - Possibly some unusual error scenarios
And note also that each file is logged during execution, as opposed to after, so it is most useful as a predictor of what SHOULD happen to each file (which may or may not match what actually DID). it's a fortune teller, not a receipt ๐ญ
rclone move source:path dest:path [flags]
๐ ๏ธ Options ๐ ๏ธ
--absoluteโ put a leading/in front of path names โ--combined stringโ make a combined report of changes to this file ๐--create-empty-src-dirsโ create empty source dirs on destination after move ๐๏ธ--csvโ output in CSV format ๐--delete-empty-src-dirsโ delete empty source dirs after move ๐งน--dest-after stringโ report all files that exist on the dest post-sync ๐ฎ--differ stringโ report all non-matching files to this file ๐-d,--dir-slashโ append a slash to directory names (defaulttrue) ๐ซ--dirs-onlyโ only list directories ๐--error stringโ report all files with errors (hashing or reading) to this file ๐จ--files-onlyโ only list files (defaulttrue) ๐-F,--format stringโ output format, see lsf help for details (default"p") ๐จ--hash hโ use this hash whenhis used in the formatMD5|SHA-1|DropboxHash(default"md5") #๏ธโฃ-h,--helpโ help for move ๐--match stringโ report all matching files to this file ๐--missing-on-dst stringโ report all files missing from the destination to this file ๐ณ๏ธ--missing-on-src stringโ report all files missing from the source to this file ๐ณ๏ธ-s,--separator stringโ separator for the items in the format (default";") โ๏ธ-t,--timeformat stringโ specify a custom time format, see docs for details (default:2006-01-02 15:04:05) ๐ฐ๏ธ
Options shared with other commands are described next. See the global flags page (https://rclone.org/flags/) for global options not listed here. ๐
๐ฆ Copy Options ๐ฆ
Flags for anything which can copy a file ๐ซถ
--check-firstโ do all the checks before you start any transfers, bestie. vibe check first, transfer later. ๐-c,--checksumโ check for changes using size and checksum, if the backend has one; if not, it falls back to size only. size & checksum, or size only as the fallback. โจ--compare-dest stringArrayโ include additional server-side paths during comparison. extra server-side paths for the compare step. ๐ฆ--copy-dest stringArrayโ this implies--compare-destbut also copies files from those paths into the destination. compare plus copy from extra paths. ๐--cutoff-mode HARD|SOFT|CAUTIOUSโ mode to stop transfers when reaching the max transfer limit:HARD,SOFT, orCAUTIOUS(defaultHARD). pick your stopping vibe. ๐--ignore-case-syncโ ignore case when synchronizing. case? never heard of her. ๐--ignore-checksumโ skip post copy check of checksums. no checksum check after the copy. ๐--ignore-existingโ skip all files that exist on destination. if itโs already there, leave it alone. โจ--ignore-sizeโ ignore size when skipping; use modtime or checksum instead. size doesnโt count for the skip decision. ๐ฆ-I,--ignore-timesโ donโt skip items that match size and time โ transfer all unconditionally. transfer everything, no skips, periodt. ๐ฅ--immutableโ do not modify files, fail if existing files have been modified. do not touch, or itโs a whole fail. ๐--inplaceโ download directly to destination file instead of atomic download to temp/rename. straight to the destination, no temp-file-and-rename drama. ๐-l,--linksโ translate symlinks to/from regular files with a.rclonelinkextension. symlink translation with that exact extension. ๐ง--max-backlog intโ maximum number of objects in sync or check backlog (default10000). cap that backlog, bestie. ๐ธ--max-duration Durationโ maximum duration rclone will transfer data for (default0s). time limit on the transferring. โณ--max-transfer SizeSuffixโ maximum size of data to transfer (defaultoff). size cap for the whole transfer. ๐-M,--metadataโ if set, preserve metadata when copying objects. keep the metadata, no cap. โจ--modify-window Durationโ max time diff to be considered the same (default1ns). tiny time difference still counts as same. ๐ฆ--multi-thread-chunk-size SizeSuffixโ chunk size for multi-thread downloads / uploads, if not set by filesystem (default64Mi). chunk size unless the filesystem says otherwise. ๐--multi-thread-cutoff SizeSuffixโ use multi-thread downloads for files above this size (default256Mi). bigger than this? multi-thread time. ๐ฅ--multi-thread-streams intโ number of streams to use for multi-thread downloads (default4). four streams by default, slay. ๐--multi-thread-write-buffer-size SizeSuffixโ in memory buffer size for writing when in multi-thread mode (default128Ki). in-memory write buffer for multi-thread mode. ๐--name-transform stringArrayโ transform paths during the copy process. rename/reshape paths as they copy. โจ--no-check-destโ donโt check the destination, copy regardless. no destination check, just copy. ๐--no-traverseโ donโt traverse destination file system on copy. skip walking the destination on copy. ๐ฆ--no-update-dir-modtimeโ donโt update directory modification times. leave directory modtimes alone. ๐--no-update-modtimeโ donโt update destination modtime if files identical. identical files? donโt touch the modtime. โจ--order-by stringโ instructions on how to order the transfers, e.g.'size,descending'. tell rclone what order to transfer in. ๐ฅ--partial-suffix stringโ add partial-suffix to temporary file name when--inplaceis not used (default".partial"). the temp file gets this suffix. ๐--refresh-timesโ refresh the modtime of remote files. update those remote modtimes. ๐ฆ--server-side-across-configsโ allow server-side operations (e.g. copy) to work across different configs. server-side copy across configs? iconic. ๐--size-onlyโ skip based on size only, not modtime or checksum. size only, nothing else. ๐--streaming-upload-cutoff SizeSuffixโ cutoff for switching to chunked upload if file size is unknown, upload starts after reaching cutoff or when file ends (default100Ki). unknown size? switch to chunked upload at this cutoff. โจ-u,--updateโ skip files that are newer on the destination. newer on dest? skip it. ๐ฆ
โจ Important Options โจ
Important flags useful for most commands โ bestie, these are the everyday icons. ๐
-n,--dry-runโ do a trial run with no permanent changes. pretend mode, no real changes. ๐-i,--interactiveโ enable interactive mode. it asks you stuff as it goes. ๐-v,--verbose countโ print lots more stuff (repeat for more). more-v, more tea. โ
โจ Filter Options โจ
Flags for filtering directory listings โ your little filter besties. ๐
--delete-excludedโ delete files on dest excluded from sync. excluded on dest? delete them. ๐--exclude stringArrayโ exclude files matching pattern. bye, matching files. ๐--exclude-from stringArrayโ read file exclude patterns from file (use-to read from stdin). exclude patterns from a file, or stdin with-. ๐ฆ--exclude-if-present stringArrayโ exclude directories if filename is present. if that filename is there, skip the whole directory. ๐ง--files-from stringArrayโ read list of source-file names from file (use-to read from stdin). source file list, straight from a file. โจ--files-from-raw stringArrayโ read list of source-file names from file without any processing of lines (use-to read from stdin). raw lines, no processing. ๐--files-from0 stringArrayโ read list of source-file names from file using NUL as separator (use-to read from stdin). NUL-separated source file list. ๐-f,--filter stringArrayโ add a file filtering rule. one more filter rule. ๐--filter-from stringArrayโ read file filtering patterns from a file (use-to read from stdin). filter patterns from a file, or stdin. ๐ฆ--hash-filter stringโ partition filenames by hashk/nor randomly@/n. hash partition,k/nor random@/n. โจ--ignore-caseโ ignore case in filters (case insensitive). filters donโt care about case. ๐--include stringArrayโ include files matching pattern. only these matching files get in. ๐--include-from stringArrayโ read file include patterns from file (use-to read from stdin). include patterns from a file, or stdin. ๐ฆ--max-age Durationโ only transfer files younger than this in s or suffixms|s|m|h|d|w|M|y(defaultoff). too old? not transferring. โณ--max-depth intโ if set limits the recursion depth to this (default-1). cap how deep recursion goes. ๐--max-size SizeSuffixโ only transfer files smaller than this in KiB or suffixB|K|M|G|T|P(defaultoff). too big? not transferring. ๐--metadata-exclude stringArrayโ exclude metadatas matching pattern. metadata matching this pattern gets excluded. ๐ฆ--metadata-exclude-from stringArrayโ read metadata exclude patterns from file (use-to read from stdin). metadata exclude patterns from a file. โจ--metadata-filter stringArrayโ add a metadata filtering rule. one more metadata filter rule. ๐--metadata-filter-from stringArrayโ read metadata filtering patterns from a file (use-to read from stdin). metadata filter patterns from a file. ๐--metadata-include stringArrayโ include metadatas matching pattern. include metadata matching this pattern. ๐--metadata-include-from stringArrayโ read metadata include patterns from file (use-to read from stdin). metadata include patterns from a file. ๐--min-age Durationโ only transfer files older than this in s or suffixms|s|m|h|d|w|M|y(defaultoff). too young? not transferring. โณ--min-size SizeSuffixโ only transfer files bigger than this in KiB or suffixB|K|M|G|T|P(defaultoff). too small? not transferring. โจ
โจ Listing Options โจ
Flags for listing directories โ for when you just wanna see whatโs there. ๐ฆ
--default-time Timeโ time to show if modtime is unknown for files and directories (default2000-01-01T00:00:00Z). unknown modtime? show this timestamp. ๐--fast-listโ use recursive list if available; uses more memory but fewer transactions. more memory, fewer transactions โ worth it. ๐
๐ See Also ๐
- rclone (
https://rclone.org/commands/rclone/) โ Show help for rclone commands, flags and backends. ๐
๐๏ธ rclone delete
okay bestie, this one is the selective deleter. Remove the files in path.
โจ Synopsis
Remove the files in path. Unlike purge (https://rclone.org/commands/rclone_purge/) it obeys include/exclude filters so can be used to selectively delete files. that's the whole point of her, she's the picky one ๐
rclone delete only deletes files but leaves the directory structure alone. If you want to delete a directory and all of its contents use the purge (https://rclone.org/commands/rclone_purge/) command instead. purge is the one with zero chill.
If you supply the --rmdirs flag, it will remove all empty directories along with it. You can also use the separate command rmdir (https://rclone.org/commands/rclone_rmdir/) or rmdirs (https://rclone.org/commands/rclone_rmdirs/) to delete empty directories only. so many ways to clean up, we're spoiled fr fr ๐ง
For example, to delete all files bigger than 100 MiB, you may first want to check what would be deleted (use either):
rclone --min-size 100M lsl remote:path
rclone --dry-run --min-size 100M delete remote:path
Then proceed with the actual delete:
rclone --min-size 100M delete remote:path
That reads "delete everything with a minimum size of 100 MiB", hence delete all files bigger than 100 MiB. yes the logic is a little chaotic but she's right, trust. ๐
Important: Since this can cause data loss, test first with the--dry-runor the--interactive/-iflag. bestie please. do the trial run. I am begging. ๐ญ
rclone delete remote:path [flags]
โจ Options
-h,--helpโ help for delete--rmdirsโ rmdirs removes empty directories but leaves root intact
Options shared with other commands are described next. See the global flags page (https://rclone.org/flags/) for global options not listed here.
๐ Important Options
Important flags useful for most commands โ these girls show up everywhere, icons only โจ
-n,--dry-runโ Do a trial run with no permanent changes-i,--interactiveโ Enable interactive mode-v,--verbose countโ Print lots more stuff (repeat for more)
๐ Filter Options
Flags for filtering directory listings โ the "who gets to stay" committee ๐
--delete-excludedโ Delete files on dest excluded from sync--exclude stringArrayโ Exclude files matching pattern--exclude-from stringArrayโ Read file exclude patterns from file (use-to read from stdin)--exclude-if-present stringArrayโ Exclude directories if filename is present--files-from stringArrayโ Read list of source-file names from file (use-to read from stdin)--files-from-raw stringArrayโ Read list of source-file names from file without any processing of lines (use-to read from stdin)--files-from0 stringArrayโ Read list of source-file names from file using NUL as separator (use-to read from stdin)-f,--filter stringArrayโ Add a file filtering rule--filter-from stringArrayโ Read file filtering patterns from a file (use-to read from stdin)--hash-filter stringโ Partition filenames by hashk/nor randomly@/n--ignore-caseโ Ignore case in filters (case insensitive)--include stringArrayโ Include files matching pattern--include-from stringArrayโ Read file include patterns from file (use-to read from stdin)--max-age Durationโ Only transfer files younger than this in s or suffixms|s|m|h|d|w|M|y(default off)--max-depth intโ If set limits the recursion depth to this (default-1)--max-size SizeSuffixโ Only transfer files smaller than this in KiB or suffixB|K|M|G|T|P(default off)--metadata-exclude stringArrayโ Exclude metadatas matching pattern--metadata-exclude-from stringArrayโ Read metadata exclude patterns from file (use-to read from stdin)--metadata-filter stringArrayโ Add a metadata filtering rule--metadata-filter-from stringArrayโ Read metadata filtering patterns from a file (use-to read from stdin)--metadata-include stringArrayโ Include metadatas matching pattern--metadata-include-from stringArrayโ Read metadata include patterns from file (use-to read from stdin)--min-age Durationโ Only transfer files older than this in s or suffixms|s|m|h|d|w|M|y(default off)--min-size SizeSuffixโ Only transfer files bigger than this in KiB or suffixB|K|M|G|T|P(default off)
๐ฆ Listing Options
Flags for listing directories
--default-time Timeโ Time to show if modtime is unknown for files and directories (default2000-01-01T00:00:00Z)--fast-listโ Use recursive list if available; uses more memory but fewer transactions
๐ See Also
rclone(https://rclone.org/commands/rclone/) โ Show help for rclone commands, flags and backends.
๐ rclone purge
Remove the path and all of its contents. yes she is that girl and yes she means ALL of it.
โจ Synopsis
Remove the path and all of its contents. Note that this does not obey include/exclude filters โ everything will be removed. Use the delete (https://rclone.org/commands/rclone_delete/) command if you want to selectively delete files. To delete empty directories only, use command rmdir (https://rclone.org/commands/rclone_rmdir/) or rmdirs (https://rclone.org/commands/rclone_rmdirs/).
The concurrency of this operation is controlled by the --checkers global flag. However, some backends will implement this command directly, in which case --checkers will be ignored. so if it's acting like the flag isn't realโฆ it might not be, no cap ๐
Important: Since this can cause data loss, test first with the--dry-runor the--interactive/-iflag. this is the main character of "oops" moments, protect yourself ๐ญ
rclone purge remote:path [flags]
โจ Options
-h,--helpโ help for purge
Options shared with other commands are described next. See the global flags page (https://rclone.org/flags/) for global options not listed here.
๐ Important Options
Important flags useful for most commands
-n,--dry-runโ Do a trial run with no permanent changes-i,--interactiveโ Enable interactive mode-v,--verbose countโ Print lots more stuff (repeat for more)
๐ See Also
rclone(https://rclone.org/commands/rclone/) โ Show help for rclone commands, flags and backends.
๐ธ rclone mkdir
Make the path if it doesn't already exist. shortest icon behaviour ever, she justโฆ shows up ๐
rclone mkdir remote:path [flags]
โจ Options
-h,--helpโ help for mkdir
Options shared with other commands are described next. See the global flags page (https://rclone.org/flags/) for global options not listed here.
๐ Important Options
Important flags useful for most commands
-n,--dry-runโ Do a trial run with no permanent changes-i,--interactiveโ Enable interactive mode-v,--verbose countโ Print lots more stuff (repeat for more)
๐ See Also
rclone(https://rclone.org/commands/rclone/) โ Show help for rclone commands, flags and backends.
๐ rclone rmdir
Remove the empty directory at path. note the word empty, she's picky and that's valid.
โจ Synopsis
This removes empty directory given by path. Will not remove the path if it has any objects in it, not even empty subdirectories. like she will NOT budge if there's anything in there, not even a little empty subdirectory lurking ๐ Use command rmdirs (https://rclone.org/commands/rclone_rmdirs/) (or delete (https://rclone.org/commands/rclone_delete/) with option --rmdirs) to do that.
To delete a path and any objects in it, use purge (https://rclone.org/commands/rclone_purge/) command.
rclone rmdir remote:path [flags]
โจ Options
-h,--helpโ help for rmdir
Options shared with other commands are described next. See the global flags page (https://rclone.org/flags/) for global options not listed here.
๐ Important Options
Important flags useful for most commands
-n,--dry-runโ Do a trial run with no permanent changes-i,--interactiveโ Enable interactive mode-v,--verbose countโ Print lots more stuff (repeat for more)
๐ See Also
rclone(https://rclone.org/commands/rclone/) โ Show help for rclone commands, flags and backends.
โจ rclone check โจ
okay bestie, this one is the vibe check command ๐ it just looks at your files and tells you if the source and destination actually match, no touching, no moving, no drama. purely observational. main character energy but make it polite.
๐ธ Synopsis
rclone check checks that the files in the source and destination match. it compares sizes and hashes (MD5 or SHA1) and then logs a whole little report of the files that don't match. it does not alter the source or destination โ promise, it's just looking ๐ซถ
for the crypt remote (over at rclone.org/crypt/) there's a dedicated command, cryptcheck (at rclone.org/commands/rclone_cryptcheck/), and that one is able to check the checksums of the encrypted files. so if you're living that crypt life, that's your girl.
if you pass the --size-only flag, it will only compare the sizes and not the hashes as well. use this for a quick check, it's giving speedrun โก
if you pass the --download flag, it will download the data from both remotes and check them against each other on the fly. this can be useful for remotes that don't support hashes, or if you really want to check all the data. like, all of it. no cap ๐ค
if you pass the --checkfile HASH flag with a valid hash name, then source:path must point to a text file in the SUM format. yes, that format. the SUM one ๐
if you pass the --one-way flag, it will only check that files in the source match the files in the destination, not the other way around. which means extra files in the destination that aren't in the source will not be detected. lowkey a blind spot, so know what you're asking for ๐
the --differ, --missing-on-dst, --missing-on-src, --match and --error flags write paths, one per line, to the file name you give them (or stdout if it's -). what they write is described in the help below. for example, --differ will write all paths which are present on both the source and destination but different.
the --combined flag will write a file (or stdout) which contains all file paths with a symbol and then a space and then the path, to tell you what happened to it. these are reminiscent of diff files ๐
= pathmeanspathwas found in source and destination and was identical- pathmeanspathwas missing on the source, so only in the destination+ pathmeanspathwas missing on the destination, so only in the source* pathmeanspathwas present in source and destination but different! pathmeans there was an error reading or hashing the source or dest
the default number of parallel checks is 8. see the --checkers option (over at rclone.org/docs/#checkers-int) for more info. yes bestie, 8 at once, she multitasks โจ
rclone check source:path dest:path [flags]
๐ Options
-C,--checkfile stringโ treatsource:pathas a SUM file with hashes of the given type--combined stringโ make a combined report of changes to this file--differ stringโ report all non-matching files to this file--downloadโ check by downloading rather than with hash--error stringโ report all files with errors (hashing or reading) to this file-h,--helpโ help forcheck--match stringโ report all matching files to this file--missing-on-dst stringโ report all files missing from the destination to this file--missing-on-src stringโ report all files missing from the source to this file--one-wayโ check one way only, source files must exist on remote
options shared with other commands are described next. see the global flags page (over at rclone.org/flags/) for global options not listed here, iykyk ๐
๐ฆ Check Options
flags used for check commands ๐ฏ
--max-backlog intโ maximum number of objects in sync or check backlog (default10000)
๐ Filter Options
flags for filtering directory listings ๐ง
--delete-excludedโ delete files on dest excluded from sync--exclude stringArrayโ exclude files matching pattern--exclude-from stringArrayโ read file exclude patterns from file (use-to read from stdin)--exclude-if-present stringArrayโ exclude directories if filename is present--files-from stringArrayโ read list of source-file names from file (use-to read from stdin)--files-from-raw stringArrayโ read list of source-file names from file without any processing of lines (use-to read from stdin)--files-from0 stringArrayโ read list of source-file names from file using NUL as separator (use-to read from stdin)-f,--filter stringArrayโ add a file filtering rule--filter-from stringArrayโ read file filtering patterns from a file (use-to read from stdin)--hash-filter stringโ partition filenames by hashk/nor randomly@/n--ignore-caseโ ignore case in filters (case insensitive)--include stringArrayโ include files matching pattern--include-from stringArrayโ read file include patterns from file (use-to read from stdin)--max-age Durationโ only transfer files younger than this insor suffixms|s|m|h|d|w|M|y(default off)--max-depth intโ if set limits the recursion depth to this (default-1)--max-size SizeSuffixโ only transfer files smaller than this inKiBor suffixB|K|M|G|T|P(default off)--metadata-exclude stringArrayโ exclude metadatas matching pattern--metadata-exclude-from stringArrayโ read metadata exclude patterns from file (use-to read from stdin)--metadata-filter stringArrayโ add a metadata filtering rule--metadata-filter-from stringArrayโ read metadata filtering patterns from a file (use-to read from stdin)--metadata-include stringArrayโ include metadatas matching pattern--metadata-include-from stringArrayโ read metadata include patterns from file (use-to read from stdin)--min-age Durationโ only transfer files older than this insor suffixms|s|m|h|d|w|M|y(default off)--min-size SizeSuffixโ only transfer files bigger than this inKiBor suffixB|K|M|G|T|P(default off)
โญ Listing Options
flags for listing directories ๐
--default-time Timeโ time to show if modtime is unknown for files and directories (default2000-01-01T00:00:00Z)--fast-listโ use recursive list if available; uses more memory but fewer transactions
๐ See Also
rclone(over atrclone.org/commands/rclone/) โ show help for rclone commands, flags and backends.
๐ Filter Options ๐
Flags for filtering directory listings
--delete-excludedโ Delete files on dest excluded from sync--excludestringArray โ Exclude files matching pattern--exclude-fromstringArray โ Read file exclude patterns from file (use-to read from stdin)--exclude-if-presentstringArray โ Exclude directories if filename is present--files-fromstringArray โ Read list of source-file names from file (use-to read from stdin)--files-from-rawstringArray โ Read list of source-file names from file without any processing of lines (use-to read from stdin)--files-from0stringArray โ Read list of source-file names from file using NUL as separator (use-to read from stdin)-f,--filterstringArray โ Add a file filtering rule--filter-fromstringArray โ Read file filtering patterns from a file (use-to read from stdin)--hash-filterstring โ Partition filenames by hash k/n or randomly @/n--ignore-caseโ Ignore case in filters (case insensitive)--includestringArray โ Include files matching pattern--include-fromstringArray โ Read file include patterns from file (use-to read from stdin)--max-ageDuration โ Only transfer files younger than this in s or suffix ms|s|m|h|d|w|M|y (default off)--max-depthint โ If set limits the recursion depth to this (default -1)--max-sizeSizeSuffix โ Only transfer files smaller than this in KiB or suffix B|K|M|G|T|P (default off)--metadata-excludestringArray โ Exclude metadatas matching pattern--metadata-exclude-fromstringArray โ Read metadata exclude patterns from file (use-to read from stdin)--metadata-filterstringArray โ Add a metadata filtering rule--metadata-filter-fromstringArray โ Read metadata filtering patterns from a file (use-to read from stdin)--metadata-includestringArray โ Include metadatas matching pattern--metadata-include-fromstringArray โ Read metadata include patterns from file (use-to read from stdin)--min-ageDuration โ Only transfer files older than this in s or suffix ms|s|m|h|d|w|M|y (default off)--min-sizeSizeSuffix โ Only transfer files bigger than this in KiB or suffix B|K|M|G|T|P (default off)
โจ Listing Options โจ
Flags for listing directories
--default-timeTime โ Time to show if modtime is unknown for files and directories (default2000-01-01T00:00:00Z)--fast-listโ Use recursive list if available; uses more memory but fewer transactions
๐ See Also ๐
rclone(https://rclone.org/commands/rclone/) โ Show help for rclone commands, flags and backends.
๐ rclone lsd ๐
๐ Synopsis ๐
okay so rclone lsd lists the directories in the source path straight to standard output. ngl it does not recurse by default โ you gotta hit it with the -R flag if you want it to recurse into everything. ๐
This command lists the total size of the directory (if known, -1 if not), the modification time (if known, the current time if not), the number of objects in the directory (if known, -1 if not) and the name of the directory. E.g. ๐ฆ
$ rclone lsd swift:
494000 2018-04-26 08:43:20 10000 10000files
65 2018-04-26 08:43:20 1 1File
Or
$ rclone lsd drive:test
-1 2016-10-17 17:41:53 -1 1000files
-1 2017-01-03 14:40:54 -1 2500files
-1 2017-07-08 14:39:28 -1 4000files
If you just want the directory names use rclone lsf --dirs-only. periodt. ๐
Any of the filtering options can be applied to this command.
There are several related list commands โ the whole friend group:
lsto list size and path of objects onlylslto list modification time, size and path of objects onlylsdto list directories onlylsfto list objects and directories in easy to parse formatlsjsonto list objects and directories in JSON format
So ls, lsl and lsd are designed to be human-readable. lsf is designed to be human and machine-readable. lsjson is designed to be machine-readable. range fr fr. ๐
bestie, listen:lsandlslrecurse by default โ use--max-depth 1to stop the recursion. the other ones are chill.
The other list commands lsd, lsf, lsjson do not recurse by default โ use -R to make them recurse.
On the bucket-based remotes (e.g. s3, gcs, b2) a directory is a key prefix rather than an object, so a listing without -R shows each prefix as one directory entry and not the objects stored under it. iykyk ๐ชฃโจ
List commands prefer a recursive method that uses more memory but fewer transactions by default. Use --disable ListR to suppress the behavior. See --fast-list (https://rclone.org/docs/#fast-list) for more details.
Listing a nonexistent directory will produce an error except for remotes which can't have empty directories (e.g. s3, swift, or gcs - the bucket-based remotes). they literally can't do empty dirs so the rules don't apply to them ๐
rclone lsd remote:path [flags]
๐ Options ๐
-h,--helpโ help for lsd-R,--recursiveโ Recurse into the listing
Options shared with other commands are described next. See the global flags page (https://rclone.org/flags/) for global options not listed here.
๐ซถ Filter Options ๐ซถ
Flags for filtering directory listings
--delete-excludedโ Delete files on dest excluded from sync--excludestringArray โ Exclude files matching pattern--exclude-fromstringArray โ Read file exclude patterns from file (use-to read from stdin)--exclude-if-presentstringArray โ Exclude directories if filename is present--files-fromstringArray โ Read list of source-file names from file (use-to read from stdin)--files-from-rawstringArray โ Read list of source-file names from file without any processing of lines (use-to read from stdin)--files-from0stringArray โ Read list of source-file names from file using NUL as separator (use-to read from stdin)-f,--filterstringArray โ Add a file filtering rule--filter-fromstringArray โ Read file filtering patterns from a file (use-to read from stdin)--hash-filterstring โ Partition filenames by hash k/n or randomly @/n--ignore-caseโ Ignore case in filters (case insensitive)--includestringArray โ Include files matching pattern--include-fromstringArray โ Read file include patterns from file (use-to read from stdin)--max-ageDuration โ Only transfer files younger than this in s or suffix ms|s|m|h|d|w|M|y (default off)--max-depthint โ If set limits the recursion depth to this (default -1)--max-sizeSizeSuffix โ Only transfer files smaller than this in KiB or suffix B|K|M|G|T|P (default off)--metadata-excludestringArray โ Exclude metadatas matching pattern--metadata-exclude-fromstringArray โ Read metadata exclude patterns from file (use-to read from stdin)--metadata-filterstringArray โ Add a metadata filtering rule--metadata-filter-fromstringArray โ Read metadata filtering patterns from a file (use-to read from stdin)--metadata-includestringArray โ Include metadatas matching pattern--metadata-include-fromstringArray โ Read metadata include patterns from file (use-to read from stdin)--min-ageDuration โ Only transfer files older than this in s or suffix ms|s|m|h|d|w|M|y (default off)--min-sizeSizeSuffix โ Only transfer files bigger than this in KiB or suffix B|K|M|G|T|P (default off)
โจ Listing Options โจ
Flags for listing directories
--default-timeTime โ Time to show if modtime is unknown for files and directories (default2000-01-01T00:00:00Z)--fast-listโ Use recursive list if available; uses more memory but fewer transactions
๐ See Also ๐
rclone(https://rclone.org/commands/rclone/) โ Show help for rclone commands, flags and backends.
rclone lsl ๐
List the objects in path with modification time, size and path. โจ
Synopsis ๐
Okay bestie, so lsl dumps all the objects in your source path straight to standard output in a human-readable format โ and it gives you the modification time, the size, AND the path. Recurse? Oh it recurses by default, no cap. ๐
Like, for example:
$ rclone lsl swift:bucket
60295 2016-06-25 18:55:41.062626927 bevajer5jef
90613 2016-06-25 18:55:43.302607074 canole
94467 2016-06-25 18:55:43.046609333 diwogej7
37600 2016-06-25 18:55:40.814629136 fubuwic
Any of the filtering options can be applied to this command. (Yes, any. Filter girlies stay winning. ๐)
There are several related list commands and honestly they're a whole friend group:
lsto list size and path of objects onlylslto list modification time, size and path of objects onlylsdto list directories onlylsfto list objects and directories in easy to parse formatlsjsonto list objects and directories in JSON format
ls,lsl,lsd are designed to be human-readable. lsf is designed to be human and machine-readable. lsjson is designed to be machine-readable. (machine-readable girlies, this one's for you ๐ค)
Note that ls and lsl recurse by default - use --max-depth 1 to stop the recursion. ๐
The other list commands lsd,lsf,lsjson do not recurse by default - use -R to make them recurse. (Flip that switch, bestie. ๐)
On the bucket-based remotes (e.g. s3, gcs, b2) a directory is a key prefix rather than an object, so a listing without -R shows each prefix as one directory entry and not the objects stored under it. sneaky!! ๐
List commands prefer a recursive method that uses more memory but fewer transactions by default. Use --disable ListR to suppress the behavior. See --fast-list (https://rclone.org/docs/#fast-list) for more details. ๐ง
Listing a nonexistent directory will produce an error except for remotes which can't have empty directories (e.g. s3, swift, or gcs - the bucket-based remotes). ๐ซถ
rclone lsl remote:path [flags]
Options ๐ธ
-h,--helpโ help forlsl
Options shared with other commands are described next. See the global flags page (https://rclone.org/flags/) for global options not listed here.
Filter Options ๐ฆ
Flags for filtering directory listings
--delete-excludedโ Delete files on dest excluded from sync--exclude stringArrayโ Exclude files matching pattern--exclude-from stringArrayโ Read file exclude patterns from file (use-to read from stdin)--exclude-if-present stringArrayโ Exclude directories if filename is present--files-from stringArrayโ Read list of source-file names from file (use-to read from stdin)--files-from-raw stringArrayโ Read list of source-file names from file without any processing of lines (use-to read from stdin)--files-from0 stringArrayโ Read list of source-file names from file using NUL as separator (use-to read from stdin)-f,--filter stringArrayโ Add a file filtering rule--filter-from stringArrayโ Read file filtering patterns from a file (use-to read from stdin)--hash-filter stringโ Partition filenames by hashk/nor randomly@/n--ignore-caseโ Ignore case in filters (case insensitive)--include stringArrayโ Include files matching pattern--include-from stringArrayโ Read file include patterns from file (use-to read from stdin)--max-age Durationโ Only transfer files younger than this insor suffixms|s|m|h|d|w|M|y(default off)--max-depth intโ If set limits the recursion depth to this (default-1)--max-size SizeSuffixโ Only transfer files smaller than this in KiB or suffixB|K|M|G|T|P(default off)--metadata-exclude stringArrayโ Exclude metadatas matching pattern--metadata-exclude-from stringArrayโ Read metadata exclude patterns from file (use-to read from stdin)--metadata-filter stringArrayโ Add a metadata filtering rule--metadata-filter-from stringArrayโ Read metadata filtering patterns from a file (use-to read from stdin)--metadata-include stringArrayโ Include metadatas matching pattern--metadata-include-from stringArrayโ Read metadata include patterns from file (use-to read from stdin)--min-age Durationโ Only transfer files older than this insor suffixms|s|m|h|d|w|M|y(default off)--min-size SizeSuffixโ Only transfer files bigger than this in KiB or suffixB|K|M|G|T|P(default off)
Listing Options โญ
Flags for listing directories
--default-time Timeโ Time to show if modtime is unknown for files and directories (default2000-01-01T00:00:00Z)--fast-listโ Use recursive list if available; uses more memory but fewer transactions
See Also ๐
rclone(https://rclone.org/commands/rclone/) - Show help for rclone commands, flags and backends.
rclone md5sum ๐ฅ
Produces an md5sum file for all the objects in the path. โจ
Synopsis ๐
So rclone md5sum produces an md5sum file for all the objects in the path. This is in the same format as the standard md5sum tool produces. same format besties, we're compatible ๐
By default, the hash is requested from the remote. If MD5 is not supported by the remote, no hash will be returned. not even a little bit, it just won't come back ๐ญ With the download flag, the file will be downloaded from the remote and hashed locally enabling MD5 for any remote. (Yes, any. Iconic behavior tbh. ๐)
For other algorithms, see the hashsum (https://rclone.org/commands/rclone_hashsum/) command. Running rclone md5sum remote:path is equivalent to running rclone hashsum MD5 remote:path.
This command can also hash data received on standard input (stdin), by not passing a remote:path, or by passing a hyphen as remote:path when there is data to read (if not, the hyphen will be treated literally, as a relative path). careful babes, the hyphen has main character energy and it will do exactly what you told it to ๐
rclone md5sum remote:path [flags]
Options ๐ธ
--base64โ Output base64 encoded hashsum-C,--checkfile stringโ Validate hashes against a given SUM file instead of printing them--downloadโ Download the file and hash it locally; if this flag is not specified, the hash is requested from the remote-h,--helpโ help formd5sum--output-file stringโ Output hashsums to a file rather than the terminal
Options shared with other commands are described next. See the global flags page (https://rclone.org/flags/) for global options not listed here.
Filter Options ๐ฆ
Flags for filtering directory listings
--delete-excludedโ Delete files on dest excluded from sync--exclude stringArrayโ Exclude files matching pattern--exclude-from stringArrayโ Read file exclude patterns from file (use-to read from stdin)--exclude-if-present stringArrayโ Exclude directories if filename is present--files-from stringArrayโ Read list of source-file names from file (use-to read from stdin)--files-from-raw stringArrayโ Read list of source-file names from file without any processing of lines (use-to read from stdin)--files-from0 stringArrayโ Read list of source-file names from file using NUL as separator (use-to read from stdin)-f,--filter stringArrayโ Add a file filtering rule--filter-from stringArrayโ Read file filtering patterns from a file (use-to read from stdin)--hash-filter stringโ Partition filenames by hashk/nor randomly@/n--ignore-caseโ Ignore case in filters (case insensitive)--include stringArrayโ Include files matching pattern--include-from stringArrayโ Read file include patterns from file (use-to read from stdin)--max-age Durationโ Only transfer files younger than this insor suffixms|s|m|h|d|w|M|y(default off)--max-depth intโ If set limits the recursion depth to this (default-1)--max-size SizeSuffixโ Only transfer files smaller than this in KiB or suffixB|K|M|G|T|P(default off)--metadata-exclude stringArrayโ Exclude metadatas matching pattern--metadata-exclude-from stringArrayโ Read metadata exclude patterns from file (use-to read from stdin)--metadata-filter stringArrayโ Add a metadata filtering rule--metadata-filter-from stringArrayโ Read metadata filtering patterns from a file (use-to read from stdin)--metadata-include stringArrayโ Include metadatas matching pattern--metadata-include-from stringArrayโ Read metadata include patterns from file (use-to read from stdin)--min-age Durationโ Only transfer files older than this insor suffixms|s|m|h|d|w|M|y(default off)--min-size SizeSuffixโ Only transfer files bigger than this in KiB or suffixB|K|M|G|T|P(default off)
Listing Options โญ
Flags for listing directories
--default-time Timeโ Time to show if modtime is unknown for files and directories (default2000-01-01T00:00:00Z)--fast-listโ Use recursive list if available; uses more memory but fewer transactions
See Also ๐
rclone(https://rclone.org/commands/rclone/) - Show help for rclone commands, flags and backends.
๐ rclone sha1sum
Ok bestie, this one makes an sha1sum file for literally every object in the path. ๐
โจ Synopsis โจ
Produces an sha1sum file for all the objects in the path. This is in the same format as the standard sha1sum tool produces.
By default, the hash is requested from the remote. If SHA-1 is not supported by the remote, no hash will be returned. With the download flag, the file will be downloaded from the remote and hashed locally enabling SHA-1 for any remote.
For other algorithms, see the [hashsum](https://rclone.org/commands/rclone_hashsum/) command. Running rclone sha1sum remote:path is equivalent to running rclone hashsum SHA1 remote:path.
This command can also hash data received on standard input (stdin), by not passing a remote:path, or by passing a hyphen as remote:path when there is data to read (if not, the hyphen will be treated literally, as a relative path).
This command can also hash data received on STDIN, if not passing a remote:path.
rclone sha1sum remote:path [flags]
๐ธ Options ๐ธ
--base64โ output base64 encoded hashsum ๐-C,--checkfilestring โ validate hashes against a given SUM file instead of printing them--downloadโ download the file and hash it locally; if this flag is not specified, the hash is requested from the remote-h,--helpโ help for sha1sum--output-filestring โ output hashsums to a file rather than the terminal
Options shared with other commands are described next. See the global flags page over at https://rclone.org/flags/ for global options not listed here.
๐ Filter Options ๐
Flags for filtering directory listings โ yes they show up everywhere, she's consistent like that:
--delete-excludedโ delete files on dest excluded from sync--excludestringArray โ exclude files matching pattern--exclude-fromstringArray โ read file exclude patterns from file (use-to read from stdin)--exclude-if-presentstringArray โ exclude directories if filename is present--files-fromstringArray โ read list of source-file names from file (use-to read from stdin)--files-from-rawstringArray โ read list of source-file names from file without any processing of lines (use-to read from stdin)--files-from0stringArray โ read list of source-file names from file using NUL as separator (use-to read from stdin)-f,--filterstringArray โ add a file filtering rule--filter-fromstringArray โ read file filtering patterns from a file (use-to read from stdin)--hash-filterstring โ partition filenames by hashk/nor randomly@/n--ignore-caseโ ignore case in filters (case insensitive)--includestringArray โ include files matching pattern--include-fromstringArray โ read file include patterns from file (use-to read from stdin)--max-ageDuration โ only transfer files younger than this insor suffixms|s|m|h|d|w|M|y(default off)--max-depthint โ if set limits the recursion depth to this (default-1)--max-sizeSizeSuffix โ only transfer files smaller than this in KiB or suffixB|K|M|G|T|P(default off)--metadata-excludestringArray โ exclude metadatas matching pattern--metadata-exclude-fromstringArray โ read metadata exclude patterns from file (use-to read from stdin)--metadata-filterstringArray โ add a metadata filtering rule--metadata-filter-fromstringArray โ read metadata filtering patterns from a file (use-to read from stdin)--metadata-includestringArray โ include metadatas matching pattern--metadata-include-fromstringArray โ read metadata include patterns from file (use-to read from stdin)--min-ageDuration โ only transfer files older than this insor suffixms|s|m|h|d|w|M|y(default off)--min-sizeSizeSuffix โ only transfer files bigger than this in KiB or suffixB|K|M|G|T|P(default off)
๐ Listing Options ๐
Flags for listing directories:
--default-timeTime โ time to show if modtime is unknown for files and directories (default2000-01-01T00:00:00Z)--fast-listโ use recursive list if available; uses more memory but fewer transactions
๐ See Also ๐
rclone(https://rclone.org/commands/rclone/) โ Show help for rclone commands, flags and backends.
๐ rclone size
Prints the total size and number of objects in remote:path. She's doing math for you, you're welcome. โจ
โจ Synopsis โจ
Counts objects in the path and calculates the total size. Prints the result to standard output.
By default the output is in human-readable format, but shows values in both human-readable format as well as the raw numbers (global option --human-readable is not considered). Use option --json to format output as JSON instead.
Recurses by default, use --max-depth 1 to stop the recursion.
Some backends do not always provide file sizes, see for example [Google Photos](https://rclone.org/googlephotos/#size) and [Google Docs](https://rclone.org/drive/#limitations-of-google-docs). Rclone will then show a notice in the log indicating how many such files were encountered, and count them in as empty files in the output of the size command.
rclone size remote:path [flags]
๐ธ Options ๐ธ
-h,--helpโ help for size--jsonโ format output as JSON
Options shared with other commands are described next. See the global flags page over at https://rclone.org/flags/ for global options not listed here.
๐ Filter Options ๐
Flags for filtering directory listings:
--delete-excludedโ delete files on dest excluded from sync--excludestringArray โ exclude files matching pattern--exclude-fromstringArray โ read file exclude patterns from file (use-to read from stdin)--exclude-if-presentstringArray โ exclude directories if filename is present--files-fromstringArray โ read list of source-file names from file (use-to read from stdin)--files-from-rawstringArray โ read list of source-file names from file without any processing of lines (use-to read from stdin)--files-from0stringArray โ read list of source-file names from file using NUL as separator (use-to read from stdin)-f,--filterstringArray โ add a file filtering rule--filter-fromstringArray โ read file filtering patterns from a file (use-to read from stdin)--hash-filterstring โ partition filenames by hashk/nor randomly@/n--ignore-caseโ ignore case in filters (case insensitive)--includestringArray โ include files matching pattern--include-fromstringArray โ read file include patterns from file (use-to read from stdin)--max-ageDuration โ only transfer files younger than this insor suffixms|s|m|h|d|w|M|y(default off)--max-depthint โ if set limits the recursion depth to this (default-1)--max-sizeSizeSuffix โ only transfer files smaller than this in KiB or suffixB|K|M|G|T|P(default off)--metadata-excludestringArray โ exclude metadatas matching pattern--metadata-exclude-fromstringArray โ read metadata exclude patterns from file (use-to read from stdin)--metadata-filterstringArray โ add a metadata filtering rule--metadata-filter-fromstringArray โ read metadata filtering patterns from a file (use-to read from stdin)--metadata-includestringArray โ include metadatas matching pattern--metadata-include-fromstringArray โ read metadata include patterns from file (use-to read from stdin)--min-ageDuration โ only transfer files older than this insor suffixms|s|m|h|d|w|M|y(default off)--min-sizeSizeSuffix โ only transfer files bigger than this in KiB or suffixB|K|M|G|T|P(default off)
๐ Listing Options ๐
Flags for listing directories:
--default-timeTime โ time to show if modtime is unknown for files and directories (default2000-01-01T00:00:00Z)--fast-listโ use recursive list if available; uses more memory but fewer transactions
๐ See Also ๐
rclone(https://rclone.org/commands/rclone/) โ Show help for rclone commands, flags and backends.
๐ฆ rclone version
Show the version number. Yes queen, receipts. ๐
โจ Synopsis โจ
Show the rclone version number, the go version, the build target OS and architecture, the runtime OS and kernel version and bitness, build tags and the type of executable (static or dynamic).
For example:
$ rclone version
rclone v1.55.0
- os/version: ubuntu 18.04 (64 bit)
- os/kernel: 4.15.0-136-generic (x86_64)
- os/type: linux
- os/arch: amd64
- go/version: go1.16
- go/linking: static
- go/tags: none
Note: before rclone version 1.55 theos/typeandos/archlines were merged, and the"go/version"line was tagged as"go version". ๐
If you supply the --check flag, then it will do an online check to compare your version with the latest release and the latest beta.
$ rclone version --check
yours: 1.42.0.6
latest: 1.42 (released 2018-06-16)
beta: 1.42.0.5 (released 2018-06-17)
Or
$ rclone version --check
yours: 1.41
latest: 1.42 (released 2018-06-16)
upgrade: https://downloads.rclone.org/v1.42
beta: 1.42.0.5 (released 2018-06-17)
upgrade: https://beta.rclone.org/v1.42-005-g56e1e820
If you supply the --deps flag then rclone will print a list of all the packages it depends on and their versions along with some other information about the build.
rclone version [flags]
๐ธ Options ๐ธ
--checkโ check for new version--depsโ show the Go dependencies-h,--helpโ help for version
See the global flags page over at https://rclone.org/flags/ for global options not listed here.
๐ See Also ๐
rclone(https://rclone.org/commands/rclone/) โ Show help for rclone commands, flags and backends.
rclone cleanup</p> ๐งผโจ
okay so bestie, this one cleans up the remote if possible. Like, it empties the trash ๐๏ธ or deletes old file versions. Not every remote is gonna support this tho โ vibe check your backend first ๐
Synopsis
Clean up the remote if possible. Empty the trash or delete old file versions. Not supported by all remotes.
rclone cleanup remote:path [flags]
Options
-h,--helpโ help for cleanup ๐ซถ
Options shared with other commands are described next. See the global flags page (<https://rclone.org/flags/>) for global options not listed here.
Important Options โจ
Important flags useful for most commands โ lowkey these are your ride-or-dies:
-n,--dry-runโ Do a trial run with no permanent changes ๐-i,--interactiveโ Enable interactive mode ๐-v,--verbose countโ Print lots more stuff (repeat for more) ๐ข
See Also
- rclone (<https://rclone.org/commands/rclone/>) - Show help for rclone commands, flags and backends. ๐
rclone dedupe ๐ฏโโ๏ธ๐
Interactively find duplicate filenames and delete/rename them. This is the the way that you deal with a messy folder that has the same file three times like it's a group chat with the same screenshot posted by everyone ๐ญ
Synopsis
By default dedupe interactively finds files with duplicate names and offers to delete all but one or rename them to be different. This is known as deduping by name.
Deduping by name is only useful with a small group of backends (e.g. Google Drive, Opendrive) that can have duplicate file names. It can be run on wrapping backends (e.g. crypt) if they wrap a backend which supports duplicate file names.
However if --by-hash is passed in then dedupe will find files with duplicate hashes instead which will work on any backend which supports at least one hash. This can be used to find files with duplicate content. This is known as deduping by hash. ๐ฅ
If deduping by name, first rclone will merge directories with the same name. It will do this iteratively until all the identically named directories have been merged.
Next, if deduping by name, for every group of duplicate file names / hashes, it will delete all but one identical file it finds without confirmation. This means that for most duplicated files the dedupe command will not be interactive.
dedupe considers files to be identical if they have the same file path and the same hash. If the backend does not support hashes (e.g. crypt wrapping Google Drive) then they will never be found to be identical. If you use the --size-only flag then files will be considered identical if they have the same size (any hash will be ignored). This can be useful on crypt backends which do not support hashes.
Next rclone will resolve the remaining duplicates. Exactly which action is taken depends on the dedupe mode. By default, rclone will interactively query the user for each one.
โ ๏ธ Important: Since this can cause data loss, test first with the--dry-runor the--interactive/-iflag. Fr fr, do not skip this step bestie, I'm begging ๐
Here is an example run.
Before - with duplicates:
$ rclone lsl drive:dupes
6048320 2016-03-05 16:23:16.798000000 one.txt
6048320 2016-03-05 16:23:11.775000000 one.txt
564374 2016-03-05 16:23:06.731000000 one.txt
6048320 2016-03-05 16:18:26.092000000 one.txt
6048320 2016-03-05 16:22:46.185000000 two.txt
1744073 2016-03-05 16:22:38.104000000 two.txt
564374 2016-03-05 16:22:52.118000000 two.txt
Now the dedupe session:
$ rclone dedupe drive:dupes
2016/03/05 16:24:37 Google drive root 'dupes': Looking for duplicates using interactive mode.
one.txt: Found 4 files with duplicate names
one.txt: Deleting 2/3 identical duplicates (MD5 "1eedaa9fe86fd4b8632e2ac549403b36")
one.txt: 2 duplicates remain
1: 6048320 bytes, 2016-03-05 16:23:16.798000000, MD5 1eedaa9fe86fd4b8632e2ac549403b36
2: 564374 bytes, 2016-03-05 16:23:06.731000000, MD5 7594e7dc9fc28f727c42ee3e0749de81
s) Skip and do nothing
k) Keep just one (choose which in next step)
r) Rename all to be different (by changing file.jpg to file-1.jpg)
s/k/r> k
Enter the number of the file to keep> 1
one.txt: Deleted 1 extra copies
two.txt: Found 3 files with duplicate names
two.txt: 3 duplicates remain
1: 564374 bytes, 2016-03-05 16:22:52.118000000, MD5 7594e7dc9fc28f727c42ee3e0749de81
2: 6048320 bytes, 2016-03-05 16:22:46.185000000, MD5 1eedaa9fe86fd4b8632e2ac549403b36
3: 1744073 bytes, 2016-03-05 16:22:38.104000000, MD5 851957f7fb6f0bc4ce76be966d336802
s) Skip and do nothing
k) Keep just one (choose which in next step)
r) Rename all to be different (by changing file.jpg to file-1.jpg)
s/k/r> r
two-1.txt: renamed from: two.txt
two-2.txt: renamed from: two.txt
two-3.txt: renamed from: two.txt
The result being:
$ rclone lsl drive:dupes
6048320 2016-03-05 16:23:16.798000000 one.txt
564374 2016-03-05 16:22:52.118000000 two-1.txt
6048320 2016-03-05 16:22:46.185000000 two-2.txt
1744073 2016-03-05 16:22:38.104000000 two-3.txt
Dedupe can be run non interactively using the --dedupe-mode flag or by using an extra parameter with the same value ๐
--dedupe-mode interactive- interactive as above. ๐--dedupe-mode skip- removes identical files then skips anything left. โญ๏ธ--dedupe-mode first- removes identical files then keeps the first one. ๐ฅ--dedupe-mode newest- removes identical files then keeps the newest one. ๐ฑ--dedupe-mode oldest- removes identical files then keeps the oldest one. ๐บ--dedupe-mode largest- removes identical files then keeps the largest one. ๐--dedupe-mode smallest- removes identical files then keeps the smallest one. ๐--dedupe-mode rename- removes identical files then renames the rest to be different. ๐ท๏ธ--dedupe-mode list- lists duplicate dirs and files only and changes nothing. ๐
For example, to rename all the identically named photos in your Google Photos directory, do:
rclone dedupe --dedupe-mode rename "drive:Google Photos"
Or:
rclone dedupe rename "drive:Google Photos"
rclone dedupe [mode] remote:path [flags]
Options
--by-hashโ Find identical hashes rather than names ๐--dedupe-mode stringโ Dedupe modeinteractive|skip|first|newest|oldest|largest|smallest|rename(default"interactive")-h,--helpโ help for dedupe ๐ซถ
Options shared with other commands are described next. See the global flags page (<https://rclone.org/flags/>) for global options not listed here.
Important Options โจ
Important flags useful for most commands:
-n,--dry-runโ Do a trial run with no permanent changes ๐-i,--interactiveโ Enable interactive mode ๐-v,--verbose countโ Print lots more stuff (repeat for more) ๐ข
See Also
- rclone (<https://rclone.org/commands/rclone/>) - Show help for rclone commands, flags and backends. ๐
rclone about ๐๐
Get quota information from the remote. It's giving receipts for your storage, bestie ๐งพโจ
Synopsis
Prints quota information about a remote to standard output. The output is typically used, free, quota and trash contents.
E.g. Typical output from rclone about remote: is:
Total: 17 GiB
Used: 7.444 GiB
Free: 1.315 GiB
Trashed: 100.000 MiB
Other: 8.241 GiB
Where the fields are:
- Total: Total size available. ๐ฆ
- Used: Total size used. ๐ฅ
- Free: Total space available to this user. ๐๏ธ
- Trashed: Total space used by trash. ๐๏ธ
- Other: Total amount in other storage (e.g. Gmail, Google Photos). ๐
- Objects: Total number of objects in the storage. ๐ข
All sizes are in number of bytes.
Applying a --full flag to the command prints the bytes in full, e.g.:
Total: 18253611008
Used: 7993453766
Free: 1411001220
Trashed: 104857602
Other: 8849156022
A --json flag generates conveniently machine-readable output, e.g.:
{
"total": 18253611008,
"used": 7993453766,
"trashed": 104857602,
"other": 8849156022,
"free": 1411001220
}
Not all backends print all fields. Information is not included if it is not provided by a backend. Where the value is unlimited it is omitted. ๐ซ
Some backends does not support the rclone about command at all, see complete list in documentation (<https://rclone.org/overview/#optional-features>). ๐ญ
rclone about remote: [flags]
Options
--fullโ Full numbers instead of human-readable ๐ข-h,--helpโ help for about ๐ซถ--jsonโ Format output as JSON ๐งพ
See the global flags page (<https://rclone.org/flags/>) for global options not listed here.
See Also
- rclone (<https://rclone.org/commands/rclone/>) - Show help for rclone commands, flags and backends. ๐
rclone archive ๐ฆโจ
Perform an action on an archive. Zip-zip hooray ๐
Synopsis
Perform an action on an archive. Requires the use of a subcommand to specify the protocol, e.g.
rclone archive list remote:file.zip
Each subcommand has its own options which you can see in their help.
See rclone archive create (<https://rclone.org/commands/rclone_archive_create/>) for the archive formats supported. ๐๏ธ
rclone archive <action> [opts] <source> [<destination>] [flags]
Options
-h,--helpโ help for archive ๐ซถ
See the global flags page (<https://rclone.org/flags/>) for global options not listed here.
See Also
- rclone (<https://rclone.org/commands/rclone/>) - Show help for rclone commands, flags and backends. ๐
- rclone archive create (<https://rclone.org/commands/rclone_archive_create/>) - Archive source file(s) to destination. ๐ฆ
- rclone archive extract (<https://rclone.org/commands/rclone_archive_extract/>) - Extract archives from source to destination. ๐
- rclone archive list (<https://rclone.org/commands/rclone_archive_list/>) - List archive contents from source. ๐
โจ rclone archive create โจ
Archive source file(s) to destination. ๐๏ธ
๐ธ Synopsis
So basically it creates an archive out of all the files in source:path and drops that archive into dest:path. ๐ And if <destination> isn't even there?? bestie it just writes straight to the console. no cap.
The valid formats for the --format flag are listed below, and if you don't set --format then rclone will guess it from the extension of dest:path (she's observant like that ๐
):
zipโ.ziptarโ.tartar.gzโ.tar.gz,.tgz,.taztar.bz2โ.tar.bz2,.tb2,.tbz,.tbz2,.tz2tar.lzโ.tar.lztar.lz4โ.tar.lz4tar.xzโ.tar.xz,.txztar.zstโ.tar.zst,.tzsttar.brโ.tar.brtar.szโ.tar.sztar.mzโ.tar.mz
The --prefix and --full-path flags control the prefix for the files in the archive. ๐
- If the flag
--full-pathis set then the files will have the full source path as the prefix. - If the flag
--prefix=<value>is set then the files will have<value>as prefix. It's possible to create invalid file names with--prefix=<value>so use with caution. โ ๏ธ Flag--prefixhas priority over--full-path.
Given a directory /sourcedir with the following:
file1.txt
dir1/file2.txt
Running the command rclone archive create /sourcedir /dest.tar.gz will make an archive with the contents:
file1.txt
dir1/
dir1/file2.txt
Running the command rclone archive create --full-path /sourcedir /dest.tar.gz will make an archive with the contents:
sourcedir/file1.txt
sourcedir/dir1/
sourcedir/dir1/file2.txt
Running the command rclone archive create --prefix=my_new_path /sourcedir /dest.tar.gz will make an archive with the contents:
my_new_path/file1.txt
my_new_path/dir1/
my_new_path/dir1/file2.txt
rclone archive create [flags] <source> [<destination>]
๐ฆ Options
--format stringโ Create the archive with format or guess from extension. ๐--full-pathโ Set prefix for files in archive to source path.-h,--helpโ help for create ๐ซถ--prefix stringโ Set prefix for files in archive to entered value or source path.
See the global flags page (https://rclone.org/flags/) for global options not listed here.
๐ See Also
rclone archive(https://rclone.org/commands/rclone_archive/) - Perform an action on an archive.
โจ rclone archive extract โจ
Extract archives from source to destination. ๐ฆ
๐ธ Synopsis
It extracts the archive contents to a destination directory, auto detecting the format because she's a genius. ๐ See rclone archive create (https://rclone.org/commands/rclone_archive_create/) for the archive formats supported.
For example on this archive:
$ rclone archive list --long remote:archive.zip
6 2025-10-30 09:46:23.000000000 file.txt
0 2025-10-30 09:46:57.000000000 dir/
4 2025-10-30 09:46:57.000000000 dir/bye.txt
You can run extract like this
$ rclone archive extract remote:archive.zip remote:extracted
Which gives this result
$ rclone tree remote:extracted
/
โโโ dir
โ โโโ bye.txt
โโโ file.txt
The source or destination or both can be local or remote. ๐
Filters can be used to only extract certain files:
$ rclone archive extract archive.zip partial --include "bye.*"
$ rclone tree partial
/
โโโ dir
โโโ bye.txt
The archive backend (https://rclone.org/archive/) can also be used to extract files. It can be used to read only mount archives also but it supports a different set of archive formats to the archive commands. ๐
rclone archive extract [flags] <source> <destination>
๐ฆ Options
-h,--helpโ help for extract ๐ซถ
See the global flags page (https://rclone.org/flags/) for global options not listed here.
๐ See Also
rclone archive(https://rclone.org/commands/rclone_archive/) - Perform an action on an archive.
โจ rclone archive list โจ
List archive contents from source. ๐
๐ธ Synopsis
Lists the contents of an archive to the console, auto detecting the format (again, she just knows ๐ง). See rclone archive create (https://rclone.org/commands/rclone_archive_create/) for the archive formats supported.
For example:
$ rclone archive list remote:archive.zip
6 file.txt
0 dir/
4 dir/bye.txt
Or with --long flag for more info:
$ rclone archive list --long remote:archive.zip
6 2025-10-30 09:46:23.000000000 file.txt
0 2025-10-30 09:46:57.000000000 dir/
4 2025-10-30 09:46:57.000000000 dir/bye.txt
Or with --plain flag which is useful for scripting:
$ rclone archive list --plain /path/to/archive.zip
file.txt
dir/
dir/bye.txt
Or with --dirs-only:
$ rclone archive list --plain --dirs-only /path/to/archive.zip
dir/
Or with --files-only:
$ rclone archive list --plain --files-only /path/to/archive.zip
file.txt
dir/bye.txt
Filters may also be used:
$ rclone archive list --long archive.zip --include "bye.*"
4 2025-10-30 09:46:57.000000000 dir/bye.txt
The archive backend (https://rclone.org/archive/) can also be used to list files. It can be used to read only mount archives also but it supports a different set of archive formats to the archive commands. ๐
rclone archive list [flags] <source>
๐ฆ Options
--dirs-onlyโ Only list directories.--files-onlyโ Only list files.-h,--helpโ help for list ๐ซถ--longโ List extra attributtes. (yep, that's how it's spelled bestie, we keep it exact ๐ญ*)*--plainโ Only list file names.
See the global flags page (https://rclone.org/flags/) for global options not listed here.
๐ See Also
rclone archive(https://rclone.org/commands/rclone_archive/) - Perform an action on an archive.
โจ rclone authorize โจ
Remote authorization. ๐
๐ธ Synopsis
Remote authorization. Used to authorize a remote or headless rclone from a machine with a browser. Use as instructed by rclone config. See also the remote setup documentation. ๐ฅ๏ธ
The command requires 1-3 arguments:
- Name of a backend (e.g.
"drive","s3") - Either a base64 encoded JSON blob obtained from a previous
rclone configsession - Or a
client_idandclient_secretpair obtained from the remote service
Use --auth-no-open-browser to prevent rclone to open auth link in default browser automatically. ๐
Use --template to generate HTML output via a custom Go template. If a blank string is provided as an argument to this flag, the default template is used.
rclone authorize <backendname> [base64_json_blob | client_id client_secret] [flags]
๐ฆ Options
--auth-no-open-browserโ Do not automatically open auth link in default browser.-h,--helpโ help for authorize ๐ซถ--template stringโ The path to a custom Go template for generating HTML responses.
See the global flags page (https://rclone.org/flags/) for global options not listed here.
๐ See Also
rclone(https://rclone.org/commands/rclone/) - Show help for rclone commands, flags and backends.
โจ rclone backend โจ
Run a backend-specific command. โ๏ธ
๐ธ Synopsis
This runs a backend-specific command. The commands themselves (except for "help" and "features") are defined by the backends and you should see the backend docs for definitions. iykyk ๐
You can discover what commands a backend implements by using
rclone backend help remote:
rclone backend help <backendname>
You can also discover information about the backend using (see operations/fsinfo (https://rclone.org/rc/#operations-fsinfo) in the remote control docs for more info).
rclone backend features remote:
Pass options to the backend command with -o. This should be key=value or key, e.g.:
rclone backend stats remote:path stats -o format=json -o long
Pass arguments to the backend by placing them on the end of the line
rclone backend cleanup remote:path file1 file2 file3
Note to run these commands on a running backend then see backend/command (https://rclone.org/rc/#backend-command) in the rc docs. ๐ฅ
rclone backend <command> remote:path [opts] <args> [flags]
๐ฆ Options
-h,--helpโ help for backend ๐ซถ--jsonโ Always output in JSON format.-o,--option stringArrayโ Option in the formname=valueorname.
Options shared with other commands are described next. See the global flags page (https://rclone.org/flags/) for global options not listed here.
๐ Important Options
Important flags useful for most commands
-n,--dry-runโ Do a trial run with no permanent changes ๐งช-i,--interactiveโ Enable interactive mode-v,--verbose countโ Print lots more stuff (repeat for more) ๐ข
๐ See Also
rclone(https://rclone.org/commands/rclone/) - Show help for rclone commands, flags and backends.
โจ rclone bisync โจ
Perform bidirectional synchronization between two paths. ๐
๐ธ Synopsis
Perform bidirectional synchronization between two paths.
Bisync (https://rclone.org/bisync/) provides a bidirectional cloud sync solution in rclone. It retains the Path1 and Path2 filesystem listings from the prior run. On each successive run it will:
- list files on Path1 and Path2, and check for changes on each side. Changes include New, Newer, Older, and Deleted files.
- Propagate changes on Path1 to Path2, and vice-versa.
Bisync is considered an advanced command, so use with care. ๐ณ Make sure you have read and understood the entire manual (https://rclone.org/bisync) (especially the Limitations (https://rclone.org/bisync/#limitations) section) before using, or data loss can result. Questions can be asked in the Rclone Forum (https://forum.rclone.org/).
See full bisync description (https://rclone.org/bisync/) for details. ๐ฆ
rclone bisync remote1:path1 remote2:path2 [flags]
--backup-dir1string โ the--backup-dirfor Path1. Heads up bestie, it has to be a non-overlapping path living on the same remote.--backup-dir2string โ the--backup-dirfor Path2. Same deal: non-overlapping, same remote.--check-accessโ makes sure the RCLONE_TEST files you expect are actually sitting on both the Path1 and Path2 filesystems. If they're not? It just aborts, no drama.--check-filenamestring โ the filename it looks for when--check-accessis doing its thing. (default:RCLONE_TEST)--check-syncstring โ controls how the final listings get compared:true|false|only(default:true) (default"true")--comparestring โ a comma-separated list of bisync-specific compare options, likesize,modtime,checksum(default:'size,modtime')--conflict-loserConflictLoserAction โ what to do with the loser of a sync conflict (when there is a winner) or with both files (when nobody won):, num, pathname, delete(default:num)--conflict-resolvestring โ auto-resolves conflicts by picking whichever version is:none, path1, path2, newer, older, larger, smaller(default:none) (default"none")--conflict-suffixstring โ the suffix used when you rename a--conflict-loser. It can be a single string, or two comma-separated strings so Path1 and Path2 get their own suffixes. (default:'conflict')--create-empty-src-dirsโ syncs the creating and deleting of empty directories. (Not compatible with--remove-empty-dirs)--download-hashโ computes the hash by downloading when there's no other way to get it. (warning: may be slow and use lots of data!)--filters-filestring โ reads your filtering patterns from a file--forceโ bypasses the--max-deletesafety check and just runs the sync. Consider pairing it with--verbose.-h,--helpโ help for bisync--ignore-listing-checksumโ don't use checksums for listings (add--ignore-checksumtoo if you additionally want to skip the post-copy checksum checks)--max-lockDuration โ treat lock files older than this as expired (default:0(never expire)) (minimum:2m) (default0s)--no-cleanupโ keeps the working files around (so useful for troubleshooting and testing, fr)--no-slow-hashโ ignores listing checksums only on the backends where they're slow--recoverโ automatically recovers from interruptions without needing--resync--remove-empty-dirsโ removes ALL the empty directories at the final cleanup step--resilientโ lets future runs retry after certain less-serious errors instead of forcing you into--resync-1,--resyncโ performs the resync run. Equivalent to--resync-mode path1. Pls pls pls consider--verboseor--dry-runfirst ๐--resync-modestring โ during resync, prefer whichever version is:path1, path2, newer, older, larger, smaller(default:path1if--resync, otherwisenonefor no resync.) (default"none")--slow-hash-sync-onlyโ ignores slow checksums for listings and deltas, but still counts them during sync calls--workdirstring โ use a custom working dir, super handy for testing. (default:$HOME/.cache/rclone/bisync)
Options that are shared with other commands get described right below. For the global options that aren't listed here, go peek at the global flags page at https://rclone.org/flags/ ๐ซถ
๐ Copy Options ๐
The flags for anything that can copy a file
--check-firstโ does ALL the checks before it starts any transfers-c,--checksumโ checks for changes using size & checksum (if it's available, or falls back to size only)--compare-deststringArray โ tosses in extra server-side paths during comparison--copy-deststringArray โ basically implies--compare-destbut also copies the files from those paths into the destination--cutoff-modeHARD|SOFT|CAUTIOUS โ the mode for stopping transfers once you hit the max transfer limit:HARD|SOFT|CAUTIOUS(defaultHARD)--ignore-case-syncโ ignores case while it's synchronizing--ignore-checksumโ skips the post copy check of checksums--ignore-existingโ skips every file that already exists on the destination--ignore-sizeโ ignores size when skipping; uses modtime or checksum instead-I,--ignore-timesโ doesn't skip items that match in size and time, just transfers everything unconditionally--immutableโ never modifies files; fails if existing files got modified--inplaceโ downloads straight into the destination file instead of the atomic download-to-temp-then-rename thing-l,--linksโ translates symlinks to/from regular files using a.rclonelinkextension--max-backlogint โ the max number of objects in the sync or check backlog (default10000)--max-durationDuration โ how long rclone will transfer data for, max (default0s)--max-transferSizeSuffix โ the max amount of data it'll transfer (defaultoff)-M,--metadataโ if set, it preserves metadata when copying objects--modify-windowDuration โ the biggest time diff that still counts as "the same" (default1ns)--multi-thread-chunk-sizeSizeSuffix โ the chunk size for multi-thread downloads/uploads, when the filesystem doesn't set it (default64Mi)--multi-thread-cutoffSizeSuffix โ uses multi-thread downloads for files bigger than this (default256Mi)--multi-thread-streamsint โ how many streams to use for multi-thread downloads (default4)--multi-thread-write-buffer-sizeSizeSuffix โ the in-memory buffer size for writing while in multi-thread mode (default128Ki)--name-transformstringArray โ transforms paths during the copy process--no-check-destโ doesn't check the destination, just copies regardless--no-traverseโ doesn't traverse the destination file system on copy--no-update-dir-modtimeโ doesn't update directory modification times--no-update-modtimeโ doesn't update the destination modtime if the files are identical--order-bystring โ instructions for how to order the transfers, e.g.size,descending--partial-suffixstring โ adds this partial-suffix to the temporary file name when--inplaceis not being used (default".partial")--refresh-timesโ refreshes the modtime of remote files--server-side-across-configsโ lets server-side operations (like copy) work across different configs--size-onlyโ skips based on size only, no modtime or checksum--streaming-upload-cutoffSizeSuffix โ the cutoff for switching to chunked upload when the file size is unknown; the upload starts after it reaches the cutoff or when the file ends (default100Ki)-u,--updateโ skips files that are newer on the destination
โจ Sync Options โจ
The flags used for sync commands
--backup-dirstring โ makes backups into a hierarchy based in DIR--delete-afterโ when synchronizing, deletes the files on the destination after transferring (this is the default)--delete-beforeโ when synchronizing, deletes the files on the destination before transferring--delete-duringโ when synchronizing, deletes the files during transfer--fix-caseโ forces a rename of a case-insensitive dest so it matches the source--ignore-errorsโ deletes even if there are I/O errors--list-cutoffint โ to save memory, sorts directory listings on disk above this threshold (default1000000)--max-deleteint โ when synchronizing, limits the number of deletes (default-1)--max-delete-sizeSizeSuffix โ when synchronizing, limits the total size of the deletes (defaultoff)--suffixstring โ the suffix to add to changed files--suffix-keep-extensionโ preserves the extension when you're using--suffix--track-renamesโ when synchronizing, tracks file renames and does a server-side move if it possibly can--track-renames-strategystring โ the strategies to use when synchronizing with track-renames:hash|modtime|leaf(default"hash")
๐ Important Options ๐
The important flags that are useful for most commands
-n,--dry-runโ does a trial run with zero permanent changes ๐-i,--interactiveโ enables interactive mode-v,--verbosecount โ prints lots more stuff (repeat it for even more)
๐ Filter Options ๐
The flags for filtering directory listings
โฆand the rest of the filter fam, no skips, we list every single one ๐
--delete-excludedโ deletes files on dest that got excluded from sync (yes, it's giving "you're not invited AND we're taking your stuff" ๐)--exclude stringArrayโ excludes files matching pattern--exclude-from stringArrayโ reads exclude patterns from a file (use-to read from stdin)--exclude-if-present stringArrayโ nukes whole directories if that filename is in there--files-from stringArrayโ reads a list of source-file names from a file (use-for stdin)--files-from-raw stringArrayโ same but with zero processing of the lines (use-for stdin)--files-from0 stringArrayโ reads source-file names using NUL as the separator (use-for stdin)-f,--filter stringArrayโ drop in a file filtering rule--filter-from stringArrayโ read your filtering patterns from a file (use-for stdin)--hash-filter stringโ partition filenames by hashk/nor randomly@/n--ignore-caseโ ignore case in filters, so it's case insensitive bestie--include stringArrayโ includes files matching pattern--include-from stringArrayโ reads include patterns from a file (use-for stdin)--max-age Durationโ only transfers files younger than this, insor with the suffixms|s|m|h|d|w|M|y(default off)--max-depth intโ if you set it, it caps the recursion depth right there (default-1)--max-size SizeSuffixโ only transfers files smaller than this, in KiB or with the suffixB|K|M|G|T|P(default off)--metadata-exclude stringArrayโ excludes metadatas matching pattern--metadata-exclude-from stringArrayโ reads metadata exclude patterns from a file (use-for stdin)--metadata-filter stringArrayโ add a metadata filtering rule--metadata-filter-from stringArrayโ read metadata filtering patterns from a file (use-for stdin)--metadata-include stringArrayโ includes metadatas matching pattern--metadata-include-from stringArrayโ reads metadata include patterns from a file (use-for stdin)--min-age Durationโ only transfers files older than this, insor with suffixms|s|m|h|d|w|M|y(default off)--min-size SizeSuffixโ only transfers files bigger than this, in KiB or with suffixB|K|M|G|T|P(default off)
๐ซถ See Also ๐ซถ
- rclone (https://rclone.org/commands/rclone/) โ Show help for rclone commands, flags and backends.
๐ฑ rclone cat ๐ฑ
The greatest hits of "just show me the file already" โ it concatenates any files and yeets them straight to stdout. No cap.
โจ Synopsis โจ
Sends any files to standard output. That's it, that's the whole vibe. ๐
Use it like this to output a single file:
rclone cat remote:path/to/file
Or like this to output every file in dir or any of its subdirectories:
rclone cat remote:path/to/dir
Or like this to output any .txt files in dir or its subdirectories:
rclone --include "*.txt" cat remote:path/to/dir
Now for the main character flags: --head prints only the characters at the start, --tail does the end, and --offset + --count let you print a section right out of the middle. ๐ Heads up tho โ if offset is negative it counts from the end, so --offset -1 --count 1 is equivalent to --tail 1. Iconic.
Use the --separator flag to print a separator value between files. Be sure to shell-escape special characters โ don't be that girl who forgets and then wonders why her output is cursed. ๐ For example, to print a newline between files, use:
- bash:
rclone --include "*.txt" --separator $'\n' cat remote:path/to/dir
- powershell:
rclone --include "*.txt" --separator "`n" cat remote:path/to/dir
rclone cat remote:path [flags]
๐ Options ๐
--count intโ only print N characters (default-1)--discardโ discard the output instead of printing it (produce and ghost, lmao ๐)--head intโ only print the first N characters-h,--helpโ help for cat--offset intโ start printing at offset N (or from the end if it's-ve)--separator stringโ separator to use between objects when printing multiple files--tail intโ only print the last N characters
Options shared with other commands are described next. See the global flags page (https://rclone.org/flags/) for global options not listed here.
๐ธ Filter Options ๐ธ
Flags for filtering directory listings ๐ฆ
--delete-excludedโ Delete files on dest excluded from sync--exclude stringArrayโ Exclude files matching pattern--exclude-from stringArrayโ Read file exclude patterns from file (use-to read from stdin)--exclude-if-present stringArrayโ Exclude directories if filename is present--files-from stringArrayโ Read list of source-file names from file (use-to read from stdin)--files-from-raw stringArrayโ Read list of source-file names from file without any processing of lines (use-to read from stdin)--files-from0 stringArrayโ Read list of source-file names from file using NUL as separator (use-to read from stdin)-f,--filter stringArrayโ Add a file filtering rule--filter-from stringArrayโ Read file filtering patterns from a file (use-to read from stdin)--hash-filter stringโ Partition filenames by hashk/nor randomly@/n--ignore-caseโ Ignore case in filters (case insensitive)--include stringArrayโ Include files matching pattern--include-from stringArrayโ Read file include patterns from file (use-to read from stdin)--max-age Durationโ Only transfer files younger than this insor suffixms|s|m|h|d|w|M|y(default off)--max-depth intโ If set limits the recursion depth to this (default-1)--max-size SizeSuffixโ Only transfer files smaller than this in KiB or suffixB|K|M|G|T|P(default off)--metadata-exclude stringArrayโ Exclude metadatas matching pattern--metadata-exclude-from stringArrayโ Read metadata exclude patterns from file (use-to read from stdin)--metadata-filter stringArrayโ Add a metadata filtering rule--metadata-filter-from stringArrayโ Read metadata filtering patterns from a file (use-to read from stdin)--metadata-include stringArrayโ Include metadatas matching pattern--metadata-include-from stringArrayโ Read metadata include patterns from file (use-to read from stdin)--min-age Durationโ Only transfer files older than this insor suffixms|s|m|h|d|w|M|y(default off)--min-size SizeSuffixโ Only transfer files bigger than this in KiB or suffixB|K|M|G|T|P(default off)
โญ Listing Options โญ
Flags for listing directories ๐
--default-time Timeโ Time to show if modtime is unknown for files and directories (default2000-01-01T00:00:00Z)--fast-listโ Use recursive list if available; uses more memory but fewer transactions
๐ซถ See Also ๐ซถ
- rclone (https://rclone.org/commands/rclone/) โ Show help for rclone commands, flags and backends.
๐ rclone checksum ๐
Checks the files in the destination against a SUM file. No cap. ๐ซถ
โจ Synopsis โจ
Okay bestie, so this one checks that the hashsums of your destination files actually match the SUM file you gave it. It compares hashes (MD5, SHA1, etc) and then logs you a whole lil report of the files that don't match. And the most important part: it doesn't alter the file system. It's just looking, never touching. Queen behavior honestly. ๐
The sumfile is treated as the source and the dst:path is treated as the destination, as far as the output is concerned. So like, keep that flipped-in-your-head framing, it matters.
If you pass the --download flag, it will literally download the data from the remote and calculate the content hash on the fly. Super useful for remotes that don't support hashes, or if you're just that girl who really wants to check ALL the data. ๐ฅ
Heads up: hash values inside the SUM file are treated as case insensitive. So chill, casing doesn't matter here.
If you pass --one-way, it only checks that the files in the source match the files in the destination โ not the other way around. Which means extra files sitting in the destination that aren't in the source? Yeah those will not be detected. ๐
The --differ, --missing-on-dst, --missing-on-src, --match and --error flags all write paths, one per line, to the file name you supply (or to stdout if it's -). What exactly they write is described in the help below. Like for example --differ writes all the paths that show up on both the source and destination but are different.
The --combined flag writes a file (or stdout) that has every file path with a symbol, then a space, then the path โ telling you what happened to it. These are giving very much diff-file energy. ๐ฆ
= pathmeans path was found in the source and destination and was identical- pathmeans path was missing on the source, so it only exists in the destination+ pathmeans path was missing on the destination, so it only exists in the source* pathmeans path was present in the source and destination but different! pathmeans there was an error reading or hashing the source or dest
The default number of parallel checks is 8. See the --checkers (https://rclone.org/docs/#checkers-int) option for more on that. โจ
rclone checksum <hash> sumfile dst:path [flags]
๐ธ Options ๐ธ
--combined stringโ Make a combined report of changes to this file--differ stringโ Report all non-matching files to this file--downloadโ Check by hashing the contents--error stringโ Report all files with errors (hashing or reading) to this file-h,--helpโ help for checksum--match stringโ Report all matching files to this file--missing-on-dst stringโ Report all files missing from the destination to this file--missing-on-src stringโ Report all files missing from the source to this file--one-wayโ Check one way only, source files must exist on remote
Options shared with other commands are described next. See the global flags page (https://rclone.org/flags/) for global options not listed here. ๐
๐ Filter Options ๐
Flags for filtering directory listings
--delete-excludedโ Delete files on dest excluded from sync--exclude stringArrayโ Exclude files matching pattern--exclude-from stringArrayโ Read file exclude patterns from file (use-to read from stdin)--exclude-if-present stringArrayโ Exclude directories if filename is present--files-from stringArrayโ Read list of source-file names from file (use-to read from stdin)--files-from-raw stringArrayโ Read list of source-file names from file without any processing of lines (use-to read from stdin)--files-from0 stringArrayโ Read list of source-file names from file using NUL as separator (use-to read from stdin)-f,--filter stringArrayโ Add a file filtering rule--filter-from stringArrayโ Read file filtering patterns from a file (use-to read from stdin)--hash-filter stringโ Partition filenames by hash k/n or randomly @/n--ignore-caseโ Ignore case in filters (case insensitive)--include stringArrayโ Include files matching pattern--include-from stringArrayโ Read file include patterns from file (use-to read from stdin)--max-age Durationโ Only transfer files younger than this in s or suffix ms|s|m|h|d|w|M|y (default off)--max-depth intโ If set limits the recursion depth to this (default-1)--max-size SizeSuffixโ Only transfer files smaller than this in KiB or suffix B|K|M|G|T|P (default off)--metadata-exclude stringArrayโ Exclude metadatas matching pattern--metadata-exclude-from stringArrayโ Read metadata exclude patterns from file (use-to read from stdin)--metadata-filter stringArrayโ Add a metadata filtering rule--metadata-filter-from stringArrayโ Read metadata filtering patterns from a file (use-to read from stdin)--metadata-include stringArrayโ Include metadatas matching pattern--metadata-include-from stringArrayโ Read metadata include patterns from file (use-to read from stdin)--min-age Durationโ Only transfer files older than this in s or suffix ms|s|m|h|d|w|M|y (default off)--min-size SizeSuffixโ Only transfer files bigger than this in KiB or suffix B|K|M|G|T|P (default off)
๐ Listing Options ๐
Flags for listing directories
--default-time Timeโ Time to show if modtime is unknown for files and directories (default2000-01-01T00:00:00Z)--fast-listโ Use recursive list if available; uses more memory but fewer transactions
๐ See Also ๐
- rclone (https://rclone.org/commands/rclone/) โ Show help for rclone commands, flags and backends.
๐ rclone completion ๐
Output completion script for a given shell.
โจ Synopsis โจ
Generates a shell completion script for rclone. Run it with --help to list the supported shells. Bestie, tab-completion is a lifestyle. โญ
๐ธ Options ๐ธ
-h,--helpโ help for completion
See the global flags page (https://rclone.org/flags/) for global options not listed here.
๐ See Also ๐
- rclone (https://rclone.org/commands/rclone/) โ Show help for rclone commands, flags and backends.
- rclone completion bash (https://rclone.org/commands/rclone_completion_bash/) โ Output bash completion script for rclone.
- rclone completion fish (https://rclone.org/commands/rclone_completion_fish/) โ Output fish completion script for rclone.
- rclone completion powershell (https://rclone.org/commands/rclone_completion_powershell/) โ Output powershell completion script for rclone.
- rclone completion zsh (https://rclone.org/commands/rclone_completion_zsh/) โ Output zsh completion script for rclone.
๐ rclone completion bash ๐
Output bash completion script for rclone.
โจ Synopsis โจ
Generates a bash shell autocompletion script for rclone.
So by default, when you run it with no arguments at all:
rclone completion bash
the generated script gets written to:
/etc/bash_completion.d/rclone
which means rclone will probably need to be run as root, or with sudo. ๐ญ (the classic "why do I need permission for everything" moment)
But if you supply a path to a file as the command line argument, then the generated script gets written to that file instead โ and in that case you should not need root privileges. Slay. ๐
If output_file is "-", then the output will be written to stdout.
If you've installed the script into the default location, you can just log out and log in again to use the autocompletion script.
Or alternatively, you can source the script directly:
. /path/to/my_bash_completion_scripts/rclone
and the autocompletion functionality gets added to your current shell right then and there. Gorgeous. โจ
rclone completion bash [output_file] [flags]
๐ธ Options ๐ธ
-h,--helpโ help for bash
See the global flags page (https://rclone.org/flags/) for global options not listed here.
๐ See Also ๐
- rclone completion (https://rclone.org/commands/rclone_completion/) โ Output completion script for a given shell.
๐ rclone completion fish ๐
Output fish completion script for rclone.
โจ Synopsis โจ
Generates a fish autocompletion script for rclone.
This writes to /etc/fish/completions/rclone.fish by default, so it will probably need to be run with sudo or as root, like:
sudo rclone completion fish
Logout and login again to use the autocompletion scripts, or source them directly:
. /etc/fish/completions/rclone.fish
If you supply a command line argument the script will be written there.
If output_file is "-", then the output will be written to stdout.
rclone completion fish [output_file] [flags]
๐ธ Options ๐ธ
-h,--helpโ help for fish
See the global flags page (https://rclone.org/flags/) for global options not listed here.
๐ See Also ๐
- rclone completion (https://rclone.org/commands/rclone_completion/) โ Output completion script for a given shell.
๐ฆ rclone completion powershell ๐ฆ
Output powershell completion script for rclone.
โจ Synopsis โจ
Generate the autocompletion script for powershell.
To load completions in your current shell session:
rclone completion powershell | Out-String | Invoke-Expression
To load completions for every new session, add the output of the above command to your powershell profile.
If output_file is "-" or missing, then the output will be written to stdout.
rclone completion powershell [output_file] [flags]
๐ธ Options ๐ธ
-h,--helpโ help for powershell
See the global flags page (https://rclone.org/flags/) for global options not listed here.
๐ See Also ๐
- rclone completion (https://rclone.org/commands/rclone_completion/) โ Output completion script for a given shell.
๐ธ rclone completion zsh ๐ธ
Output zsh completion script for rclone.
โจ Synopsis โจ
Generates a zsh autocompletion script for rclone.
This writes to /usr/share/zsh/vendor-completions/_rclone by default, so it will probably need to be run with sudo or as root, like:
sudo rclone completion zsh
Logout and login again to use the autocompletion scripts, or source them directly:
autoload -U compinit && compinit
If you supply a command line argument the script will be written there.
If output_file is "-", then the output will be written to stdout.
rclone completion zsh [output_file] [flags]
๐ธ Options ๐ธ
-h,--helpโ help for zsh
See the global flags page (https://rclone.org/flags/) for global options not listed here.
๐ See Also ๐
- rclone completion (https://rclone.org/commands/rclone_completion/) โ Output completion script for a given shell.
๐ rclone config create ๐
Create a new remote with name, type and options. no cap, it's the glow-up command ๐
Synopsis
Create a new remote of name with type and options. Those options get passed in as pairs of key value, or as key=value. either way bestie, both work ๐
So like, if you wanna make a swift remote called myremote using auto config, you'd do:
rclone config create myremote swift env_auth true
rclone config create myremote swift env_auth=true
And say you wanted to configure a Google Drive remote but using remote authorization, you'd do this:
rclone config create mydrive drive config_is_local=false
Big note: if the config process would normally ask you a question, the default is taken (unless --non-interactive is used). And every single time that happens, rclone will print or DEBUG a message telling you how to affect the value that got taken. so you're never just guessing ๐ซถ
If any of the parameters you pass is a password field, rclone will automatically obscure them for you โ if they aren't already obscured โ before putting them into the config file. โจ
NB: If the password parameter is 22 characters or longer and consists only of base64 characters, then rclone can get confused about whether the password is already obscured or not, and put unobscured passwords into the config file. ๐ญ If you want to be 100% certain that the passwords get obscured, use the--obscureflag. Or if you are 100% certain you are already passing obscured passwords, then use--no-obscure. You can also set obscured passwords using therclone config passwordcommand.
The --non-interactive flag is for apps that wanna configure rclone themselves instead of using rclone's text based configuration questions. If this flag is set, and rclone needs to ask the user a question, a JSON blob will be returned with the question in it. it's giving very structured, very demure ๐
It'll look something like (some irrelevant detail removed):
{
"State": "*oauth-islocal,teamdrive,,",
"Option": {
"Name": "config_is_local",
"Help": "Use web browser to automatically authenticate rclone with remote?\n * Say Y if the machine running rclone has a web browser you can use\n * Say N if running rclone on a (remote) machine without web browser access\nIf not sure try Y. If Y failed, try N.\n",
"Default": true,
"Examples": [
{
"Value": "true",
"Help": "Yes"
},
{
"Value": "false",
"Help": "No"
}
],
"Required": false,
"IsPassword": false,
"Type": "bool",
"Exclusive": true,
},
"Error": "",
}
The format of Option is the same as returned by rclone config providers. The question should be asked to the user and returned to rclone as the --result option along with the --state parameter.
The keys of Option are used as follows:
Nameโ name of variable โ show to userHelpโ help text. Hard wrapped at 80 chars. Any URLs should be clicky.Defaultโ default value โ return this if the user just wants the default.Examplesโ the user should be able to choose one of theseRequiredโ the value should be non-emptyIsPasswordโ the value is a password and should be edited as suchTypeโ type of value, egbool,string,intand othersExclusiveโ if set no free-form entry allowed only theExamples- Irrelevant keys
Provider,ShortOpt,Hide,NoPrefix,Advanced
If Error is set then it should be shown to the user at the same time as the question. ๐
rclone config update name --continue --state "*oauth-islocal,teamdrive,," --result "true"
Note that when using --continue all passwords should be passed in the clear (not obscured). And any default config values should be passed in with each invocation of --continue. literally every time, don't skip it ๐
At the end of the non interactive process, rclone will return a result with State as empty string. that's the finish line ๐
If --all is passed then rclone will ask all the config questions, not just the post config questions. Any parameters are used as defaults for questions as usual.
Note that bin/config.py in the rclone source implements this protocol as a readable demonstration. iconic of it tbh ๐ง
rclone config create name type [key value]* [flags]
โจ Options โจ
--allโ Ask the full set of config questions--continueโ Continue the configuration process with an answer-h,--helpโ help for create--no-obscureโ Force any passwords not to be obscured--no-outputโ Don't provide any output--non-interactiveโ Don't interact with user and return questions--obscureโ Force any passwords to be obscured--result stringโ Result - use with--continue--state stringโ State - use with--continue
See the global flags page (https://rclone.org/flags/) for global options not listed here.
๐ See Also ๐
- rclone config (https://rclone.org/commands/rclone_config/) - Enter an interactive configuration session.
๐ rclone config delete ๐
Delete an existing remote. bye bestie, we hardly knew ye ๐ญ
rclone config delete name [flags]
Options
-h,--helpโ help for delete
See the global flags page (https://rclone.org/flags/) for global options not listed here.
See Also
- rclone config (https://rclone.org/commands/rclone_config/) - Enter an interactive configuration session.
๐ฆ rclone config disconnect ๐ฆ
Disconnects user from remote ๐ซถ
Synopsis
This disconnects the remote: passed in to the cloud storage system.
This normally means revoking the oauth token. yeah, the token is GONE, we said what we said ๐
To reconnect use rclone config reconnect.
rclone config disconnect remote: [flags]
Options
-h,--helpโ help for disconnect
See the global flags page (https://rclone.org/flags/) for global options not listed here.
See Also
- rclone config (https://rclone.org/commands/rclone_config/) - Enter an interactive configuration session.
โญ rclone config dump โญ
Dump the config file as JSON. raw. unfiltered. unhinged. ๐ฅ
rclone config dump [flags]
Options
-h,--helpโ help for dump
See the global flags page (https://rclone.org/flags/) for global options not listed here.
See Also
- rclone config (https://rclone.org/commands/rclone_config/) - Enter an interactive configuration session.
๐ rclone config edit ๐
Enter an interactive configuration session.
Synopsis
Enter an interactive configuration session where you can setup new remotes and manage existing ones. You may also set or remove a password to protect your configuration. main character energy fr fr ๐
rclone config edit [flags]
Options
-h,--helpโ help for edit
See the global flags page (https://rclone.org/flags/) for global options not listed here.
See Also
- rclone config (https://rclone.org/commands/rclone_config/) - Enter an interactive configuration session.
๐ rclone config encryption ๐
set, remove and check the encryption for the config file โ lock it down, bestie ๐
Synopsis
This command sets, clears and checks the encryption for the config file using the subcommands below.
Options
-h,--helpโ help for encryption
See the global flags page (https://rclone.org/flags/) for global options not listed here.
See Also
- rclone config (https://rclone.org/commands/rclone_config/) - Enter an interactive configuration session.
- rclone config encryption check (https://rclone.org/commands/rclone_config_encryption_check/) - Check that the config file is encrypted
- rclone config encryption remove (https://rclone.org/commands/rclone_config_encryption_remove/) - Remove the config file encryption password
- rclone config encryption set (https://rclone.org/commands/rclone_config_encryption_set/) - Set or change the config file encryption password
๐ธ rclone config encryption check ๐ธ
Check that the config file is encrypted โ
Synopsis
This checks the config file is encrypted and that you can decrypt it.
It will attempt to decrypt the config using the password you supply.
If decryption fails it will return a non-zero exit code if using --password-command, otherwise it will prompt again for the password.
If the config file is not encrypted it will return a non zero exit code.
rclone config encryption check [flags]
Options
-h,--helpโ help for check
See the global flags page (https://rclone.org/flags/) for global options not listed here.
See Also
- rclone config encryption (https://rclone.org/commands/rclone_config_encryption/) - set, remove and check the encryption for the config file
๐ง rclone config encryption remove ๐ง
Remove the config file encryption password ๐
Synopsis
Remove the config file encryption password
This removes the config file encryption, returning it to un-encrypted. it's giving "we're so back" ๐
If --password-command is in use, this will be called to supply the old config password.
If the config was not encrypted then no error will be returned and this command will do nothing. so chill, it's fine ๐ซถ
rclone config encryption remove [flags]
Options
-h,--helpโ help for remove
See the global flags page (https://rclone.org/flags/) for global options not listed here.
See Also
- rclone config encryption (https://rclone.org/commands/rclone_config_encryption/) - set, remove and check the encryption for the config file
๐ธ rclone config encryption set ๐ธ
Set or change the config file encryption password. Like, glow-up time for your password bestie. ๐
โจ Synopsis โจ
This command sets or changes the config file encryption password.
If there was no config password set, then it sets a new one. If there was one already, it changes the existing config password. Either way, you're covered. ๐ซถ
Heads up bestie: if you're changing an encryption password using --password-command, then that command gets called once to decrypt the config using the old password, and then again to read the new password so it can re-encrypt the config. Two calls, two jobs, no confusion. ๐ญ
When --password-command is called to change the password, the environment variable RCLONE_PASSWORD_CHANGE=1 will be set. So if you're changing passwords programmatically, you can use that environment variable to distinguish which password you must supply. iykyk โจ
Alternatively you can remove the password first (with rclone config encryption remove), then set it again with this command โ which may be easier if you don't mind the unencrypted config file being on the disk briefly. ๐
rclone config encryption set [flags]
โจ Options โจ
-h,--helpโ help for set
See the global flags page (https://rclone.org/flags/) for global options not listed here.
โจ See Also โจ
rclone config encryption(https://rclone.org/commands/rclone_config_encryption/) โ set, remove and check the encryption for the config file
๐ rclone config file ๐
Show path of configuration file in use. Like, where IS the config at?? Let's find out. ๐ฆ
rclone config file [flags]
โจ Options โจ
-h,--helpโ help for file
See the global flags page (https://rclone.org/flags/) for global options not listed here.
โจ See Also โจ
rclone config(https://rclone.org/commands/rclone_config/) โ Enter an interactive configuration session.
๐ rclone config password ๐
Update password in an existing remote.
โจ Synopsis โจ
Update an existing remote's password. The password should be passed in pairs of key password or as key=password. The password should be passed in in clear (unobscured). ๐ณ No hiding, bestie.
For example, to set password of a remote of name myremote you would do:
rclone config password myremote fieldname mypassword
rclone config password myremote fieldname=mypassword
Obsolete alert!! This command is obsolete now thatconfig updateandconfig createboth support obscuring passwords directly. It's giving legacy. ๐
rclone config password name [key value]+ [flags]
โจ Options โจ
-h,--helpโ help for password
See the global flags page (https://rclone.org/flags/) for global options not listed here.
โจ See Also โจ
rclone config(https://rclone.org/commands/rclone_config/) โ Enter an interactive configuration session.
๐ง rclone config paths ๐ง
Show paths used for configuration, cache, temp etc. Like a lil tour of everywhere rclone keeps its stuff. ๐ โจ
rclone config paths [flags]
โจ Options โจ
-h,--helpโ help for paths
See the global flags page (https://rclone.org/flags/) for global options not listed here.
โจ See Also โจ
rclone config(https://rclone.org/commands/rclone_config/) โ Enter an interactive configuration session.
๐ rclone config providers ๐
List in JSON format all the providers and options. All of them. Every single one. JSON girlies rise. ๐ฅ
rclone config providers [flags]
โจ Options โจ
-h,--helpโ help for providers
See the global flags page (https://rclone.org/flags/) for global options not listed here.
โจ See Also โจ
rclone config(https://rclone.org/commands/rclone_config/) โ Enter an interactive configuration session.
๐ฆ rclone config reconnect ๐ฆ
Re-authenticates user with remote. The oauth flow is BACK and it wants your whole attention. ๐ญ
โจ Synopsis โจ
This reconnects remote: passed in to the cloud storage system.
To disconnect the remote use rclone config disconnect.
This normally means going through the interactive oauth flow again. Yes, again. Sit down, click the link, it's fine. ๐ซถ
rclone config reconnect remote: [flags]
โจ Options โจ
-h,--helpโ help for reconnect
See the global flags page (https://rclone.org/flags/) for global options not listed here.
โจ See Also โจ
rclone config(https://rclone.org/commands/rclone_config/) โ Enter an interactive configuration session.
๐ rclone config redacted ๐
Print redacted (decrypted) config file, or the redacted config for a single remote.
โจ Synopsis โจ
This prints a redacted copy of the config file โ either the whole config file or for a given remote.
The config file will be redacted by replacing all passwords and other sensitive info with XXX. โจ Censored, slay, privacy icon behavior.
This makes the config file suitable for posting online for support.
โ ๏ธ It should be double checked before posting, as the redaction may not be perfect. ๐ Like, go through it yourself, bestie. Please.
rclone config redacted [<remote>] [flags]
โจ Options โจ
-h,--helpโ help for redacted
See the global flags page (https://rclone.org/flags/) for global options not listed here.
โจ See Also โจ
rclone config(https://rclone.org/commands/rclone_config/) โ Enter an interactive configuration session.
๐ rclone config show ๐
Print (decrypted) config file, or the config for a single remote. No XXXs here, this is the real deal, so maybe don't post it on the internet, okay bestie? ๐
rclone config show [<remote>] [flags]
โจ Options โจ
-h,--helpโ help for show
See the global flags page (https://rclone.org/flags/) for global options not listed here.
โจ See Also โจ
rclone config(https://rclone.org/commands/rclone_config/) โ Enter an interactive configuration session.
โจ rclone config string โจ
Print connection string for a single remote. One line, all the info, iconic. ๐
โจ Synopsis โจ
Print a connection string for a single remote.
The connection strings (https://rclone.org/docs/#connection-strings) can be used wherever a remote is needed, and can be more convenient than using the config file โ especially if using the RC API. ๐ฅ
Backend parameters may be provided to the command also.
Example:
$ rclone config string s3:rclone --s3-no-check-bucket
:s3,access_key_id=XXX,no_check_bucket,provider=AWS,region=eu-west-2,secret_access_key=YYY:rclone
NB the strings are not quoted for use in shells (eg bash, powershell, windows cmd). Most will work if enclosed in "double quotes", however connection strings that contain double quotes will require further quoting which is very shell dependent. ๐ญ Shells are like that.
rclone config string <remote> [flags]
โจ Options โจ
-h,--helpโ help for string
See the global flags page (https://rclone.org/flags/) for global options not listed here.
โจ See Also โจ
rclone config(https://rclone.org/commands/rclone_config/) โ Enter an interactive configuration session.
๐ธ rclone config touch ๐ธ
Ensure configuration file exists. Just making sure the config file is there, existing, doing its lil thing. ๐
rclone config touch [flags]
โจ Options โจ
-h,--helpโ help for touch
See the global flags page (https://rclone.org/flags/) for global options not listed here.
โจ See Also โจ
rclone config(https://rclone.org/commands/rclone_config/) โ Enter an interactive configuration session.
๐ซถ rclone config unset ๐ซถ
Unset options in an existing remote.
โจ Synopsis โจ
Remove one or more options from an existing remote. The options to remove should be passed in as a list of key names.
For example, to remove the client_id and client_secret options from a remote of name myremote you would do:
rclone config unset myremote client_id client_secret
This removes the keys from the config file entirely, which is different from setting them to an empty string with config update. Removing a key restores rclone's default behaviour for that option, whereas setting it to an empty string overrides the default with an empty value. ๐
Two very different vibes, fr fr.
You can't unset thetypeof a remote โ useconfig deleteto remove the whole remote instead. ๐๏ธ
rclone config unset name [key]+ [flags]
โจ Options โจ
-h,--helpโ help for unset
See the global flags page (https://rclone.org/flags/) for global options not listed here.
โจ See Also โจ
rclone config(https://rclone.org/commands/rclone_config/) โ Enter an interactive configuration session.
๐ rclone config update
Update options in an existing remote. Yes bestie, we're editing a remote that already exists. ๐ง
โจ Synopsis
Update an existing remote's options. The options get passed in as pairs of key value, or as key=value. Either one, we don't gatekeep.
So like, if you wanted to update the env_auth field of a remote called myremote, you'd do:
rclone config update myremote env_auth true
rclone config update myremote env_auth=true
And if the remote uses OAuth, the token is gonna get updated too โ so if you do not want that, just toss in an extra parameter like this:
rclone config update myremote env_auth=true config_refresh_token=false
Major note: if the config process would normally ask you a question, the default is what gets taken (unless --non-interactive is passed). Every single time that happens, rclone will print โ or DEBUG โ a message telling you how to affect the value that got taken. So it's not ghosting you, it's just being quiet about it. ๐ธ
Now, if any of the parameters you pass is a password field, rclone will automatically obscure it if it isn't already obscured before it lands in the config file. Considerate king behavior. ๐
NB โ if the password parameter is 22 characters or longer and consists only of base64 characters, rclone can get confused about whether the password is already obscured or not, and it will put unobscured passwords into the config file. ๐จ If you want to be 100% certain the passwords get obscured, use the--obscureflag. If you are 100% certain you're already passing obscured passwords, use--no-obscure. You can also set obscured passwords using therclone config passwordcommand. Pick your fighter.
The --non-interactive flag is for applications that wanna configure rclone themselves instead of using rclone's text-based configuration questions. If this flag is set and rclone needs to ask the user a question, a JSON blob comes back with the question inside it. It's giving very "let the robots talk" and honestly? iconic. ๐คโจ
That blob looks something like this (some irrelevant detail removed):
{
"State": "*oauth-islocal,teamdrive,,",
"Option": {
"Name": "config_is_local",
"Help": "Use web browser to automatically authenticate rclone with remote?\n * Say Y if the machine running rclone has a web browser you can use\n * Say N if running rclone on a (remote) machine without web browser access\nIf not sure try Y. If Y failed, try N.\n",
"Default": true,
"Examples": [
{
"Value": "true",
"Help": "Yes"
},
{
"Value": "false",
"Help": "No"
}
],
"Required": false,
"IsPassword": false,
"Type": "bool",
"Exclusive": true,
},
"Error": "",
}
The format of Option is the same as what rclone config providers returns. The question should be asked to the user and returned to rclone as the --result option, along with the --state parameter. Teamwork, fr fr.
The keys of Option are used like this:
- Name โ name of variable โ show to user
- Help โ help text. Hard wrapped at 80 chars. Any URLs should be clicky.
- Default โ default value โ return this if the user just wants the default
- Examples โ the user should be able to choose one of these
- Required โ the value should be non-empty
- IsPassword โ the value is a password and should be edited as such
- Type โ type of value, eg
bool,string,intand others - Exclusive โ if set, no free-form entry allowed, only the Examples
- Irrelevant keys
Provider,ShortOpt,Hide,NoPrefix,Advanced
If Error is set, then it should be shown to the user at the same time as the question. Don't hide it, that's rude. ๐
rclone config update name --continue --state "*oauth-islocal,teamdrive,," --result "true"
Heads up: when you're using --continue, all passwords should be passed in the clear (not obscured). And any default config values should be passed in with each invocation of --continue. Every time. No skipping. ๐
At the end of the non-interactive process, rclone will return a result with State as an empty string. That's the little "we're done here" signal. ๐
If --all is passed, then rclone will ask all the config questions, not just the post config questions. Any parameters are used as defaults for questions, as usual.
Oh and also โ bin/config.py in the rclone source implements this protocol as a readable demonstration. Cute little reference implementation, lowkey a great place to snoop for how it all works. ๐ฆ
rclone config update name [key value]+ [flags]
โญ Options
--allโ Ask the full set of config questions--continueโ Continue the configuration process with an answer-h,--helpโ help for update--no-obscureโ Force any passwords not to be obscured--no-outputโ Don't provide any output--non-interactiveโ Don't interact with user and return questions--obscureโ Force any passwords to be obscured--result stringโ Result - use with--continue--state stringโ State - use with--continue
See the global flags page (https://rclone.org/flags/) for global options not listed here.
๐ See Also
rclone config(https://rclone.org/commands/rclone_config/) โ Enter an interactive configuration session.
๐ซถ rclone config userinfo
Prints info about logged in user of remote. Yes, it's a little stalker-ish but for yourself. ๐
โจ Synopsis
This prints the details of the person logged in to the cloud storage system. Very "who am I on this server" energy and honestly sometimes you just need to know. ๐
rclone config userinfo remote: [flags]
โญ Options
-h,--helpโ help for userinfo--jsonโ Format output as JSON
See the global flags page (https://rclone.org/flags/) for global options not listed here.
๐ See Also
rclone config(https://rclone.org/commands/rclone_config/) โ Enter an interactive configuration session.
๐ง rclone convmv
Convert file and directory names in place. Glow-up for your filenames, no cap. โจ
โจ Synopsis
convmv supports advanced path name transformations for converting and renaming files and directories by applying prefixes, suffixes, and other alterations. It's the makeover montage but for path strings. ๐
--name-transform prefix=XXXXโ PrependsXXXXto the file name.--name-transform suffix=XXXXโ AppendsXXXXto the file name after the extension.--name-transform suffix_keep_extension=XXXXโ AppendsXXXXto the file name while preserving the original file extension.--name-transform trimprefix=XXXXโ RemovesXXXXif it appears at the start of the file name.--name-transform trimsuffix=XXXXโ RemovesXXXXif it appears at the end of the file name.--name-transform regex=pattern/replacementโ Applies a regex-based transformation.--name-transform replace=old:newโ Replaces occurrences ofoldwithnewin the file name.--name-transform date={YYYYMMDD}โ Appends or prefixes the specified date format.--name-transform truncate=Nโ Truncates the file name to a maximum ofNcharacters.--name-transform truncate_keep_extension=Nโ Truncates the file name to a maximum ofNcharacters while preserving the original file extension.--name-transform truncate_bytes=Nโ Truncates the file name to a maximum ofNbytes (not characters).--name-transform truncate_bytes_keep_extension=Nโ Truncates the file name to a maximum ofNbytes (not characters) while preserving the original file extension.--name-transform base64encodeโ Encodes the file name in Base64.--name-transform base64decodeโ Decodes a Base64-encoded file name.--name-transform encoder=ENCODINGโ Converts the file name to the specified encoding (e.g.,ISO-8859-1,Windows-1252,Macintosh).--name-transform decoder=ENCODINGโ Decodes the file name from the specified encoding.--name-transform charmap=MAPโ Applies a character mapping transformation.--name-transform lowercaseโ Converts the file name to lowercase.--name-transform uppercaseโ Converts the file name to UPPERCASE.--name-transform titlecaseโ Converts the file name to Title Case.--name-transform asciiโ Strips non-ASCII characters.--name-transform urlโ URL-encodes the file name.--name-transform nfcโ Converts the file name to NFC Unicode normalization form.--name-transform nfdโ Converts the file name to NFD Unicode normalization form.--name-transform nfkcโ Converts the file name to NFKC Unicode normalization form.--name-transform nfkdโ Converts the file name to NFKD Unicode normalization form.--name-transform command=/path/to/my/programโ Executes an external program to transform file names.
Conversion modes:
none
nfc
nfd
nfkc
nfkd
replace
prefix
suffix
suffix_keep_extension
trimprefix
trimsuffix
index
date
truncate
truncate_keep_extension
truncate_bytes
truncate_bytes_keep_extension
base64encode
base64decode
encoder
decoder
ISO-8859-1
Windows-1252
Macintosh
charmap
lowercase
uppercase
titlecase
ascii
url
regex
command
Char maps:
โฆand the rest of the charmap menu just keeps going, bestie, no skips:
IBM-Code-Page-037IBM-Code-Page-437IBM-Code-Page-850IBM-Code-Page-852IBM-Code-Page-855Windows-Code-Page-858IBM-Code-Page-860IBM-Code-Page-862IBM-Code-Page-863IBM-Code-Page-865IBM-Code-Page-866IBM-Code-Page-1047IBM-Code-Page-1140ISO-8859-1ISO-8859-2ISO-8859-3ISO-8859-4ISO-8859-5ISO-8859-6ISO-8859-7ISO-8859-8ISO-8859-9ISO-8859-10ISO-8859-13ISO-8859-14ISO-8859-15ISO-8859-16KOI8-RKOI8-UMacintoshMacintosh-CyrillicWindows-874Windows-1250Windows-1251Windows-1252Windows-1253Windows-1254Windows-1255Windows-1256Windows-1257Windows-1258X-User-Defined
Encoding masks โ the other little squad of names you can hand to the encoder transform ๐ :
AsteriskBackQuoteBackSlashColonCrLfCtlDelDollarDotDoubleQuoteExclamationHashInvalidUtf8LeftCrLfHtVtLeftPeriodLeftSpaceLeftTildeLtGtNonePercentPipeQuestionRawRightCrLfHtVtRightPeriodRightSpaceSemicolonSingleQuoteSlashSquareBracket
โจ Examples โจ
okay no cap this is the fun part, watch the glow-ups happen in real time ๐ฆ:
rclone convmv "stories/The Quick Brown Fox!.txt" --name-transform "all,uppercase"
// Output: STORIES/THE QUICK BROWN FOX!.TXT
rclone convmv "stories/The Quick Brown Fox!.txt" --name-transform "all,replace=Fox:Turtle" --name-transform "all,replace=Quick:Slow"
// Output: stories/The Slow Brown Turtle!.txt
rclone convmv "stories/The Quick Brown Fox!.txt" --name-transform "all,base64encode"
// Output: c3Rvcmllcw==/VGhlIFF1aWNrIEJyb3duIEZveCEudHh0
rclone convmv "c3Rvcmllcw==/VGhlIFF1aWNrIEJyb3duIEZveCEudHh0" --name-transform "all,base64decode"
// Output: stories/The Quick Brown Fox!.txt
rclone convmv "stories/The Quick Brown ๐ฆ Fox Went to the Cafรฉ!.txt" --name-transform "all,nfc"
// Output: stories/The Quick Brown ๐ฆ Fox Went to the Cafรฉ!.txt
rclone convmv "stories/The Quick Brown ๐ฆ Fox Went to the Cafรฉ!.txt" --name-transform "all,nfd"
// Output: stories/The Quick Brown ๐ฆ Fox Went to the Cafe!.txt
rclone convmv "stories/The Quick Brown ๐ฆ Fox!.txt" --name-transform "all,ascii"
// Output: stories/The Quick Brown Fox!.txt
rclone convmv "stories/The Quick Brown Fox!.txt" --name-transform "all,trimsuffix=.txt"
// Output: stories/The Quick Brown Fox!
rclone convmv "stories/The Quick Brown Fox!.txt" --name-transform "all,prefix=OLD_"
// Output: OLD_stories/OLD_The Quick Brown Fox!.txt
rclone convmv "stories/The Quick Brown ๐ฆ Fox Went to the Cafรฉ!.txt" --name-transform "all,charmap=ISO-8859-7"
// Output: stories/The Quick Brown _ Fox Went to the Caf_!.txt
rclone convmv "stories/The Quick Brown Fox: A Memoir [draft].txt" --name-transform "all,encoder=Colon,SquareBracket"
// Output: stories/The Quick Brown Fox๏ผ A Memoir ๏ผปdraft๏ผฝ.txt
rclone convmv "stories/The Quick Brown ๐ฆ Fox Went to the Cafรฉ!.txt" --name-transform "all,truncate=21"
// Output: stories/The Quick Brown ๐ฆ Fox
rclone convmv "stories/The Quick Brown Fox!.txt" --name-transform "all,command=echo"
// Output: stories/The Quick Brown Fox!.txt
rclone convmv "stories/The Quick Brown Fox!" --name-transform "date=-{YYYYMMDD}"
// Output: stories/The Quick Brown Fox!-20261009
rclone convmv "stories/The Quick Brown Fox!" --name-transform "date=-{macfriendlytime}"
// Output: stories/The Quick Brown Fox!-2026-10-09 1021AM
rclone convmv "stories/The Quick Brown Fox!.txt" --name-transform "all,regex=[\\.\\w]/ab"
// Output: ababababababab/ababab ababababab ababababab ababab!abababab
okay so about that regex command ๐: it generally takes Perl-style regular expressions, and the exact syntax is the one defined in the Go regular expression reference (https://golang.org/pkg/regexp/syntax/). Your replacement string can hold capturing group variables โ you reference capturing groups with the syntax $name or ${name}, where name can be a named capturing group, or honestly it can just be the index as a number, whatever's easier. Wanna insert a literal $? Use $$ ๐
.
You can stack multiple transformations and they run in sequence, applied in the order you typed them on the command line. periodt.
Also, --name-transform is not a convmv-exclusive queen โ it's also available in sync, copy, and move ๐.
๐ธ Files vs Directories ๐ธ
By default --name-transform will only apply to file names. That means only the leaf file name gets transformed. But some of the transforms genuinely hit different when applied to the whole path, or just to directories. So to pick which part of the file path is affected, you can add some tags to your --name-transform.
fileโ Only transform the leaf name of files (DEFAULT)dirโ Only transform name of directories โ these may appear anywhere in the pathallโ Transform the entire path for files and directories
You use it by dropping the tag into the transform name, like this: --name-transform file,prefix=ABC or --name-transform dir,prefix=DEF.
For some conversions using all is more likely to be useful, for example --name-transform all,nfc.
Heads up bestie:--name-transformmay not add path separators/to the name. That will cause an error. ๐ญ
๐ Ordering and Conflicts ๐
- Transformations will be applied in the order specified by the user.
- If the
filetag is in use (the default) then only the leaf name of files will be transformed. - If the
dirtag is in use then directories anywhere in the path will be transformed - If the
alltag is in use then directories and files anywhere in the path will be transformed - Each transformation will be run one path segment at a time.
- If a transformation adds a
/or ends up with an empty path segment then that will be an error.
- If the
- It is up to the user to put the transformations in a sensible order.
- Conflicting transformations, such as
prefixfollowed bytrimprefixornfcfollowed bynfd, are possible. - Instead of enforcing mutual exclusivity, transformations are applied in sequence as specified by the user, allowing for intentional use cases (e.g., trimming one prefix before adding another).
- Users should be aware that certain combinations may lead to unexpected results and should verify transformations using
--dry-runbefore execution.
- Conflicting transformations, such as
๐ Race Conditions and Non-Deterministic Behavior ๐
Some transformations, like replace=old:new, may introduce conflicts where multiple source files map to the same destination name. And that can lead to race conditions when you're doing concurrent transfers. It's up to the user to anticipate these, fr fr.
- If two files from the source are transformed into the same name at the destination, the final state may be non-deterministic.
- Running
rclone checkafter a sync using such transformations may erroneously report missing or differing files due to overwritten results.
To minimize risks, users should:
- Carefully review transformations that may introduce conflicts.
- Use
--dry-runto inspect changes before executing a sync (but keep in mind that it won't show the effect of non-deterministic transformations). - Avoid transformations that cause multiple distinct source files to map to the same destination name.
- Consider disabling concurrency with
--transfers=1if necessary. - Certain transformations (e.g.
prefix) will have a multiplying effect every time they are used. Avoid these when usingbisync.
rclone convmv dest:path --name-transform XXX [flags]
โจ Options โจ
--create-empty-src-dirsโ Create empty source dirs on destination after move--delete-empty-src-dirsโ Delete empty source dirs after move-h,--helpโ help for convmv
Options shared with other commands are described next. See the global flags page (https://rclone.org/flags/) for global options not listed here.
๐ Copy Options ๐
Flags for anything which can copy a file ๐ซถ
--check-firstโ do all the checks before starting any transfers ๐-c,--checksumโ check for changes using size & checksum (if the backend has one, or fallback to size only) ๐ธ--compare-deststringArray โ include extra server-side paths during comparison ๐--copy-deststringArray โ implies--compare-dest, but also copies files from those paths into the destination, slay--cutoff-modeHARD|SOFT|CAUTIOUS โ mode for stopping transfers when you hit the max transfer limit:HARD|SOFT|CAUTIOUS(defaultHARD)--ignore-case-syncโ ignore case when synchronizing ๐ฆ--ignore-checksumโ skip the post-copy checksum check--ignore-existingโ skip every file that already exists on the destination, periodt--ignore-sizeโ ignore size when skipping, so use modtime or checksum instead-I,--ignore-timesโ don't skip items that match size and time โ transfer literally everything, no vibe check ๐ญ--immutableโ do not modify files; fail if existing files have been modified ๐ฅ--inplaceโ download straight to the destination file instead of the whole atomic download-to-temp-then-rename thing-l,--linksโ translate symlinks to/from regular files using a.rclonelinkextension--max-backlogint โ maximum number of objects in the sync or check backlog (default10000)--max-durationDuration โ maximum duration rclone will transfer data for (default0s)--max-transferSizeSuffix โ maximum size of data to transfer (defaultoff)-M,--metadataโ if set, preserve metadata when copying objects โจ--modify-windowDuration โ max time diff that still counts as "the same" (default1ns)--multi-thread-chunk-sizeSizeSuffix โ chunk size for multi-thread downloads / uploads, if the filesystem doesn't set its own (default64Mi)--multi-thread-cutoffSizeSuffix โ use multi-thread downloads for files above this size (default256Mi)--multi-thread-streamsint โ number of streams for multi-thread downloads (default4)--multi-thread-write-buffer-sizeSizeSuffix โ in-memory buffer size for writing while in multi-thread mode (default128Ki)--name-transformstringArray โ transform paths during the copy process ๐--no-check-destโ don't check the destination at all, just copy regardless--no-traverseโ don't traverse the destination file system on copy--no-update-dir-modtimeโ don't update directory modification times--no-update-modtimeโ don't update destination modtime if the files are identical--order-bystring โ instructions on how to order the transfers, e.g.'size,descending'--partial-suffixstring โ add this suffix to the temporary file name when--inplaceis not used (default".partial")--refresh-timesโ refresh the modtime of remote files--server-side-across-configsโ allow server-side operations (e.g. copy) to work across different configs ๐--size-onlyโ skip based on size only, not modtime or checksum--streaming-upload-cutoffSizeSuffix โ cutoff for switching to chunked upload when the file size is unknown; the upload starts after reaching the cutoff or when the file ends (default100Ki)-u,--updateโ skip files that are newer on the destination
โจ Important Options โจ
Important flags that are useful for most commands, bestie โ memorize these fr fr ๐
-n,--dry-runโ do a trial run with no permanent changes-i,--interactiveโ enable interactive mode-v,--verbose countโ print lots more stuff (repeat it for even more) ๐ฅ
๐ Filter Options ๐
Flags for filtering directory listings
--delete-excludedโ delete files on the dest that were excluded from the sync--excludestringArray โ exclude files matching a pattern--exclude-fromstringArray โ read file exclude patterns from a file (use-to read from stdin)--exclude-if-presentstringArray โ exclude directories if a filename is present--files-fromstringArray โ read a list of source-file names from a file (use-to read from stdin)--files-from-rawstringArray โ read a list of source-file names from a file without any processing of lines (use-to read from stdin)--files-from0stringArray โ read a list of source-file names from a file using NUL as the separator (use-to read from stdin)-f,--filterstringArray โ add a file filtering rule--filter-fromstringArray โ read file filtering patterns from a file (use-to read from stdin)--hash-filterstring โ partition filenames by hashk/nor randomly@/n--ignore-caseโ ignore case in filters (case insensitive) ๐ธ--includestringArray โ include files matching a pattern--include-fromstringArray โ read file include patterns from a file (use-to read from stdin)--max-ageDuration โ only transfer files younger than this, insor with the suffixms|s|m|h|d|w|M|y(defaultoff)--max-depthint โ if set, limits the recursion depth to this (default-1)--max-sizeSizeSuffix โ only transfer files smaller than this, inKiBor with the suffixB|K|M|G|T|P(defaultoff)--metadata-excludestringArray โ exclude metadatas matching a pattern--metadata-exclude-fromstringArray โ read metadata exclude patterns from a file (use-to read from stdin)--metadata-filterstringArray โ add a metadata filtering rule--metadata-filter-fromstringArray โ read metadata filtering patterns from a file (use-to read from stdin)--metadata-includestringArray โ include metadatas matching a pattern--metadata-include-fromstringArray โ read metadata include patterns from a file (use-to read from stdin)--min-ageDuration โ only transfer files older than this, insor with the suffixms|s|m|h|d|w|M|y(defaultoff)--min-sizeSizeSuffix โ only transfer files bigger than this, inKiBor with the suffixB|K|M|G|T|P(defaultoff)
๐ฆ Listing Options ๐ฆ
Flags for listing directories
--default-timeTime โ time to show if modtime is unknown for files and directories (default2000-01-01T00:00:00Z)--fast-listโ use recursive list if the backend supports it; uses more memory but fewer transactions โญ
๐ซถ See Also ๐ซถ
- rclone (
https://rclone.org/commands/rclone/) โ show help for rclone commands, flags and backends.
๐ rclone copyto ๐
Copy files from source to dest, skipping identical files. Iconic, no cap.
๐ Synopsis ๐
If source:path is a file or directory then it copies it to a file or directory named dest:path. Simple as that, bestie.
This can be used to copy a single file to a destination with a name different from its source โ like, uploading and renaming in one step, obsessed ๐. If the source is a directory then it acts exactly like the copy (https://rclone.org/commands/rclone_copy/) command.
So
rclone copyto src dst
where src and dst are rclone paths โ either remote:path or /path/to/local or C:\windows\path\if\on\windows.
This will:
if src is file
copy it to dst, overwriting an existing file if it exists
if src is directory
copy it to dst, overwriting existing files if they exist
see copy command for full details
This doesn't transfer files that are identical on src and dst, testing by size and modification time or MD5SUM. It doesn't delete files from the destination. (Not me deleting your stuff โ I literally won't ๐)
If you're looking to copy just a byte range of a file, please see rclone cat --offset X --count Y.
Note: use the-P/--progressflag to view real-time transfer statistics โจ
๐ Logger Flags ๐
The --differ, --missing-on-dst, --missing-on-src, --match and --error flags write paths, one per line, to the file name supplied (or stdout if it is -). What they write is described in the help below. For example --differ will write all paths which are present on both the source and destination but different. Lowkey the receipts ๐
The --combined flag will write a file (or stdout) which contains all file paths with a symbol and then a space and then the path, to tell you what happened to it. These are reminiscent of diff files.
=path means path was found in source and destination and was identical ๐-path means path was missing on the source, so only in the destination+path means path was missing on the destination, so only in the source*path means path was present in source and destination but different.!path means there was an error reading or hashing the source or dest. ๐
The --dest-after flag writes a list file using the same format flags as lsf (https://rclone.org/commands/rclone_lsf/#synopsis) (including customizable options for hash, modtime, etc. (https://rclone.org/commands/rclone_lsf/#synopsis)). Conceptually it is similar to rsync's --itemize-changes, but not identical โ it should output an accurate list of what will be on the destination after the command is finished.
When the --no-traverse flag is set, all logs involving files that exist only on the destination will be incomplete or completely missing. ๐ซ
Note that these logger flags have a few limitations, and certain scenarios are not currently supported:
--max-duration/CutoffModeHard--compare-dest/--copy-dest- server-side moves of an entire dir at once
- High-level retries, because there would be duplicates (use
--retries 1to disable) - Possibly some unusual error scenarios
Note also that each file is logged during execution, as opposed to after, so it is most useful as a predictor of what SHOULD happen to each file (which may or may not match what actually DID). ๐ธ
rclone copyto source:path dest:path [flags]
Options ๐
okay bestie, here's the whole little toolkit of flags that only apply to copyto โ read 'em and weep (with joy):
--absoluteโ slaps a leading/in front of every path name. no thoughts, just absolute paths. ๐ธ--combined stringโ makes a combined report of all the changes and dumps it into this file. ๐--csvโ output in CSV format, because spreadsheets are lowkey eternal. โจ--dest-after stringโ reports every single file that exists on the destination after the sync has done its thing.--differ stringโ reports all the non-matching files to this file. the gossip file, basically.-d,--dir-slashโ appends a slash to directory names (defaulttrue). yes queen, trailing slash energy.--dirs-onlyโ only list directories. files? never heard of her. ๐--error stringโ reports all files with errors (whether hashing or reading) to this file. keeping receipts on the flops.--files-onlyโ only list files (defaulttrue). directories stay unbothered.-F,--format stringโ the output format. seelsfhelp for the deets (default"p").--hash hโ use this hash whenhshows up in the format. your options:MD5,SHA-1,DropboxHash(default"md5").-h,--helpโ help forcopyto. the classic. ๐ซถ--match stringโ reports all the matching files to this file. soulmates only. ๐--missing-on-dst stringโ reports all files missing from the destination to this file. where did they GO.--missing-on-src stringโ reports all files missing from the source to this file.-s,--separator stringโ the separator for items in the format (default";").-t,--timeformat stringโ specify your very own custom time format โ see the docs for details (default:2006-01-02 15:04:05). ๐
options shared with other commands are described right down below, no cap. and for global options that aren't listed here, go peek at the global flags page at https://rclone.org/flags/.
Copy Options ๐ซถ
these are the flags for anything that can copy a file. which is a lot of things, tbh.
--check-firstโ do all the checks before starting any transfers. patient queen behavior.-c,--checksumโ check for changes using size & checksum (if it's available, or fall back to size only).--compare-dest stringArrayโ include additional server-side paths during the comparison.--copy-dest stringArrayโ implies--compare-destbut also copies files from those paths into the destination.--cutoff-mode HARD|SOFT|CAUTIOUSโ the mode for stopping transfers once you hit the max transfer limit, eitherHARD,SOFTorCAUTIOUS(defaultHARD).--ignore-case-syncโ ignore case when synchronizing.--ignore-checksumโ skip the post-copy checksum check. living dangerously, love that for you.--ignore-existingโ skip every file that already exists on the destination.--ignore-sizeโ ignore size when skipping, so it uses modtime or checksum instead.-I,--ignore-timesโ don't skip items that match on size and time โ transfer everything, unconditionally. no filter, no shame. ๐ฅ--immutableโ do not modify files, and fail if existing files have been modified.--inplaceโ download straight to the destination file instead of doing the atomic download-to-temp-then-rename thing.-l,--linksโ translate symlinks to/from regular files using a'.rclonelink'extension.--max-backlog intโ maximum number of objects in the sync or check backlog (default10000).--max-duration Durationโ maximum duration rclone will transfer data for (default0s).--max-transfer SizeSuffixโ maximum size of data to transfer (defaultoff).-M,--metadataโ if set, preserve metadata when copying objects. the details matter!! ๐--modify-window Durationโ max time difference that still counts as "the same" (default1ns).--multi-thread-chunk-size SizeSuffixโ chunk size for multi-thread downloads/uploads, if the filesystem doesn't set it itself (default64Mi).--multi-thread-cutoff SizeSuffixโ use multi-thread downloads for files above this size (default256Mi).--multi-thread-streams intโ number of streams to use for multi-thread downloads (default4).--multi-thread-write-buffer-size SizeSuffixโ in-memory buffer size for writing while in multi-thread mode (default128Ki).--name-transform stringArrayโ transform paths during the copy process. glow-up for filenames. ๐ฆ--no-check-destโ don't check the destination at all, just copy regardless.--no-traverseโ don't traverse the destination file system on copy.--no-update-dir-modtimeโ don't update directory modification times.--no-update-modtimeโ don't update the destination modtime if the files are identical.--order-by stringโ instructions on how to order the transfers, e.g.'size,descending'.--partial-suffix stringโ add this partial-suffix to the temporary file name when--inplaceis not used (default".partial").--refresh-timesโ refresh the modtime of remote files.--server-side-across-configsโ allow server-side operations (like copy) to work across different configs. cross-config romance. ๐--size-onlyโ skip based on size only, not modtime or checksum.--streaming-upload-cutoff SizeSuffixโ the cutoff for switching to chunked upload if the file size is unknown; the upload starts after reaching the cutoff or when the file ends (default100Ki).-u,--updateโ skip files that are newer on the destination.
Important Options โญ
the important flags that are useful for basically most commands. if you learn nothing else, learn these:
-n,--dry-runโ do a trial run with no permanent changes. rehearsal, bestie. ๐ญ-i,--interactiveโ enable interactive mode.-v,--verbose countโ print lots more stuff (repeat it for even more). spammy and we love her.
Filter Options ๐
flags for filtering directory listings. this is where you become the main character of your own file selection:
--delete-excludedโ delete files on the destination that were excluded from the sync.--exclude stringArrayโ exclude files matching the pattern.--exclude-from stringArrayโ read file exclude patterns from a file (use-to read from stdin).--exclude-if-present stringArrayโ exclude directories if the filename is present.--files-from stringArrayโ read a list of source-file names from a file (use-to read from stdin).--files-from-raw stringArrayโ read a list of source-file names from a file without any processing of the lines (use-to read from stdin).--files-from0 stringArrayโ read a list of source-file names from a file usingNULas the separator (use-to read from stdin).-f,--filter stringArrayโ add a file filtering rule.--filter-from stringArrayโ read file filtering patterns from a file (use-to read from stdin).--hash-filter stringโ partition filenames by hashk/nor randomly with@/n.--ignore-caseโ ignore case in filters (case insensitive).--include stringArrayโ include files matching the pattern.--include-from stringArrayโ read file include patterns from a file (use-to read from stdin).--max-age Durationโ only transfer files younger than this, insor with the suffixms|s|m|h|d|w|M|y(defaultoff).--max-depth intโ if set, limits the recursion depth to this (default-1).--max-size SizeSuffixโ only transfer files smaller than this, inKiBor with the suffixB|K|M|G|T|P(defaultoff).--metadata-exclude stringArrayโ exclude metadata matching the pattern.--metadata-exclude-from stringArrayโ read metadata exclude patterns from a file (use-to read from stdin).--metadata-filter stringArrayโ add a metadata filtering rule.--metadata-filter-from stringArrayโ read metadata filtering patterns from a file (use-to read from stdin).--metadata-include stringArrayโ include metadata matching the pattern.--metadata-include-from stringArrayโ read metadata include patterns from a file (use-to read from stdin).--min-age Durationโ only transfer files older than this, insor with the suffixms|s|m|h|d|w|M|y(defaultoff).--min-size SizeSuffixโ only transfer files bigger than this, inKiBor with the suffixB|K|M|G|T|P(defaultoff).
Listing Options ๐ธ
flags for listing directories. short and sweet, like a good text back:
--default-time Timeโ the time to show if the modtime is unknown for files and directories (default2000-01-01T00:00:00Z).--fast-listโ use a recursive list if it's available; uses more memory but fewer transactions. trade-off queen. ๐
See Also ๐
rclone(https://rclone.org/commands/rclone/) โ show help for rclone commands, flags and backends. the mothership fr fr. ๐
๐ธ rclone copyurl ๐ธ
Bestie, this one is SO handy โ it grabs the content of a URL and yeets it straight to dest:path. No temp files, no middleman, no drama. ๐
โจ Synopsis โจ
So the vibe is: download a URL's content and copy it to the destination without saving it in temporary storage. Iconic behaviour, honestly.
Setting --auto-filename will attempt to automatically determine the filename from the URL (after any redirections) and used in the destination path. ๐
With --header-filename in addition, if a specific filename is set in HTTP headers, it will be used instead of the name from the URL. With --print-filename in addition, the resulting file name will be printed.
Setting --no-clobber will prevent overwriting file on the destination if there is one with the same name. Protective queen behaviour, we love to see it.
Setting --stdout or making the output file name - will cause the output to be written to standard output.
Setting --urls allows you to input a CSV file of URLs in format: URL, FILENAME. If --urls is in use then replace the URL in the arguments with the file containing the URLs, e.g.:
rclone copyurl --urls myurls.csv remote:dir
Missing filenames will be autogenerated equivalent to using --auto-filename. Note that --stdout and --print-filename are incompatible with --urls. This will do --transfers copies in parallel. Note that if --auto-filename is desired for all URLs then a file with only URLs and no filename can be used.
Each FILENAME in the CSV file can start with a relative path which will be appended to the destination path provided at the command line. For example, running the command shown above with the following CSV file will write two files to the destination: remote:dir/local/path/bar.json and remote:dir/another/local/directory/qux.json
https://example.org/foo/bar.json,local/path/bar.json
https://example.org/qux/baz.json,another/local/directory/qux.json
๐ ๏ธ Troubleshooting ๐ ๏ธ
Okay so if you can't get rclone copyurl to work then here are some things you can try, bestie:
--disable-http2โ rclone will use HTTP2 if available โ try disabling it--bind 0.0.0.0โ rclone will use IPv6 if available โ try disabling it--bind ::0โ to disable IPv4--user agent curlโ some sites have whitelists for curl's user-agent โ try that- Make sure the site works with curl directly
rclone copyurl https://example.com dest:path [flags]
โญ Options โญ
-a,--auto-filenameโ Get the file name from the URL and use it for destination file path--header-filenameโ Get the file name from theContent-Dispositionheader-h,--helpโ help for copyurl--no-clobberโ Prevent overwriting file with same name-p,--print-filenameโ Print the resulting name from--auto-filename--stdoutโ Write the output to stdout rather than a file--urlsโ Use a CSV file of links to process multiple URLs
Options shared with other commands are described next. See the global flags page (https://rclone.org/flags/) for global options not listed here.
๐ Important Options ๐
Important flags useful for most commands
-n,--dry-runโ Do a trial run with no permanent changes-i,--interactiveโ Enable interactive mode-v,--verbose countโ Print lots more stuff (repeat for more)
๐ See Also ๐
- rclone (https://rclone.org/commands/rclone/) โ Show help for rclone commands, flags and backends.
๐ rclone cryptcheck ๐
Cryptcheck checks the integrity of an encrypted remote. Integrity check era โจ
โจ Synopsis โจ
Checks a remote against an encrypted (https://rclone.org/crypt/) remote. This is the equivalent of running rclone check (https://rclone.org/commands/rclone_check/), but able to check the checksums of the encrypted remote.
For it to work the underlying remote of the cryptedremote must support some kind of checksum.
It works by reading the nonce from each file on the cryptedremote: and using that to encrypt each file on the remote:. It then checks the checksum of the underlying file on the cryptedremote: against the checksum of the file it has just encrypted.
Use it like this
rclone cryptcheck /path/to/files encryptedremote:path
You can use it like this also, but that will involve downloading all the files in remote:path.
rclone cryptcheck remote:path encryptedremote:path
After it has run it will log the status of the encryptedremote:.
If you supply the --one-way flag, it will only check that files in the source match the files in the destination, not the other way around. This means that extra files in the destination that are not in the source will not be detected.
The --differ, --missing-on-dst, --missing-on-src, --match and --error flags write paths, one per line, to the file name (or stdout if it is -) supplied. What they write is described in the help below. For example --differ will write all paths which are present on both the source and destination but different.
The --combined flag will write a file (or stdout) which contains all file paths with a symbol and then a space and then the path to tell you what happened to it. These are reminiscent of diff files.
= pathmeans path was found in source and destination and was identical- pathmeans path was missing on the source, so only in the destination+ pathmeans path was missing on the destination, so only in the source* pathmeans path was present in source and destination but different.! pathmeans there was an error reading or hashing the source or dest.
The default number of parallel checks is 8. See the --checkers (https://rclone.org/docs/#checkers-int) option for more information.
rclone cryptcheck remote:path cryptedremote:path [flags]
โญ Options โญ
--combined stringโ Make a combined report of changes to this file--differ stringโ Report all non-matching files to this file--error stringโ Report all files with errors (hashing or reading) to this file-h,--helpโ help for cryptcheck--match stringโ Report all matching files to this file--missing-on-dst stringโ Report all files missing from the destination to this file--missing-on-src stringโ Report all files missing from the source to this file--one-wayโ Check one way only, source files must exist on remote
Options shared with other commands are described next. See the global flags page (https://rclone.org/flags/) for global options not listed here.
โ Check Options โ
Flags used for check commands
--max-backlog intโ Maximum number of objects in sync or check backlog (default10000)
๐ฆ Filter Options ๐ฆ
Flags for filtering directory listings
--delete-excludedโ Delete files on dest excluded from sync--exclude stringArrayโ Exclude files matching pattern--exclude-from stringArrayโ Read file exclude patterns from file (use-to read from stdin)--exclude-if-present stringArrayโ Exclude directories if filename is present--files-from stringArrayโ Read list of source-file names from file (use-to read from stdin)--files-from-raw stringArrayโ Read list of source-file names from file without any processing of lines (use-to read from stdin)--files-from0 stringArrayโ Read list of source-file names from file using NUL as separator (use-to read from stdin)-f,--filter stringArrayโ Add a file filtering rule--filter-from stringArrayโ Read file filtering patterns from a file (use-to read from stdin)--hash-filter stringโ Partition filenames by hashk/nor randomly@/n--ignore-caseโ Ignore case in filters (case insensitive)--include stringArrayโ Include files matching pattern--include-from stringArrayโ Read file include patterns from file (use-to read from stdin)--max-age Durationโ Only transfer files younger than this insor suffixms|s|m|h|d|w|M|y(default off)--max-depth intโ If set limits the recursion depth to this (default-1)--max-size SizeSuffixโ Only transfer files smaller than this inKiBor suffixB|K|M|G|T|P(default off)--metadata-exclude stringArrayโ Exclude metadatas matching pattern--metadata-exclude-from stringArrayโ Read metadata exclude patterns from file (use-to read from stdin)--metadata-filter stringArrayโ Add a metadata filtering rule--metadata-filter-from stringArrayโ Read metadata filtering patterns from a file (use-to read from stdin)--metadata-include stringArrayโ Include metadatas matching pattern--metadata-include-from stringArrayโ Read metadata include patterns from file (use-to read from stdin)--min-age Durationโ Only transfer files older than this insor suffixms|s|m|h|d|w|M|y(default off)--min-size SizeSuffixโ Only transfer files bigger than this inKiBor suffixB|K|M|G|T|P(default off)
๐ Listing Options ๐
Flags for listing directories
--default-time Timeโ Time to show if modtime is unknown for files and directories (default2000-01-01T00:00:00Z)--fast-listโ Use recursive list if available; uses more memory but fewer transactions
๐ See Also ๐
- rclone (https://rclone.org/commands/rclone/) โ Show help for rclone commands, flags and backends.
๐ rclone cryptdecode ๐
Cryptdecode returns unencrypted file names. Decoding the secret messages bestie ๐ฎ
โจ Synopsis โจ
Returns unencrypted file names when provided with a list of encrypted file names. List limit is 10 items.
If you supply the --reverse flag, it will return encrypted file names.
use it like this
rclone cryptdecode encryptedremote: encryptedfilename1 encryptedfilename2
rclone cryptdecode --reverse encryptedremote: filename1 filename2
Another way to accomplish this is by using the rclone backend encode (or decode) command. See the documentation on the crypt (https://rclone.org/crypt/) overlay for more info.
rclone cryptdecode encryptedremote: encryptedfilename [flags]
โญ Options โญ
-h,--helpโ help for cryptdecode--reverseโ Reverse cryptdecode, encrypts filenames
See the global flags page (https://rclone.org/flags/) for global options not listed here.
๐ See Also ๐
- rclone (https://rclone.org/commands/rclone/) โ Show help for rclone commands, flags and backends.
๐๏ธ rclone deletefile
Bye bye one single file on a remote. That's it, that's the whole job bestie ๐
๐ Synopsis
Okay so: this removes a single file from a remote. And listen โ unlike delete it can NOT be used to nuke a directory, and it does not obey include/exclude filters. Which means if the file you named actually exists, it is getting removed. Every time. No filter drama, no vibes-based negotiation. ๐ซถ
rclone deletefile remote:path [flags]
๐ Options
-h,--helpโ help for deletefile
The options that are shared with the other commands are right below this. And for the global options that didn't make the list here, go peek at the global flags page (<https://rclone.org/flags/>). โจ
๐ Important Options
These are the important flags, and they're useful for basically every command, no cap:
-n,--dry-runโ Do a trial run with no permanent changes-i,--interactiveโ Enable interactive mode-v,--verbose countโ Print lots more stuff (repeat for more)
๐ rclone gendocs
Spits out markdown docs for rclone into whatever directory you hand it.
๐ Synopsis
So what this does: it produces markdown docs for all the rclone commands and drops them in the directory you supply. The formatting is set up so hugo can render them straight onto the rclone.org website. Fancy, honestly. ๐ธ
rclone gendocs output_directory [flags]
๐ Options
-h,--helpโ help for gendocs
For the global options that aren't listed here, check the global flags page (<https://rclone.org/flags/>). ๐
๐ See Also
- rclone (<https://rclone.org/commands/rclone/>) โ Show help for rclone commands, flags and backends.
๐ง rclone gitannex
Talks to git-annex over stdin/stdout. It's giving middleman energy.
๐ Synopsis
rclone's gitannex subcommand is what lets git-annex (<https://git-annex.branchable.com/>) store stuff on and pull stuff back from an rclone remote. Key detail bestie: it's meant to be run by git-annex, not by you directly. So hands off, let git-annex drive. ๐
๐ง Installation on Linux
- Skip this step if your git-annex is version
10.20240430(<https://git-annex.branchable.com/news/version_10.20240430/>) or newer. If it's older, you must create a symlink somewhere on yourPATHwith one particular name. That symlink is how git-annex tells rclone "hey I want to run thegitannexsubcommand".
Create the helper symlink in "$HOME/bin":
ln -s "$(realpath rclone)" "$HOME/bin/git-annex-remote-rclone-builtin"
Verify the new symlink is on your PATH:
which git-annex-remote-rclone-builtin
- Add a new remote to your git-annex repo. This new remote is what wires git-annex up with the
rclone gitannexsubcommand.
Start by asking git-annex to describe the remote's available configuration parameters.
If you skipped step 1:
git annex initremote MyRemote type=rclone --whatelse
If you created a symlink in step 1:
git annex initremote MyRemote type=external externaltype=rclone-builtin --whatelse
NOTE: If you're porting an existing git-annex-remote-rclone (<https://github.com/git-annex-remote-rclone/git-annex-remote-rclone>) remote over to userclone gitannex, you can probably reuse the configuration parameters verbatim without renaming them. Check parameter synonyms with--whatelseas shown above. ๐
The following example creates a new git-annex remote named "MyRemote" that will use the rclone remote named "SomeRcloneRemote". That rclone remote has to be one that's configured in your rclone.conf file, which you can locate with rclone config file.
git annex initremote MyRemote \
type=external \
externaltype=rclone-builtin \
encryption=none \
rcloneremotename=SomeRcloneRemote \
rcloneprefix=git-annex-content \
rclonelayout=nodir
- Before you trust this command with your precious data, be sure to test the remote. This command is very new and has not been tested on many rclone backends. Caveat emptor! โ ๏ธ
git annex testremote MyRemote
Happy annexing! ๐
rclone gitannex [flags]
๐ Options
-h,--helpโ help for gitannex
For the global options that aren't listed here, the global flags page has your back (<https://rclone.org/flags/>). โญ
๐ See Also
- rclone (<https://rclone.org/commands/rclone/>) โ Show help for rclone commands, flags and backends.
๐ป rclone gui
Opens up the web based GUI. Main character interface moment.
๐ Synopsis
This command boots an embedded web GUI for rclone and opens it in your default browser.
Here's the tea: it starts an RC API server AND a GUI server on separate localhost ports, generates login credentials automatically (unless you pass --no-auth), and opens your browser already authenticated. So smooth. โจ
rclone gui
By default rclone gui serves the web GUI that got embedded into the rclone binary at build time, from <https://github.com/rclone/rclone-web/>. You can override that by passing a path to either an unpacked GUI directory or a dist.zip archive (like, say, one you downloaded from the rclone-web releases page):
rclone gui ./my-dist/
rclone gui ./dist.zip
This is useful for iterating on the GUI locally without rebuilding rclone, or for serving a different GUI release than the one that's embedded. Obsessed honestly. ๐
Use --no-open-browser to skip opening the browser automatically:
rclone gui --no-open-browser
Use --addr to bind the GUI to a specific address:
rclone gui --addr localhost:5580
Use --user and --pass to set specific credentials:
rclone gui --user admin --pass secret
Use --no-auth to disable authentication entirely:
rclone gui --no-auth
For more help see the GUI docs (<https://rclone.org/gui/>). ๐ฆ
rclone gui [path] [flags]
๐ Options
--addr stringArrayโ IPaddress:Port for the GUI server (default auto-chosen localhost port)--api-addr stringArrayโ IPaddress:Port for the RC API server (default auto-chosen localhost port)--enable-metricsโ Enable OpenMetrics/Prometheus compatible endpoint at/metrics-h,--helpโ help for gui--no-authโ Don't require auth for the RC API--no-open-browserโ Skip opening the browser automatically--pass stringโ Password for RC authentication--user stringโ User name for RC authentication
The options shared with other commands are described next, and for the global options that aren't listed here, hit up the global flags page (<https://rclone.org/flags/>). ๐
๐๏ธ RC Options
Flags to control the Remote Control API:
--rcโ Enable the remote control server--rc-addr stringArrayโ IPaddress:Port or :Port to bind server to (default localhost:5572)--rc-allow-origin stringโ Origin which cross-domain request (CORS) can be executed from--rc-baseurl stringโ Prefix for URLs - leave blank for root--rc-cert stringโ TLS PEM key (concatenation of certificate and CA certificate)--rc-client-ca stringโ Client certificate authority to verify clients with--rc-enable-metricsโ Enable the Prometheus metrics path at the remote control server--rc-files stringโ Path to local files to serve on the HTTP server--rc-htpasswd stringโ A htpasswd file - if not provided no authentication is done--rc-job-expire-duration Durationโ Expire finished async jobs older than this value (default 1m0s)--rc-job-expire-interval Durationโ Interval to check for expired async jobs (default 10s)--rc-key stringโ TLS PEM Private key--rc-max-header-bytes intโ Maximum size of request header (default 4096)--rc-min-tls-version stringโ Minimum TLS version that is acceptable (default "tls1.0")--rc-no-authโ Don't require auth for certain methods--rc-pass stringโ Password for authentication--rc-realm stringโ Realm for authentication--rc-response-header stringArrayโ Set HTTP header for all responses, overriding existing values--rc-salt stringโ Password hashing salt (default "dlPL2MqE")--rc-serveโ Enable the serving of remote objects--rc-serve-no-modtimeโ Don't read the modification time (can speed things up)--rc-server-read-timeout Durationโ Timeout for server reading data (default 1h0m0s)--rc-server-write-timeout Durationโ Timeout for server writing data (default 1h0m0s)--rc-template stringโ User-specified template--rc-user stringโ User name for authentication--rc-user-from-header stringโ User name from a defined HTTP header--rc-web-fetch-url stringโ URL to fetch the releases for webgui (default "https://api.github.com/repos/rclone/rclone-webui-react/releases/latest")--rc-web-guiโ Launch WebGUI on localhost--rc-web-gui-force-updateโ Force update to latest version of web gui--rc-web-gui-no-open-browserโ Don't open the browser automatically--rc-web-gui-updateโ Check and update to latest version of web gui
๐ See Also
- rclone (<https://rclone.org/commands/rclone/>) โ Show help for rclone commands, flags and backends.
๐ธ rclone hashsum ๐ธ
okay bestie, this one produces a hashsum file for ALL the objects chilling in the path ๐
โจ Synopsis โจ
So basically: it makes a hash file for every object in the path, using the hash you named. The output format is exactly the same as the standard md5sum/sha1sum tool โ no cap.
By default, the hash gets requested from the remote. If the remote doesn't support that hash, bestie, you get nothing back โ no hash for you ๐. But if you throw in the download flag, the file gets downloaded from the remote and hashed locally, which means literally any hash works for any remote. iconic.
For MD5 and SHA1 there are also dedicated commands โ md5sum (https://rclone.org/commands/rclone_md5sum/) and sha1sum (https://rclone.org/commands/rclone_sha1sum/) โ because they're extra like that.
Also!! This command can hash data it receives on standard input (stdin) ๐. Just don't pass a remote:path, or pass a hyphen as the remote:path when there's data to read. (btw if there's no data to read, the hyphen gets treated literally, as a relative path. sneaky.)
Run it with no hash at all to see the list of every supported hash, like:
$ rclone hashsum
Supported hashes are:
- md5
- sha1
- whirlpool
- crc32
- sha256
- sha512
- blake3
- xxh3
- xxh128
Then:
rclone hashsum MD5 remote:path
Quick note bestie: hash names are case insensitive, and the values come out in lower case. periodt.
rclone hashsum [<hash> remote:path] [flags]
๐ Options ๐
--base64โ Output base64 encoded hashsum-C,--checkfilestring โ Validate hashes against a given SUM file instead of printing them--downloadโ Download the file and hash it locally; if this flag is not specified, the hash is requested from the remote-h,--helpโ help for hashsum--output-filestring โ Output hashsums to a file rather than the terminal
Options shared with other commands are described next. See the global flags page (https://rclone.org/flags/) for global options not listed here.
Filter Options
Flags for filtering directory listings ๐
--delete-excludedโ Delete files on dest excluded from sync--excludestringArray โ Exclude files matching pattern--exclude-fromstringArray โ Read file exclude patterns from file (use - to read from stdin)--exclude-if-presentstringArray โ Exclude directories if filename is present--files-fromstringArray โ Read list of source-file names from file (use - to read from stdin)--files-from-rawstringArray โ Read list of source-file names from file without any processing of lines (use - to read from stdin)--files-from0stringArray โ Read list of source-file names from file using NUL as separator (use - to read from stdin)-f,--filterstringArray โ Add a file filtering rule--filter-fromstringArray โ Read file filtering patterns from a file (use - to read from stdin)--hash-filterstring โ Partition filenames by hash k/n or randomly @/n--ignore-caseโ Ignore case in filters (case insensitive)--includestringArray โ Include files matching pattern--include-fromstringArray โ Read file include patterns from file (use - to read from stdin)--max-ageDuration โ Only transfer files younger than this in s or suffix ms|s|m|h|d|w|M|y (default off)--max-depthint โ If set limits the recursion depth to this (default -1)--max-sizeSizeSuffix โ Only transfer files smaller than this in KiB or suffix B|K|M|G|T|P (default off)--metadata-excludestringArray โ Exclude metadatas matching pattern--metadata-exclude-fromstringArray โ Read metadata exclude patterns from file (use - to read from stdin)--metadata-filterstringArray โ Add a metadata filtering rule--metadata-filter-fromstringArray โ Read metadata filtering patterns from a file (use - to read from stdin)--metadata-includestringArray โ Include metadatas matching pattern--metadata-include-fromstringArray โ Read metadata include patterns from file (use - to read from stdin)--min-ageDuration โ Only transfer files older than this in s or suffix ms|s|m|h|d|w|M|y (default off)--min-sizeSizeSuffix โ Only transfer files bigger than this in KiB or suffix B|K|M|G|T|P (default off)
Listing Options
Flags for listing directories ๐ฆ
--default-timeTime โ Time to show if modtime is unknown for files and directories (default 2000-01-01T00:00:00Z)--fast-listโ Use recursive list if available; uses more memory but fewer transactions
๐ See Also ๐
- rclone (https://rclone.org/commands/rclone/) โ Show help for rclone commands, flags and backends.
๐ rclone link ๐
Generate public link to file/folder. yes, we're being generous today โจ
โจ Synopsis โจ
Create, retrieve or remove a public link to the given file or folder. look at her go:
rclone link remote:path/to/file
rclone link remote:path/to/folder/
rclone link --unlink remote:path/to/folder/
rclone link --expire 1d remote:path/to/file
If you supply the --expire flag, it sets the expiration time โ otherwise it uses the default (100 years, bestie, that link is outliving us all ๐). Note that not all backends support the --expire flag โ and if the backend doesn't support it, then the link it hands back won't expire. so like, forever-forever.
Use the --unlink flag to remove existing public links to the file or folder. Note not all backends support the "--unlink" flag either โ the ones that don't will just ignore it, no drama ๐ซถ.
If it works, the last line of the output will contain the link. Exact capabilities depend on the remote, but by default the link will always be created with the least constraints โ e.g. no expiry, no password protection, accessible without an account. public public.
rclone link remote:path [flags]
๐ Options ๐
--expireDuration โ The amount of time that the link will be valid (default off)-h,--helpโ help for link--unlinkโ Remove existing public link to file/folder
See the global flags page (https://rclone.org/flags/) for global options not listed here.
๐ See Also ๐
- rclone (https://rclone.org/commands/rclone/) โ Show help for rclone commands, flags and backends.
๐ rclone listremotes ๐
List all the remotes in the config file AND the ones defined in environment variables. all of them, we're not leaving anyone out ๐
โจ Synopsis โจ
Lists all the available remotes from the config file, or the remotes matching an optional filter.
Prints the result in human-readable format by default, as a simple list of remote names. If you use the --long flag, you get a tabular format including the remote names, types and descriptions ๐. Using the --json flag gives you machine-readable output instead, which always includes all attributes โ including the source (file or environment).
Result can be filtered by a filter argument, which applies to all attributes, and/or by filter flags specific for each attribute. The values must be specified according to regular rclone filtering pattern syntax.
By default filtering uses non-anchored matching, so --type box also matches dropbox. Use --exact to match complete values only. iykyk.
rclone listremotes [<filter>] [flags]
๐ Options ๐
--descriptionstring โ Filter remotes by description--exactโ Match filter strings exactly instead of using non-anchored glob matching-h,--helpโ help for listremotes--jsonโ Format output as JSON--longโ Show type and description in addition to name--namestring โ Filter remotes by name--order-bystring โ Instructions on how to order the result, e.g. 'type,name=descending'--sourcestring โ Filter remotes by source, e.g. 'file' or 'environment'--typestring โ Filter remotes by type
See the global flags page (https://rclone.org/flags/) for global options not listed here.
๐ See Also ๐
- rclone (https://rclone.org/commands/rclone/) โ Show help for rclone commands, flags and backends.
๐ฆ rclone lsf ๐ฆ
List directories and objects in remote:path formatted for parsing.
โจ Synopsis โจ
okay so bestie, this is the list command that actually plays nice with your scripts ๐
. lsf dumps the contents of the source path โ both directories AND objects โ to standard output in a form that's easy to parse. By default you just get the names of the objects and directories, one per line, and directories get a / glued onto the end.
Like, look:
$ rclone lsf swift:bucket
bevajer5jef
canole
diwogej7
ferejej3gux/
fubuwic
Use the --format option to control what gets listed. By default it's literally just the path, but these little letters let you pick and choose what shows up:
pโ pathsโ sizetโ modification timehโ hashiโ ID of objectoโ Original ID of underlying objectmโ MimeType of object if knowneโ encrypted nameTโ tier of storage if known, e.g."Hot"or"Cool"Mโ Metadata of object in JSON blob format, eg{"key":"value"}
Some backends use composite IDs. In particular, Google Drive shortcuts are normally dereferenced, and their i field contains the target object's ID followed by the shortcut's ID, separated by a tab. This tab is part of the ID field and is not changed by --separator. Use --drive-skip-shortcuts to omit shortcut entries.
So if you wanted the path, size and modification time, you'd use --format "pst", or maybe --format "tsp" to put the path last. Iconic either way.
E.g.
$ rclone lsf --format "tsp" swift:bucket
2016-06-25 18:55:41;60295;bevajer5jef
2016-06-25 18:55:43;90613;canole
2016-06-25 18:55:43;94467;diwogej7
2018-04-26 08:50:45;0;ferejej3gux/
2016-06-25 18:55:40;37600;fubuwic
If you specify h in the format you will get the MD5 hash by default, use the --hash flag to change which hash you want. Note that this can be returned as an empty string if it isn't available on the object (and for directories), "ERROR" if there was an error reading it from the object and "UNSUPPORTED" if that object does not support that hash type.
For example, to emulate the md5sum command you can use
rclone lsf -R --hash MD5 --format hp --separator " " --files-only .
E.g.
$ rclone lsf -R --hash MD5 --format hp --separator " " --files-only swift:bucket
7908e352297f0f530b84a756f188baa3 bevajer5jef
cd65ac234e6fea5925974a51cdd865cc canole
03b5341b4f234b9d984d03ad076bae91 diwogej7
8fd37c3810dd660778137ac3a66cc06d fubuwic
99713e14a4c4ff553acaf1930fad985b gixacuh7ku
(Though rclone md5sum . is an easier way of typing this.)
By default the separator is ; this can be changed with the --separator flag. Note that separators aren't escaped in the path so putting it last is a good strategy ๐ง .
E.g.
$ rclone lsf --separator "," --format "tshp" swift:bucket
2016-06-25 18:55:41,60295,7908e352297f0f530b84a756f188baa3,bevajer5jef
2016-06-25 18:55:43,90613,cd65ac234e6fea5925974a51cdd865cc,canole
2016-06-25 18:55:43,94467,03b5341b4f234b9d984d03ad076bae91,diwogej7
2018-04-26 08:52:53,0,,ferejej3gux/
2016-06-25 18:55:40,37600,8fd37c3810dd660778137ac3a66cc06d,fubuwic
You can output in CSV standard format. This will escape things in " if they contain ,
E.g.
$ rclone lsf --csv --files-only --format ps remote:path
test.log,22355
test.sh,449
"this file contains a comma, in the file name.txt",6
Note that the --absolute parameter is useful for making lists of files to pass to an rclone copy with the --files-from-raw flag.
For example, to find all the files modified within one day and copy those only (without traversing the whole directory structure):
rclone lsf --absolute --files-only --max-age 1d /path/to/local > new_files
rclone copy --files-from-raw new_files /path/to/local remote:path
The default time format is '2006-01-02 15:04:05'. Other formats (https://pkg.go.dev/time#pkg-constants) can be specified with the --time-format flag. Examples:
rclone lsf remote:path --format pt --time-format 'Jan 2, 2006 at 3:04pm (MST)'
rclone lsf remote:path --format pt --time-format '2006-01-02 15:04:05.000000000'
rclone lsf remote:path --format pt --time-format '2006-01-02T15:04:05.999999999Z07:00'
rclone lsf remote:path --format pt --time-format RFC3339
rclone lsf remote:path --format pt --time-format DateOnly
rclone lsf remote:path --format pt --time-format max
rclone lsf remote:path --format pt --time-format unix
rclone lsf remote:path --format pt --time-format unixnano
--time-format max will automatically truncate 2006-01-02 15:04:05.000000000 to the maximum precision supported by the remote. cute and efficient โจ
Any of the filtering options can be applied to this command.
There are several related list commands:
lsto list size and path of objects onlylslto list modification time, size and path of objects onlylsdto list directories onlylsfto list objects and directories in easy to parse formatlsjsonto list objects and directories in JSON format
ls,lsl,lsd are designed to be human-readable. lsf is designed to be human and machine-readable. lsjson is designed to be machine-readable.
Note that ls and lsl recurse by default - use --max-depth 1 to stop the recursion.
The other list commands lsd,lsf,lsjson do not recurse by default - use -R to make them recurse.
On the bucket-based remotes (e.g. s3, gcs, b2) a directory is a key prefix rather than an object, so a listing without -R shows each prefix as one directory entry and not the objects stored under it.
List commands prefer a recursive method that uses more memory but fewer transactions by default. Use --disable ListR to suppress the behavior. See --fast-list (https://rclone.org/docs/#fast-list) for more details.
Listing a nonexistent directory will produce an error except for remotes which can't have empty directories (e.g. s3, swift, or gcs - the bucket-based remotes).
rclone lsf remote:path [flags]
๐ Options ๐
--absoluteโ Put a leading/in front of path names--csvโ Output in CSV format-d,--dir-slashโ Append a slash to directory names (defaulttrue)--dirs-onlyโ Only list directories--files-onlyโ Only list files-F,--format stringโ Output format - see help for details (default"p")--hash hโ Use this hash whenhis used in the formatMD5|SHA-1|DropboxHash(default"md5")-h,--helpโ help forlsf-R,--recursiveโ Recurse into the listing-s,--separator stringโ Separator for the items in the format (default";")-t,--time-format stringโ Specify a custom time format - see docs for details (default:2006-01-02 15:04:05)
Options shared with other commands are described next. See the global flags page (https://rclone.org/flags/) for global options not listed here.
๐ธ Filter Options ๐ธ
Flags for filtering directory listings
--delete-excludedโ Delete files on dest excluded from sync--exclude stringArrayโ Exclude files matching pattern--exclude-from stringArrayโ Read file exclude patterns from file (use-to read from stdin)--exclude-if-present stringArrayโ Exclude directories if filename is present--files-from stringArrayโ Read list of source-file names from file (use-to read from stdin)--files-from-raw stringArrayโ Read list of source-file names from file without any processing of lines (use-to read from stdin)--files-from0 stringArrayโ Read list of source-file names from file using NUL as separator (use-to read from stdin)-f,--filter stringArrayโ Add a file filtering rule--filter-from stringArrayโ Read file filtering patterns from a file (use-to read from stdin)--hash-filter stringโ Partition filenames by hashk/nor randomly@/n--ignore-caseโ Ignore case in filters (case insensitive)--include stringArrayโ Include files matching pattern--include-from stringArrayโ Read file include patterns from file (use-to read from stdin)--max-age Durationโ Only transfer files younger than this in s or suffixms|s|m|h|d|w|M|y(default off)--max-depth intโ If set limits the recursion depth to this (default-1)--max-size SizeSuffixโ Only transfer files smaller than this in KiB or suffixB|K|M|G|T|P(default off)--metadata-exclude stringArrayโ Exclude metadatas matching pattern--metadata-exclude-from stringArrayโ Read metadata exclude patterns from file (use-to read from stdin)--metadata-filter stringArrayโ Add a metadata filtering rule--metadata-filter-from stringArrayโ Read metadata filtering patterns from a file (use-to read from stdin)--metadata-include stringArrayโ Include metadatas matching pattern--metadata-include-from stringArrayโ Read metadata include patterns from file (use-to read from stdin)--min-age Durationโ Only transfer files older than this in s or suffixms|s|m|h|d|w|M|y(default off)--min-size SizeSuffixโ Only transfer files bigger than this in KiB or suffixB|K|M|G|T|P(default off)
๐ Listing Options ๐
Flags for listing directories
--default-time Timeโ Time to show if modtime is unknown for files and directories (default2000-01-01T00:00:00Z)--fast-listโ Use recursive list if available; uses more memory but fewer transactions
๐ See Also ๐
rclone(https://rclone.org/commands/rclone/) - Show help for rclone commands, flags and backends.
fr fr that's the whole vibe, go parse something ๐
๐ rclone lsjson ๐
List directories and objects in the path in JSON format. it's giving machine-readable, bestie ๐คโจ
Synopsis โจ
List directories and objects in the path in JSON format.
The output is an array of Items, where each Item looks like this:
{
"Hashes" : {
"SHA-1" : "f572d396fae9206628714fb2ce00f72e94f2258f",
"MD5" : "b1946ac92492d2347c6235b4d2611184",
"DropboxHash" : "ecb65bb98f9d905b70458986c39fcbad7715e5f2fcc3b1f07767d7c83e2438cc"
},
"ID": "y2djkhiujf83u33",
"OrigID": "UYOJVTUW00Q1RzTDA",
"IsBucket" : false,
"IsDir" : false,
"MimeType" : "application/octet-stream",
"ModTime" : "2017-05-31T16:15:57.034468261+01:00",
"Name" : "file.txt",
"Encrypted" : "v0qpsdq8anpci8n929v3uu9338",
"EncryptedPath" : "kja9098349023498/v0qpsdq8anpci8n929v3uu9338",
"Path" : "full/path/goes/here/file.txt",
"Size" : 6,
"Tier" : "hot",
}
okay so which properties show up totally depends on the backend, lowkey:
- The property
IsBucketwill only be included for bucket-based remotes, and only for directories that are buckets. It will always be omitted when the value is nottrue. ๐ชฃ - Properties
EncryptedandEncryptedPathwill only be included for encrypted remotes, and (as mentioned below ๐) only if the--encryptedoption is set.
Different options may also affect which properties are included:
- If
--hashis not specified, theHashesproperty will be omitted. The types of hash can be specified with the--hash-typeparameter (which may be repeated). If--hash-typeis set then it implies--hash. ๐ - If
--no-modtimeis specified thenModTimewill be blank. This can speed things up on remotes where reading the ModTime takes an extra request (e.g.s3,swift). โก - If
--no-mimetypeis specified thenMimeTypewill be blank. This can speed things up on remotes where reading the MimeType takes an extra request (e.g.s3,swift). โก - If
--encryptedis not specified theEncryptedandEncryptedPathproperties will be omitted โ even for encrypted remotes. ๐ - If
--metadatais set then an additionalMetadataproperty will be returned. This will have metadata (https://rclone.org/docs/#metadata) in rclone standard format as a JSON object. ๐๏ธ
The default is to list directories and files/objects, but this can be changed with the following options:
- If
--dirs-onlyis specified then directories will be returned only, no files/objects. ๐ - If
--files-onlyis specified then files will be returned only, no directories. ๐
If --stat is set then the output is not an array of items, but instead a single JSON blob will be returned about the item pointed to. This will return an error if the item isn't found, however on bucket based backends (like s3, gcs, b2, azureblob etc) if the item isn't found it will return an empty directory, as it isn't possible to tell empty directories from missing directories there. ๐ซ
The Path field will only show folders below the remote path being listed. If remote:path contains the file subfolder/file.txt, the Path for file.txt will be subfolder/file.txt, not remote:path/subfolder/file.txt. When used without --recursive the Path will always be the same as Name. ๐งญ
The time is in RFC3339 format with up to nanosecond precision. The number of decimal digits in the seconds will depend on the precision that the remote can hold the times, so if times are accurate to the nearest millisecond (e.g. Google Drive) then 3 digits will always be shown (2017-05-31T16:15:57.034+01:00) whereas if the times are accurate to the nearest second (Dropbox, Box, WebDav, etc.) no digits will be shown (2017-05-31T16:15:57+01:00). โฐ
The whole output can be processed as a JSON blob, or alternatively it can be processed line by line as each item is written on individual lines (except with --stat). ๐
Any of the filtering options can be applied to this command.
There are several related list commands ๐ฏ
lsto list size and path of objects onlylslto list modification time, size and path of objects onlylsdto list directories onlylsfto list objects and directories in easy to parse formatlsjsonto list objects and directories in JSON format
ls,lsl,lsd are designed to be human-readable. lsf is designed to be human and machine-readable. lsjson is designed to be machine-readable. ๐ง
Note that ls and lsl recurse by default โ use --max-depth 1 to stop the recursion. ๐
The other list commands lsd,lsf,lsjson do not recurse by default โ use -R to make them recurse.
On the bucket-based remotes (e.g. s3, gcs, b2) a directory is a key prefix rather than an object, so a listing without -R shows each prefix as one directory entry and not the objects stored under it. ๐ชฃ
List commands prefer a recursive method that uses more memory but fewer transactions by default. Use --disable ListR to suppress the behavior. See --fast-list (https://rclone.org/docs/#fast-list) for more details.
Listing a nonexistent directory will produce an error except for remotes which can't have empty directories (e.g. s3, swift, or gcs โ the bucket-based remotes).
rclone lsjson remote:path [flags]
Options ๐
--dirs-onlyโ Show only directories in the listing--encryptedโ Show the encrypted names--files-onlyโ Show only files in the listing--hashโ Include hashes in the output (may take longer)--hash-type stringArrayโ Show only this hash type (may be repeated)-h,--helpโ help for lsjson-M,--metadataโ Add metadata to the listing--no-mimetypeโ Don't read the mime type (can speed things up)--no-modtimeโ Don't read the modification time (can speed things up)--originalโ Show the ID of the underlying Object-R,--recursiveโ Recurse into the listing--statโ Just return the info for the pointed to file
Options shared with other commands are described next. See the global flags page (https://rclone.org/flags/) for global options not listed here.
Filter Options ๐
Flags for filtering directory listings
--delete-excludedโ Delete files on dest excluded from sync--exclude stringArrayโ Exclude files matching pattern--exclude-from stringArrayโ Read file exclude patterns from file (use-to read from stdin)--exclude-if-present stringArrayโ Exclude directories if filename is present--files-from stringArrayโ Read list of source-file names from file (use-to read from stdin)--files-from-raw stringArrayโ Read list of source-file names from file without any processing of lines (use-to read from stdin)--files-from0 stringArrayโ Read list of source-file names from file using NUL as separator (use-to read from stdin)-f,--filter stringArrayโ Add a file filtering rule--filter-from stringArrayโ Read file filtering patterns from a file (use-to read from stdin)--hash-filter stringโ Partition filenames by hashk/nor randomly@/n--ignore-caseโ Ignore case in filters (case insensitive)--include stringArrayโ Include files matching pattern--include-from stringArrayโ Read file include patterns from file (use-to read from stdin)--max-age Durationโ Only transfer files younger than this insor suffixms|s|m|h|d|w|M|y(default off)--max-depth intโ If set limits the recursion depth to this (default-1)--max-size SizeSuffixโ Only transfer files smaller than this in KiB or suffixB|K|M|G|T|P(default off)--metadata-exclude stringArrayโ Exclude metadatas matching pattern--metadata-exclude-from stringArrayโ Read metadata exclude patterns from file (use-to read from stdin)--metadata-filter stringArrayโ Add a metadata filtering rule--metadata-filter-from stringArrayโ Read metadata filtering patterns from a file (use-to read from stdin)--metadata-include stringArrayโ Include metadatas matching pattern--metadata-include-from stringArrayโ Read metadata include patterns from file (use-to read from stdin)--min-age Durationโ Only transfer files older than this insor suffixms|s|m|h|d|w|M|y(default off)--min-size SizeSuffixโ Only transfer files bigger than this in KiB or suffixB|K|M|G|T|P(default off)
Listing Options ๐๏ธ
Flags for listing directories
--default-time Timeโ Time to show if modtime is unknown for files and directories (default2000-01-01T00:00:00Z)--fast-listโ Use recursive list if available; uses more memory but fewer transactions
See Also ๐
- rclone (https://rclone.org/commands/rclone/) โ Show help for rclone commands, flags and backends.
๐ธ rclone mount ๐ธ
Mount the remote as file system on a mountpoint. yes bestie we're literally turning your cloud drive into a folder, iconic behavior ๐
Synopsis โจ
Rclone mount allows Linux, FreeBSD, macOS and Windows to mount any of Rclone's cloud storage systems as a file system with FUSE. ๐ฆ
First set up your remote using rclone config. Check it works with rclone ls etc.
On Linux and macOS, you can run mount in either foreground or background (aka daemon) mode. Mount runs in foreground mode by default. Use the --daemon flag to force background mode. On Windows you can run mount in foreground only, the flag is ignored. ๐ช
In background mode rclone acts as a generic Unix mount program: the main program starts, spawns background rclone process to setup and maintain the mount, waits until success or timeout and exits with appropriate code (killing the child process if it fails). ๐
On Linux/macOS/FreeBSD start the mount like this, where /path/to/local/mount is an empty existing directory:
rclone mount remote:path/to/files /path/to/local/mount
On Windows you can start a mount in different ways. See below for details. If foreground mount is used interactively from a console window, rclone will serve the mount and occupy the console so another window should be used to work with the mount until rclone is interrupted e.g. by pressing Ctrl+C. โจ๏ธ
Okay so the examples below mount to an automatically assigned drive, to a specific drive letter X:, to a path like C:\path\parent\mount (and heads up: the parent directory or drive has to already exist, the mount part must not exist, and this is not supported when you're mounting as a network drive), and the last one mounts as a network share \\cloud\remote and maps it to an automatically assigned drive:
rclone mount remote:path/to/files *
rclone mount remote:path/to/files X:
rclone mount remote:path/to/files C:\path\parent\mount
rclone mount remote:path/to/files \\cloud\remote
When the program ends while it's in foreground mode โ whether that's you hitting Ctrl+C, or it catching a SIGINT or SIGTERM signal โ the mount should just automatically stop for you. ๐
When it's running in background mode though, bestie, you have to stop the mount yourself, manually:
# Linux
fusermount -u /path/to/local/mount
#... or on some systems
fusermount3 -u /path/to/local/mount
# OS X or Linux when using nfsmount
umount /path/to/local/mount
The umount operation can fail โ for example when the mountpoint is busy. And when that happens? It's on you, the user, to stop the mount manually. No cap. ๐ญ
The size of the mounted file system gets set according to information retrieved from the remote, same as what the rclone about command ((https://rclone.org/commands/rclone_about/)) returns. Remotes with unlimited storage may report only the used size, and then an extra 1 PiB of free space is assumed. And if the remote doesn't support ((https://rclone.org/overview/#optional-features)) the about feature at all, then 1 PiB gets set as both the total size and the free size. Iconic behaviour honestly. โจ
๐ช Installing on Windows
To run rclone mount on Windows you'll need to download and install WinFsp ((https://winfsp.dev)).
WinFsp ((https://github.com/winfsp/winfsp)) is an open-source Windows File System Proxy that makes writing user space file systems for Windows super easy. It hooks you up with a FUSE emulation layer that rclone uses in combination with cgofuse ((https://github.com/winfsp/cgofuse)). Both of these packages are by Bill Zissimopoulos, who was so helpful during the implementation of rclone mount for Windows. King behaviour, we love to see it. ๐
๐ฅ๏ธ Mounting modes on windows
Unlike other operating systems, Microsoft Windows gives you a different filesystem type for network drives vs fixed drives. It optimises access based on the assumption that fixed disk drives are fast and reliable, while network drives have relatively high latency and are less reliable. Some settings can also be differentiated between the two types โ for example, Windows Explorer should just show icons and not create preview thumbnails for image and video files on network drives.
In most cases, rclone will mount the remote as a normal, fixed disk drive by default. But you can also choose to mount it as a remote network drive โ which people often call a network share. And fr fr, if you mount an rclone remote using the default fixed drive mode and start seeing unexpected program errors, freezes or other issues, consider mounting as a network drive instead. ๐
When you're mounting as a fixed disk drive you can either mount to an unused drive letter, or to a path representing a nonexistent subdirectory of an existing parent directory or drive. Using the special value * will tell rclone to automatically assign the next available drive letter, starting with Z: and moving backward. Examples:
rclone mount remote:path/to/files *
rclone mount remote:path/to/files X:
rclone mount remote:path/to/files C:\path\parent\mount
rclone mount remote:path/to/files X:
The option --volname can be used to set a custom volume name for the mounted file system. The default is to use the remote name and path.
To mount as a network drive, you can just add the option --network-mode to your mount command. Mounting to a directory path is not supported in this mode โ it's a limitation Windows imposes on junctions โ so the remote must always be mounted to a drive letter.
rclone mount remote:path/to/files X: --network-mode
A volume name specified with --volname will be used to create the network share path. A complete UNC path, like \\cloud\remote, optionally with a path \\cloud\remote\madeup\path, will be used as-is. Any other string gets used as the share part, after a default prefix of \\server\. If no volume name is specified then \\server\share will be used. You must make sure the volume name is unique when you're mounting more than one drive, or else the mount command will fail. The share name gets treated as the volume label for the mapped drive (shown in Windows Explorer etc), while the complete \\server\share will be reported as the remote UNC path by net use etc โ just like a normal network drive mapping. ๐ซ
If you specify a full network share UNC path with --volname, this implicitly sets the --network-mode option, so these two examples give you the same result:
rclone mount remote:path/to/files X: --network-mode
rclone mount remote:path/to/files X: --volname \\server\share
You can also specify the network share UNC path as the mountpoint itself. Then rclone will automatically assign a drive letter โ same as with * โ and use that as the mountpoint, and instead use the UNC path you specified as the volume name, as if it were specified with --volname. This also implicitly sets --network-mode. Which means these two examples have the same result:
rclone mount remote:path/to/files \\cloud\remote
rclone mount remote:path/to/files * --volname \\cloud\remote
There's yet another way to enable network mode and set the share path, and that's passing the "native" libfuse/WinFsp option directly: --fuse-flag --VolumePrefix=\server\share. Note that in this case the path must have just a single backslash prefix.
Note: in previous versions of rclone this was the only supported method. (Ancient history vibes. ๐ฆ)
Read more about drive mapping ((https://en.wikipedia.org/wiki/Drive_mapping)).
See also the Limitations section below. ๐
๐ Windows filesystem permissions
The FUSE emulation layer on Windows has to convert between the POSIX-based permission model used in FUSE and the permission model used in Windows, which is based on access-control lists (ACL). The way that it has to translate between two whole permission systems... it's giving diplomat energy. ๐ซถ
The mounted filesystem will normally get three entries in its access-control list (ACL), representing permissions for the POSIX permission scopes: Owner, group and others. By default, the owner and group will be taken from the current user, and the built-in group "Everyone" will be used to represent others. The user/group can be customised with the FUSE options "UserName" and "GroupName", e.g. -o UserName=user123 -o GroupName="Authenticated Users". The permissions on each entry get set according to the options --dir-perms and --file-perms, which take a value in traditional Unix numeric notation ((https://en.wikipedia.org/wiki/File-system_permissions#Numeric_notation)).
The default permissions correspond to --file-perms 0666 --dir-perms 0777, i.e. read and write permissions for everyone. Which means you will not be able to start any programs from the mount. To be able to do that you have to add execute permissions, e.g. --file-perms 0777 --dir-perms 0777 to give it to everyone. And if the program needs to write files, chances are you'll have to enable VFS File Caching as well (see also limitations). Note that the default write permission has some restrictions for accounts other than the owner โ specifically it lacks the "write extended attributes" permission, as explained next. ๐
The mapping of permissions is not always trivial, and the result you see in Windows Explorer may not be exactly what you expected. For example, when you set a value that includes write access for the group or others scope, this gets mapped to the individual permissions "write attributes", "write data" and "append data" โ but not "write extended attributes". Windows will then show this as the basic permission "Special" instead of "Write", because "Write" also covers the "write extended attributes" permission. And when you set digit 0 for group or others, to indicate no permissions, they'll still get the individual permissions "read attributes", "read extended attributes" and "read permissions". This is done for compatibility reasons โ e.g. so that users without additional permissions can still read basic metadata about files, like they can in Unix.
WinFsp 2021 (version 1.9) introduced a new FUSE option, "FileSecurity", that allows the complete specification of file security descriptors using SDDL ((https://docs.microsoft.com/en-us/windows/win32/secauthz/security-descriptor-string-format)). With this you get detailed control over the resulting permissions, compared to using the POSIX permissions described above, and no additional permissions will be added automatically for compatibility with Unix. Some example use cases will follow. โจ
If you set POSIX permissions to only allow access to the owner, using --file-perms 0600 --dir-perms 0700, the user group and the built-in "Everyone" group will still be given some special permissions, as described above. Some programs may then (incorrectly) interpret this as the file being accessible by everyone โ for example, an SSH client might warn about "unprotected private key file". You can work around this by specifying -o FileSecurity="D:P(A;;FA;;;OW)", which sets file all access (FA) to the owner (OW), and nothing else. ๐
When setting write permissions then, except for the owner, this does not include the "write extended attributes" permission, as mentioned above. This may prevent applications from writing to files, giving a permission denied error instead. To set working write permissions for the built-in "Everyone" group, similar to what it gets by default but with the addition of the "write extended attributes" permission, you can specify -o FileSecurity="D:P(A;;FRFW;;;WD)", which sets file read (FR) and file write (FW) to everyone (WD). If file execute (FX) is also needed, then change it to -o FileSecurity="D:P(A;;FRFWFX;;;WD)", or set file all access (FA) to get full access permissions โ including delete โ with -o FileSecurity="D:P(A;;FA;;;WD)". Slay. ๐
โ ๏ธ Windows caveats
Drives created as Administrator are not visible to other accounts โ not even to an account that was elevated to Administrator with the User Account Control (UAC) feature. The result of this is that if you mount to a drive letter from a Command Prompt run as Administrator, and then try to access that same drive from Windows Explorer (which does not run as Administrator), you will not be able to see the mounted drive. It's giving ghost drive. ๐ป
If you don't need to access the drive from applications running with administrative privileges, the easiest way around this is to always create the mount from a non-elevated command prompt. Like, literally just... don't be admin. That's the whole tip. iconic ๐
To make mapped drives available to the user account that created them โ regardless of whether it's running elevated or not โ there's a special Windows setting called linked connections (https://docs.microsoft.com/en-us/troubleshoot/windows-client/networking/mapped-drives-not-available-from-elevated-command#detail-to-configure-the-enablelinkedconnections-registry-entry) that can be enabled. Go turn it on bestie. โจ
It's also possible to make a drive mount available to everyone on the system, by running the process creating it as the built-in SYSTEM account. There are several ways to do this: One is to use the command-line utility PsExec (https://docs.microsoft.com/en-us/sysinternals/downloads/psexec), from Microsoft's Sysinternals suite, which has option -s to start processes as the SYSTEM account. Another alternative is to run the mount command from a Windows Scheduled Task, or a Windows Service, configured to run as the SYSTEM account. A third alternative is to use the WinFsp.Launcher infrastructure (https://github.com/winfsp/winfsp/wiki/WinFsp-Service-Architecture). Read more in the install documentation (https://rclone.org/install/).
Heads up fr fr: when running rclone as another user, it will not use the configuration file from your profile unless you tell it to with the--config(https://rclone.org/docs/#config-string) option. Note also that it is now theSYSTEMaccount that will have the owner permissions, and other accounts will have permissions according to the group or others scopes. As mentioned above, these will then not get the "write extended attributes" permission, and this may prevent writing to files. You can work around this with theFileSecurityoption, see example above.
And ooo, one more thing: mapping to a directory path instead of a drive letter does not suffer from the same limitations. ๐
๐ Mounting on macOS ๐
Mounting on macOS can be done either via the built-in NFS server (https://rclone.org/commands/rclone_serve_nfs/), macFUSE (https://osxfuse.github.io/) (also known as osxfuse) or FUSE-T (https://www.fuse-t.org/). macFUSE is a traditional FUSE driver utilizing a macOS kernel extension (kext). FUSE-T is an alternative FUSE system which "mounts" via an NFSv4 local server. so many options, we love choices ๐ฆ
๐ค Unicode Normalization ๐ค
It is highly recommended to keep the default of --no-unicode-normalization=false for all mount and serve commands on macOS. For details, see vfs-case-sensitivity (https://rclone.org/commands/rclone_mount/#vfs-case-sensitivity). don't touch it, it's fine, leave it alone ๐
๐ก NFS mount ๐ก
For macOS (and other platforms where this path is supported), prefer the dedicated rclone nfsmount (https://rclone.org/commands/rclone_nfsmount/) command. It starts the NFS server and performs the mount for you. rclone mount itself still uses FUSE (macFUSE/FUSE-T) and does not switch to NFS via a flag. periodt. โ
This method spins up an NFS server using serve nfs (https://rclone.org/commands/rclone_serve_nfs/) command and mounts it to the specified mountpoint. If you run this in background mode using --daemon, you will need to send SIGTERM signal to the rclone process using kill command to stop the mount. yes, you gotta actually kill it, it's not gonna let go on its own ๐
Note that --nfs-cache-handle-limit controls the maximum number of cached file handles stored by the nfsmount caching handler. This should not be set too low or you may experience errors when trying to access files. The default is 1000000, but consider lowering this limit if the server's system resource usage causes problems. (lowkey a whole balancing act, iykyk)
๐งฉ macFUSE Notes ๐งฉ
If you install macFUSE using dmg packages (https://github.com/osxfuse/osxfuse/releases) from the website, rclone will locate the macFUSE libraries without any further intervention. If however, macFUSE is installed using the macports (https://www.macports.org/) package manager, the following addition steps are required:
sudo mkdir /usr/local/lib
cd /usr/local/lib
sudo ln -s /opt/local/lib/libfuse.2.dylib
three lines. that's it. slay ๐
๐ธ FUSE-T Limitations, Caveats, and Notes ๐ธ
There are some limitations, caveats, and notes about how it works. These are current as of FUSE-T version 1.0.14.
โฐ ModTime update on read โฐ
As per the FUSE-T wiki (https://github.com/macos-fuse-t/fuse-t/wiki#caveats):
File access and modification times cannot be set separately as it seems to be an issue with the NFS client which always modifies both. Can be reproduced with touch -m and touch -a commands
This means that viewing files with various tools โ notably macOS Finder โ will cause rclone to update the modification time of the file. This may make rclone upload a full new copy of the file. sobbing. why is it like this ๐ญ
๐ Read Only mounts ๐
When mounting with --read-only, attempts to write to files will fail silently as opposed to with a clear warning as in macFUSE. not it failing silently, that's so rude fr ๐ซ
๐ง Mounting on Linux ๐ง
On newer versions of Ubuntu, you may encounter the following error when running rclone mount:
NOTICE: mount helper error: fusermount3: mount failed: Permission denied
CRITICAL: Fatal error: failed to mount FUSE fs: fusermount: exit status 1
This may be due to newer Apparmor (https://wiki.ubuntu.com/AppArmor) restrictions, which can be disabled with sudo aa-disable /usr/bin/fusermount3 (you may need to sudo apt install apparmor-utils beforehand). vibe check: apparmor said no and you said actually yes ๐
๐ก Mounting on OpenBSD ๐ก
rclone nfsmount works on OpenBSD by spinning up the serve nfs (https://rclone.org/commands/rclone_serve_nfs/) server and mounting it with the system mount_nfs(8), the same approach used for the NFS mount method on macOS. There is no FUSE-based mount option on OpenBSD, so nfsmount is the only way to mount rclone remotes as a local file system there. it's the main character of OpenBSD mounting, no competition ๐
๐บ๏ธ portmap registration ๐บ๏ธ
OpenBSD's kernel NFS client locates mountd through the system portmapper rather than connecting to a fixed port, so rclone's in-process NFS server needs to be registered with portmap before it can be mounted. Start the serve nfs server on a fixed port, stop the system NFS services so they don't conflict with it, then register that port with portmap for both the nfs and mountd RPC programs (this is the recipe from hjicks in #8578 (https://github.com/rclone/rclone/issues/8578#issuecomment-2799229652)):
rclone serve nfs --addr localhost:<PORT> remote:path
doas rcctl stop nfsd portmap
doas pkill -9 mountd # mountd can't be stopped via rcctl(8)
doas rcctl -f start portmap
doas rpcinfo -s nfs 3 <PORT>
doas rpcinfo -s mountd 3 <PORT>
Replace <PORT> with the port passed to --addr. Port 2049 works too, but needs either running rclone as root or adjusting sysctl(8) at securelevel 0, so a non-privileged port is simpler for testing. yeah just use a regular port bestie, don't make your life harder โจ
๐ ๏ธ Use mount_nfs -T, not mount ๐ ๏ธ
Mount the exported NFS share directly with mount_nfs(8) using the -T flag to force TCP, rather than the generic mount(8) wrapper โ OpenBSD's mount(8) does not understand -T and rejects it with unknown option -- T:
mount_nfs -T localhost:/ /path/to/local/mount
rclone nfsmount does this for you automatically on OpenBSD (it calls mount_nfs directly with -T instead of going through mount), so this is only needed if you are mounting the serve nfs export by hand. ๐ซถ
๐ AUTH_UNIX and existing limitations ๐
OpenBSD's (and the other BSDs') kernel NFS client requires the server to offer the AUTH_UNIX authentication flavor during the MOUNT RPC handshake; a server that only offers AUTH_NULL is rejected with mount_nfs: can't access /: Authentication error. rclone's NFS server advertises AUTH_UNIX for this reason, though it does not implement any per-user access control on top of it โ see issue #8578 (https://github.com/rclone/rclone/issues/8578) for the background on this and for the current state of OpenBSD support. the lore is real ๐
โ ๏ธ Limitations โ ๏ธ
Without the use of --vfs-cache-mode this can only write files sequentially, it can only seek when reading. This means that many applications won't work with their files on an rclone mount without --vfs-cache-mode writes or --vfs-cache-mode full. See the VFS File Caching section for more info. When using NFS mount on macOS, if you don't specify --vfs-cache-mode the mount point will be read-only. yikes, but ok we move ๐
Bucket-based remotes โ Azure Blob, Swift, S3, Google Cloud Storage and B2 โ can't store empty directories. Of these, only Azure Blob, Google Cloud Storage and S3 can preserve them when you add --xxx-directory_markers; otherwise, empty directories will vanish once they drop out of the directory cache. poof. gone. ๐ฆโจ
When rclone mount is invoked on Unix with --daemon flag, the main rclone program will wait for the background mount to become ready or until the timeout specified by the --daemon-wait flag. On Linux it can check mount status using ProcFS so the flag in fact sets maximum time to wait, while the real wait can be less. On macOS / BSD the time to wait is constant and the check is performed only at the end. We advise you to set wait time on macOS reasonably. (like, reasonably. please. ๐)
Only supported on Linux, FreeBSD, OS X and Windows at the moment.
๐ rclone mount vs rclone sync/copy ๐
File systems expect things to be 100% reliable, whereas cloud storage systems are a long way from 100% reliable. The rclone sync/copy commands cope with this with lots of retries. However rclone mount can't use retries in the same way without making local copies of the uploads. Look at the VFS File Caching for solutions to make mount more reliable. different strokes for different commands fr ๐
๐ง Attribute caching ๐ง
You can use the flag --attr-timeout to set the time the kernel caches the attributes (size, modification time, etc.) for directory entries.
The default is 1s which caches files just long enough to avoid too many callbacks to rclone from the kernel.
In theory 0s should be the correct value for filesystems which can change outside the control of the kernel. However this causes quite a few problems such as rclone using too much memory (https://github.com/rclone/rclone/issues/2157), rclone not serving files to samba (https://forum.rclone.org/t/rclone-1-39-vs-1-40-mount-issue/5112) and excessive time listing directories (https://github.com/rclone/rclone/issues/2095#issuecomment-371141147). so 0s is a trap, do not fall for it bestie ๐ญ
The kernel can cache the info about a file for the time given by --attr-timeout. You may see corruption if the remote file changes length during this window. It will show up as either a truncated file or a file with garbage on the end. With --attr-timeout 1s this is very unlikely but not impossible. The higher you set --attr-timeout the more likely it is. The default setting of "1s" is the lowest setting which mitigates the problems above. so keep it at 1s and we all stay happy ๐
Crank that up to 10s or 1m and the kernel is gonna call back to rclone wayyy less often, which is lowkey more efficient โ but bestie, the corruption situation from literally two paragraphs ago? higher chance of that happening. ๐
If files on the remote don't change outside of rclone's little controlled bubble, then there's fr fr no chance of corruption. โจ
Oh and heads up โ this is the exact same thing as setting the attr_timeout option in mount.fuse.
๐ Filters ๐
Quick reminder: all the rclone filters work here ๐ โ use them to pick and choose a subset of the files that'll be visible in the mount.
๐ซถ systemd ๐ซถ
So when you're running rclone mount as a systemd service, you can use Type=notify. In this case the service enters the started state only after the mountpoint has been successfully set up. Units that have the rclone mount service specified as a requirement will then see all files and folders immediately in this mode. iconic behavior honestly ๐
โ ๏ธ not me warning you again, but: systemd runs mount units with zero environment variables โ includingPATHandHOME. which means tilde (~) expansion is not happening. you gotta hand over--configand--cache-direxplicitly as absolute paths via rclone arguments. ๐ญ
Since mounting needs the fusermount or fusermount3 program, rclone will fall back to the PATH of /bin:/usr/bin in this scenario. So pleaseeee make sure fusermount/fusermount3 is actually present on that PATH. ๐
๐ Rclone as Unix mount helper ๐
OK so the core Unix program /bin/mount normally takes the -t FSTYPE argument and then runs the /sbin/mount.FSTYPE helper program, passing it mount options as -o key=val,... or --opt=.... Automount (classic or systemd) does basically the same vibe.
Now, rclone by default expects GNU-style flags --key val. To run it as a mount helper you should symlink the rclone binary to /sbin/mount.rclone and optionally /usr/bin/rclonefs, like:
ln -s /usr/bin/rclone /sbin/mount.rclone
rclone will detect it and translate the command-line arguments appropriately. ๐ช
Now you can run classic mounts like this:
mount sftp1:subdir /mnt/data -t rclone -o vfs_cache_mode=writes,sftp_key_file=/path/to/pem
or create systemd mount units:
# /etc/systemd/system/mnt-data.mount
[Unit]
Description=Mount for /mnt/data
[Mount]
Type=rclone
What=sftp1:subdir
Where=/mnt/data
Options=rw,_netdev,allow_other,args2env,vfs-cache-mode=writes,config=/etc/rclone.conf,cache-dir=/var/rclone
optionally accompanied by a systemd automount unit:
# /etc/systemd/system/mnt-data.automount
[Unit]
Description=AutoMount for /mnt/data
[Automount]
Where=/mnt/data
TimeoutIdleSec=600
[Install]
WantedBy=multi-user.target
or add in /etc/fstab a line like:
sftp1:subdir /mnt/data rclone rw,noauto,nofail,_netdev,x-systemd.automount,args2env,vfs_cache_mode=writes,config=/etc/rclone.conf,cache_dir=/var/cache/rclone 0 0
or use classic Automountd. Don't forget to provide explicit config=..., cache-dir=... as a workaround for mount units being run without HOME. ๐
Rclone in the mount helper mode will split the -o argument(s) by comma, replace _ by - and prepend -- to get the command-line flags. Options containing commas or spaces can be wrapped in single or double quotes. Any inner quotes inside outer quotes of the same type should be doubled. ๐
Mount option syntax includes a few extra options that get treated specially:
env.NAME=VALUEwill set an environment variable for the mount process. This helps with Automountd and Systemd.mount which don't allow setting a custom environment for mount helpers. Typically you'll useenv.HTTPS_PROXY=proxy.host:3128orenv.HOME=/root๐command=cmountcan be used to runcmountor any other rclone command rather than the defaultmount.args2envwill pass mount options to the mount helper running in the background via environment variables instead of command line arguments. This lets you hide secrets from such commands aspsorpgrep. ๐คซvv...will be transformed into the appropriate--verbose=N- standard mount options like
x-systemd.automount,_netdev,nosuidand alike are intended only for Automountd and are ignored by rclone.
๐ VFS - Virtual File System ๐
This command uses the VFS layer. This adapts the cloud storage objects that rclone uses into something that looks much more like a disk filing system. ๐ฆ
Cloud storage objects have lots of properties that just aren't like disk files โ you can't extend them or write to the middle of them, so the VFS layer has to deal with that. And because there's no one right way of doing this, there are various options, explained below. ๐ธ
The VFS layer also implements a directory cache โ this caches info about files and directories (but not the data) in memory.
๐ VFS Directory Cache ๐
Using the --dir-cache-time flag, you can control how long a directory should be considered up to date and not refreshed from the backend. Changes made through the VFS will appear immediately or invalidate the cache.
--dir-cache-time duration Time to cache directory entries for (default 5m0s)
--poll-interval duration Time to wait between polling for changes. Must be smaller than dir-cache-time. Only on supported remotes. Set to 0 to disable (default 1m0s)
However, changes made directly on the cloud storage by the web interface or a different copy of rclone will only be picked up once the directory cache expires โ that is, if the backend you configured does not support polling for changes. If the backend does support polling, changes will be picked up within the polling interval. ๐
You can send a SIGHUP signal to rclone to make it flush all directory caches, no matter how old they are. Assuming only one rclone instance is running, you can reset the cache like this:
kill -SIGHUP $(pidof rclone)
If you configure rclone with a remote control then you can use rclone rc to flush the whole directory cache:
rclone rc vfs/forget
Or individual files or directories:
rclone rc vfs/forget file=path/to/file dir=path/to/dir
๐ง VFS File Buffering ๐ง
The --buffer-size flag determines the amount of memory that will be used to buffer data in advance. ๐พ
Each open file will try to keep the specified amount of data in memory at all times. The buffered data is bound to one open file and won't be shared.
This flag is an upper limit for the used memory per open file. The buffer will only use memory for data that is downloaded but not yet read. If the buffer is empty, only a small amount of memory will be used. ๐
The maximum memory used by rclone for buffering can be up to --buffer-size * open files. ๐ณ
๐ VFS File Caching ๐
These flags control the VFS file caching options. File caching is necessary to make the VFS layer appear compatible with a normal file system. It can be disabled, at the cost of some compatibility.
For example, you'll need to enable VFS caching if you want to read and write simultaneously to a file. See below for more details. ๐
Note that the VFS cache is separate from the cache backend and you may find that you need one or the other or both.
--cache-dir string Directory rclone will use for caching.
--vfs-cache-mode CacheMode Cache mode off|minimal|writes|full (default off)
--vfs-cache-max-age duration Max time since last access of objects in the cache (default 1h0m0s)
--vfs-cache-max-size SizeSuffix Max total size of objects in the cache (default off)
--vfs-cache-min-free-space SizeSuffix Target minimum free space on the disk containing the cache (default off)
--vfs-cache-poll-interval duration Interval to poll the cache for stale objects (default 1m0s)
--vfs-write-back duration Time to writeback files after last use when using cache (default 5s)
If run with -vv rclone will print the location of the file cache. The files are stored in the user cache file area, which is OS dependent but can be controlled with --cache-dir or by setting the appropriate environment variable. ๐๏ธ
The cache has 4 different modes selected by --vfs-cache-mode. The higher the cache mode, the more compatible rclone becomes โ at the cost of using disk space. ๐
Note that files are written back to the remote only when they are closed, and if they haven't been accessed for --vfs-write-back seconds. If rclone is quit or dies with files that haven't been uploaded, these will be uploaded next time rclone is run with the same flags. โจ
If using --vfs-cache-max-size or --vfs-cache-min-free-space, note that the cache may exceed these quotas for two reasons. Firstly, because it is only checked every --vfs-cache-poll-interval. Secondly, because open files cannot be evicted from the cache. When --vfs-cache-max-size or --vfs-cache-min-free-space is exceeded, rclone will attempt to evict the least accessed files from the cache first. rclone will start with files that haven't been accessed for the longest. This cache flushing strategy is efficient, and more relevant files are likely to remain cached. ๐
The --vfs-cache-max-age will evict files from the cache after the set time since last access has passed; it is based on access time, not on when the file was first added to the cache. The default value of 1 hour will start evicting files from cache that haven't been accessed for 1 hour. When a cached file is accessed the 1 hour timer is reset to 0 and will wait for 1 more hour before evicting. Specify the time with standard notation: s, m, h, d, w.
๐จ bestie listen. Do NOT run two copies of rclone using the same VFS cache with the same or overlapping remotes if you're using--vfs-cache-mode > off. This can potentially cause data corruption. ๐ You can work around this by giving each rclone its own cache hierarchy with--cache-dir. You don't need to worry about this if the remotes in use don't overlap. ๐ซถ
๐ --vfs-cache-mode off ๐
In this mode (the default) the cache will read directly from the remote and write directly to the remote without caching anything on disk.
This will mean some operations are not possible:
- Files can't be opened for both read AND write
- Files opened for write can't be seeked
- Existing files opened for write must have
O_TRUNCset - Files open for read with
O_TRUNCwill be opened write only - Files open for write only will behave as if
O_TRUNCwas supplied - Open modes
O_APPEND,O_TRUNCare ignored - If an upload fails it can't be retried ๐ญ
๐ธ --vfs-cache-mode minimal ๐ธ
This is very similar to "off" except that files opened for read AND write will be buffered to disk. This means files opened for write will be a lot more compatible, but it uses the minimal disk space. slay ๐
These operations are not possible:
- Files opened for write only can't be seeked
- Existing files opened for write must have
O_TRUNCset - Files opened for write only will ignore
O_APPEND,O_TRUNC - If an upload fails it can't be retried
๐พ --vfs-cache-mode writes
Okay so in this mode, files that get opened for read only are still read straight from the remote like a normal person. But write only and read/write files? Those get buffered to disk first. ๐ซถ
This mode should support all normal file system operations. It's giving "yeah I can do that".
And the good news bestie: if an upload fails it will be retried, at exponentially increasing intervals up to 1 minute. Growth mindset fr fr. โจ
๐ --vfs-cache-mode full
This is the maximalist mode, no cap. In this mode all reads and writes are buffered to and from disk. And when data is read from the remote, that's buffered to disk as well. Everything gets a lil home on your disk. ๐
In this mode the files in the cache will be sparse files and rclone will keep track of which bits of the files it has downloaded.
So if an application only reads the starts of each file, then rclone will only buffer the start of the file. These files will appear to be their full size in the cache, but they will be sparse files with only the data that has been downloaded present in them. Iconic, honestly. ๐
This mode should support all normal file system operations and is otherwise identical to --vfs-cache-mode writes.
When reading a file rclone will read --buffer-size plus --vfs-read-ahead bytes ahead. The --buffer-size is buffered in memory whereas the --vfs-read-ahead is buffered on disk.
When using this mode it is recommended that --buffer-size is not set too large and --vfs-read-ahead is set large if required.
IMPORTANT ๐จ not all file systems support sparse files. In particular FAT/exFAT do not. Rclone will perform very badly if the cache directory is on a filesystem which doesn't support sparse files and it will log an ERROR message if one is detected. Please check before you commit to this, bestie, I am begging.
๐ต๏ธ Fingerprinting
Various parts of the VFS use fingerprinting to see if a local file copy has changed relative to a remote file. It's basically the VFS doing a lil vibe check on your files. ๐ธ Fingerprints are made from:
- size
- modification time
- hash
where available on an object.
On some backends some of these attributes are slow to read (they take an extra API call per object, or extra work per object). Not every remote wants to talk to you that badly, and honestly, same.
For example hash is slow with the local and sftp backends as they have to read the entire file and hash it, and modtime is slow with the s3, swift, ftp and qinqstor backends because they need to do an extra API call to fetch it.
If you use the --vfs-fast-fingerprint flag then rclone will not include the slow operations in the fingerprint. This makes the fingerprinting less accurate but much faster and will improve the opening time of cached files. Speed over precision, we love a tradeoff. ๐ฅ
If you are running a vfs cache over local, s3 or swift backends then using this flag is recommended.
Note that if you change the value of this flag, the fingerprints of the files in the cache may be invalidated and the files will need to be downloaded again. So like... decide first. ๐ญ
๐งฉ VFS Chunked Reading
When rclone reads files from a remote it reads them in chunks. Instead of requesting the whole entire file like a greedy lil gremlin, rclone reads the chunk specified. This can reduce the used download quota for some remotes by requesting only chunks from the remote that are actually read โ at the cost of an increased number of requests. Ate.
These flags control the chunking:
--vfs-read-chunk-size SizeSuffixโ Read the source objects in chunks (default128M)--vfs-read-chunk-size-limit SizeSuffixโ Max chunk doubling size (defaultoff)--vfs-read-chunk-streams intโ The number of parallel streams to read at once
The chunking behaves differently depending on the --vfs-read-chunk-streams parameter.
๐ --vfs-read-chunk-streams == 0
Rclone will start reading a chunk of size --vfs-read-chunk-size, and then double the size for each read. When --vfs-read-chunk-size-limit is specified, and greater than --vfs-read-chunk-size, the chunk size for each open file will get doubled only until the specified value is reached. If the value is "off", which is the default, the limit is disabled and the chunk size will grow indefinitely. It's giving infinite growth, main character energy. ๐
With --vfs-read-chunk-size 100M and --vfs-read-chunk-size-limit 0 the following parts will be downloaded: 0-100M, 100M-200M, 200M-300M, 300M-400M and so on. When --vfs-read-chunk-size-limit 500M is specified, the result would be 0-100M, 100M-300M, 300M-700M, 700M-1200M, 1200M-1700M and so on.
Setting --vfs-read-chunk-size to 0 or "off" disables chunked reading.
The chunks will not be buffered in memory.
๐ฆ --vfs-read-chunk-streams > 0
Rclone reads --vfs-read-chunk-streams chunks of size --vfs-read-chunk-size concurrently. The size for each read will stay constant. No doubling, just straight vibes every time.
This improves performance massively on high latency links or very high bandwidth links to high performance object stores. Obsessed. ๐
Some experimentation will be needed to find the optimum values of --vfs-read-chunk-size and --vfs-read-chunk-streams as these will depend on the backend in use and the latency to the backend. Like, you gotta tune it yourself, bestie, I can't do it for you.
For high performance object stores (eg AWS S3) a reasonable place to start might be --vfs-read-chunk-streams 16 and --vfs-read-chunk-size 4M. In testing with AWS S3 the performance scaled roughly as the --vfs-read-chunk-streams setting.
Similar settings should work for high latency links, but depending on the latency they may need more --vfs-read-chunk-streams in order to get the throughput.
โก VFS Performance
These flags may be used to enable/disable features of the VFS for performance or other reasons. See also the chunked reading feature, btw, they're besties. ๐ฏ
In particular S3 and Swift benefit hugely from the --no-modtime flag (or use --use-server-modtime for a slightly different effect) as each read of the modification time takes a transaction. Every single one. Cha-ching. ๐
--no-checksumโ Don't compare checksums on up/download.--no-modtimeโ Don't read/write the modification time (can speed things up).--no-seekโ Don't allow seeking in files.--read-onlyโ Only allow read-only access.
Sometimes rclone is delivered reads or writes out of order. Rather than seeking, rclone will wait a short time for the in sequence read or write to come in. These flags only come into effect when not using an on disk cache file.
--vfs-read-wait durationโ Time to wait for in-sequence read before seeking (default20ms)--vfs-write-wait durationโ Time to wait for in-sequence write before giving error (default1s)
When using VFS write caching (--vfs-cache-mode with value writes or full), the global flag --transfers can be set to adjust the number of parallel uploads of modified files from the cache (the related global flag --checkers has no effect on the VFS).
--transfers intโ Number of file transfers to run in parallel (default4)
๐ Symlinks
By default the VFS does not support symlinks. However this may be enabled with either of the following flags:
--linksโ Translate symlinks to/from regular files with a'.rclonelink'extension.--vfs-linksโ Translate symlinks to/from regular files with a'.rclonelink'extension for the VFS
As most cloud storage systems do not support symlinks directly, rclone stores the symlink as a normal file with a special extension. So a file which appears as a symlink link-to-file.txt would be stored on cloud storage as link-to-file.txt.rclonelink and the contents would be the path to the symlink destination. Cute little disguise honestly. ๐ญ
Note that --links enables symlink translation globally in rclone โ this includes any backend which supports the concept (for example the local backend). --vfs-links just enables it for the VFS layer. So one is a whole-lifetime thing and the other is just for this function, iykyk.
This scheme is compatible with that used by the local backend with the --local-links flag (https://rclone.org/local/#symlinks-junction-points).
The --vfs-links flag has been designed for rclone mount, rclone nfsmount and rclone serve nfs.
It hasn't been tested with the other rclone serve commands yet.
A limitation of the current implementation is that it expects the caller to resolve sub-symlinks. For example given this directory tree
.
โโโ dir
โ โโโ file.txt
โโโ linked-dir -> dir
The VFS will correctly resolve linked-dir but not linked-dir/file.txt. This is not a problem for the tested commands but may be for other commands.
Note that there is an outstanding issue with symlink support issue #8245 (https://github.com/rclone/rclone/issues/8245) with duplicate files being created when symlinks are moved into directories where there is a file of the same name (or vice versa). Just so you know, bestie. ๐
๐ค VFS Case Sensitivity
Linux file systems are case-sensitive: two files can differ only by case, and the exact case must be used when opening a file.
File systems in modern Windows are case-insensitive but case-preserving: although existing files can be opened using any case, the exact case used to create the file is preserved and available for programs to query. It is not allowed for two files in the same directory to differ only by case.
Usually file systems on macOS are case-insensitive. It is possible to make macOS file systems case-sensitive but that is not the default.
The --vfs-case-insensitive VFS flag controls how rclone handles these two cases. If its value is "false", rclone passes file names to the remote as-is. If the flag is "true" (or appears without a value on the command line), rclone may perform a "fixup" as explained below.
The user may specify a file name to open/delete/rename/etc with a case different than what is stored on the remote. If an argument refers to an existing file with exactly the same name, then the case of the existing file on the disk will be used. However, if a file name with exactly the same name is not found but a name differing only by case exists, rclone will transparently fixup the name. This fixup happens only when an existing file is requested. Case sensitivity of file names created anew by rclone is controlled by the underlying remote.
Note that case sensitivity of the operating system running rclone (the target) may differ from case sensitivity of a file system presented by rclone (the source). The flag controls whether "fixup" is performed to satisfy the target.
If the flag is not provided on the command line, then its default value depends on the operating system where rclone runs: "true" on Windows and macOS, "false" otherwise. If the flag is provided without a value, then it is "true". Periodt. ๐
--no-unicode-normalization is the little switch that decides whether we do a similar "fixup" for filenames that are different but canonically equivalent ([https://en.wikipedia.org/wiki/Unicode_equivalence](https://en.wikipedia.org/wiki/Unicode_equivalence)) when it comes to unicode ๐
. And like โ unicode normalization is genuinely sooo helpful if you're on macOS, bestie, because macOS loves form NFD while basically every other platform uses NFC. So yeah, keeping the default of false on macOS? highly recommended, no cap, because otherwise you get encoding compatibility issues and we do NOT want that drama ๐.
So in the (probably unlikely, fr fr) event that a directory has multiple duplicate filenames even after we apply case and unicode normalization, the --vfs-block-norm-dupes flag will let you hide those dupes. But bestie โ performance tradeoff alert ๐จ: rclone has to scan the ENTIRE directory looking for duplicates every time it lists a directory. So the recommendation is to leave it disabled unless you actually need it. However, macOS girlies might wanna consider turning it on, because otherwise, if a remote directory has both the NFC and NFD versions of the same filename, something truly cursed happens: both versions show up in the mount, both look editable, but editing either one actually only edits the NFD version under the hood ๐ญ. --vfs-block-norm-dupes stops that whole confusion by detecting the scenario, hiding the duplicates, and logging an error โ basically the same way rclone sync handles it. Iconic behaviour, tbh โจ.
๐ VFS Disk Options ๐
This flag lets you manually set the statistics about your filing system, which is lowkey a lifesaver when those stats can't be read correctly automatically ๐ซถ.
--vfs-disk-space-total-sizeโ Manually set the total disk space size (example:256G, default:-1)
๐ Alternate report of used bytes ๐
Okay so some backends โ most notably S3 โ literally just do not report the amount of bytes used. Rude. So if you need that info when you run df on the filesystem, pass the flag --vfs-used-is-size to rclone. With that flag set, instead of trusting the backend to cough up the number, rclone will scan the whole remote โ kinda like rclone size โ and compute the total used space itself ๐ช.
WARNING: Contrary to rclone size, this flag ignores filters so that the result is accurate. However, this is very inefficient and may cost lots of API calls resulting in extra charges ๐ธ. Use it as a last resort and only with caching.
๐ฆ VFS Metadata ๐ฆ
If you use the --vfs-metadata-extension flag, you can get the VFS to expose files which contain the metadata ([https://rclone.org/docs/#metadata](https://rclone.org/docs/#metadata)) as a JSON blob ๐. These files will not appear in the directory listing, but they can be stat-ed and opened, and once they have been, they'll show up in directory listings until the directory cache expires โณ.
Note that some backends won't create metadata unless you pass in the --metadata flag. iykyk ๐
For example, using rclone mount with --metadata --vfs-metadata-extension .metadata we get:
$ ls -l /mnt/
total 1048577
-rw-rw-r-- 1 user user 1073741824 Mar 3 16:03 1G
$ cat /mnt/1G.metadata
{
"atime": "2025-03-04T17:34:22.317069787Z",
"btime": "2025-03-03T16:03:37.708253808Z",
"gid": "1000",
"mode": "100664",
"mtime": "2025-03-03T16:03:39.640238323Z",
"uid": "1000"
}
$ ls -l /mnt/
total 1048578
-rw-rw-r-- 1 user user 1073741824 Mar 3 16:03 1G
-rw-rw-r-- 1 user user 185 Mar 3 16:03 1G.metadata
If the file has no metadata it will be returned as {} and if there is an error reading the metadata the error will be returned as {"error":"error string"} ๐ธ.
rclone mount remote:path /path/to/mountpoint [flags]
โจ Options โจ
--allow-idmapโ Allow id-mapped mounts (Linux 6.12+, mount2 only)--allow-non-emptyโ Allow mounting over a non-empty directory (not supported on Windows)--allow-otherโ Allow access to other users (not supported on Windows)--allow-rootโ Allow access to root user (not supported on Windows)--async-readโ Use asynchronous reads (not supported on Windows) (default true)--attr-timeoutDuration โ Time for which file/directory attributes are cached (default 1s)--daemonโ Run mount in background and exit parent process (as background output is suppressed, use--log-filewith--log-format=pid,...to monitor) (not supported on Windows)--daemon-timeoutDuration โ Time limit for rclone to respond to kernel (not supported on Windows) (default 0s)--daemon-waitDuration โ Time to wait for ready mount from daemon (maximum time on Linux, constant sleep time on OSX/BSD) (not supported on Windows) (default 1m0s)--debug-fuseโ Debug the FUSE internals - needs-v--default-permissionsโ Makes kernel enforce access control based on the file mode (not supported on Windows)--devnamestring โ Set the device name - default isremote:path--dir-cache-timeDuration โ Time to cache directory entries for (default 5m0s)--dir-permsFileMode โ Directory permissions (default 777)--direct-ioโ Use Direct IO, disables caching of data--file-permsFileMode โ File permissions (default 666)--fuse-flagstringArray โ Flags or arguments to be passed direct to libfuse/WinFsp (repeat if required)--giduint32 โ Override the gid field set by the filesystem (not supported on Windows) (default 1000)-h,--helpโ help for mount--link-permsFileMode โ Link permissions (default 666)--max-read-aheadSizeSuffix โ The number of bytes that can be prefetched for sequential reads (not supported on Windows) (default 128Ki)--mount-case-insensitiveTristate โ Tell the OS the mount is case insensitive (true) or sensitive (false) regardless of the backend (auto) (default unset)--network-modeโ Mount as remote network drive, instead of fixed disk drive (supported on Windows only)--no-checksumโ Don't compare checksums on up/download--no-modtimeโ Don't read/write the modification time (can speed things up)--no-seekโ Don't allow seeking in files--noappledoubleโ Ignore Apple Double (._) and.DS_Storefiles (supported on OSX only) (default true)--noapplexattrโ Ignore all"com.apple.*"extended attributes (supported on OSX only)-o,--optionstringArray โ Option for libfuse/WinFsp (repeat if required)--poll-intervalDuration โ Time to wait between polling for changes, must be smaller than dir-cache-time and only on supported remotes (set 0 to disable) (default 1m0s)--read-onlyโ Only allow read-only access--uiduint32 โ Override the uid field set by the filesystem (not supported on Windows) (default 1000)--umaskFileMode โ Override the permission bits set by the filesystem (not supported on Windows) (default 002)--vfs-block-norm-dupesโ If duplicate filenames exist in the same directory (after normalization), log an error and hide the duplicates (may have a performance cost)--vfs-cache-max-ageDuration โ Max time since last access of objects in the cache (default 1h0m0s)--vfs-cache-max-sizeSizeSuffix โ Max total size of objects in the cache (default off)--vfs-cache-min-free-spaceSizeSuffix โ Target minimum free space on the disk containing the cache (default off)--vfs-cache-modeCacheMode โ Cache mode off|minimal|writes|full (default off)--vfs-cache-poll-intervalDuration โ Interval to poll the cache for stale objects (default 1m0s)--vfs-case-insensitiveโ If a file name not found, find a case insensitive match--vfs-disk-space-total-sizeSizeSuffix โ Specify the total space of disk (default off)--vfs-fast-fingerprintโ Use fast (less accurate) fingerprints for change detection--vfs-handle-cachingDuration โ Time to keep file handle and downloaders alive after last close (default 5s)--vfs-linksโ Translate symlinks to/from regular files with a.rclonelinkextension for the VFS--vfs-metadata-extensionstring โ Set the extension to read metadata from--vfs-read-aheadSizeSuffix โ Extra read ahead over--buffer-sizewhen using cache-mode full--vfs-read-chunk-sizeSizeSuffix โ Read the source objects in chunks (default 128Mi)--vfs-read-chunk-size-limitSizeSuffix โ If greater than--vfs-read-chunk-size, double the chunk size after each chunk read, until the limit is reached ('off'is unlimited) (default off)--vfs-read-chunk-streamsint โ The number of parallel streams to read at once--vfs-read-waitDuration โ Time to wait for in-sequence read before seeking (default 20ms)--vfs-refreshโ Refreshes the directory cache recursively in the background on start--vfs-used-is-sizerclone size โ Use therclone sizealgorithm for Used size--vfs-write-backDuration โ Time to writeback files after last use when using cache (default 5s)--vfs-write-waitDuration โ Time to wait for in-sequence write before giving error (default 1s)--volnamestring โ Set the volume name (supported on Windows and OSX only)--write-back-cacheโ Makes kernel buffer writes before sending them to rclone (without this, writethrough caching is used) (not supported on Windows)
Options shared with other commands are described next. See the global flags page ([https://rclone.org/flags/](https://rclone.org/flags/)) for global options not listed here ๐.
๐ Filter Options ๐
Flags for filtering directory listings ๐
--delete-excludedโ deletes the files on the dest that got excluded from the sync. bye bestie ๐--excludestringArray โ excludes files matching this pattern--exclude-fromstringArray โ reads exclude patterns from a file (use-to read from stdin)--exclude-if-presentstringArray โ nukes a whole directory from consideration if this filename is in there--files-fromstringArray โ reads the list of source-file names from a file (use-for stdin)--files-from-rawstringArray โ same thing but with zero processing of the lines (use-for stdin)--files-from0stringArray โ reads source-file names from a file using NUL as the separator (use-for stdin)-f,--filterstringArray โ adds a file filtering rule--filter-fromstringArray โ reads filtering patterns from a file (use-for stdin)--hash-filterstring โ partitions filenames by hashk/nor randomly with@/n--ignore-caseโ ignores case in filters, so it's case insensitive--includestringArray โ includes files matching this pattern--include-fromstringArray โ reads include patterns from a file (use-for stdin)--max-ageDuration โ only transfer files younger than this, insor with a suffix ofms|s|m|h|d|w|M|y(defaultoff)--max-depthint โ if you set it, it caps the recursion depth right there (default-1)--max-sizeSizeSuffix โ only transfer files smaller than this, in KiB or with a suffix ofB|K|M|G|T|P(defaultoff)--metadata-excludestringArray โ excludes metadata matching this pattern--metadata-exclude-fromstringArray โ reads metadata exclude patterns from a file (use-for stdin)--metadata-filterstringArray โ adds a metadata filtering rule--metadata-filter-fromstringArray โ reads metadata filtering patterns from a file (use-for stdin)--metadata-includestringArray โ includes metadata matching this pattern--metadata-include-fromstringArray โ reads metadata include patterns from a file (use-for stdin)--min-ageDuration โ only transfer files older than this, insor with a suffix ofms|s|m|h|d|w|M|y(defaultoff)--min-sizeSizeSuffix โ only transfer files bigger than this, in KiB or with a suffix ofB|K|M|G|T|P(defaultoff)
โจ See Also โจ
rclone(https://rclone.org/commands/rclone/) โ show help for rclone commands, flags and backends. the gateway drug fr fr ๐
๐ rclone moveto ๐
move a file or a directory from source to dest. it's giving relocation ๐ซ
๐ธ Synopsis ๐ธ
if source:path is a file or a directory, then moveto moves it to a file or directory named dest:path. simple as ๐ซถ
you can use this to rename files, or to upload single files under a name that isn't their existing one. and heads up: if the source is a directory, it acts exactly like the move command (https://rclone.org/commands/rclone_move/). no cap. โจ
so like
rclone moveto src dst
where src and dst are rclone paths โ either remote:path, or /path/to/local, or C:. ๐
this will:
if src is file
move it to dst, overwriting an existing file if it exists
if src is directory
move it to dst, overwriting existing files if they exist
see move command for full details
it does not transfer files that are already identical on src and dst โ it checks by size and modification time, or MD5SUM. and src gets deleted on a successful transfer. that's the whole point bestie ๐
Important: since this can cause data loss, test first with the--dry-runor the--interactive/-iflag. i am literally begging you ๐
Note: use the-P/--progressflag to view real-time transfer statistics. live numbers, so satisfying โญ
๐ Logger Flags ๐
the --differ, --missing-on-dst, --missing-on-src, --match and --error flags write paths, one per line, to the file name you supply (or to stdout if it's -). what they write is described in the help below. for example, --differ will write all paths which are present on both the source and destination but different. ๐ฆ
the --combined flag writes a file (or stdout) containing all the file paths, with a symbol, then a space, then the path โ telling you what happened to it. these are reminiscent of diff files. iconic tbh. ๐
= pathmeans path was found in source and destination and was identical- pathmeans path was missing on the source, so it's only in the destination+ pathmeans path was missing on the destination, so it's only in the source* pathmeans path was present in source and destination but different.! pathmeans there was an error reading or hashing the source or dest.
the --dest-after flag writes a list file using the same format flags as lsf (https://rclone.org/commands/rclone_lsf/#synopsis) โ including customizable options for hash, modtime, etc. (https://rclone.org/commands/rclone_lsf/#synopsis). conceptually it's similar to rsync's --itemize-changes, but not identical โ it should output an accurate list of what will be on the destination after the command is finished. it's a โจpreviewโจ of the future, main character energy ๐ฅ
when the --no-traverse flag is set, all logs involving files that exist only on the destination will be incomplete or completely missing. ๐
note that these logger flags have a few limitations, and certain scenarios are not currently supported:
--max-duration/CutoffModeHard--compare-dest/--copy-dest- server-side moves of an entire dir at once
- high-level retries, because there would be duplicates (use
--retries 1to disable) - possibly some unusual error scenarios
also note that each file is logged during execution, as opposed to after, so it's most useful as a predictor of what SHOULD happen to each file (which may or may not match what actually DID). she's a fortune teller, not a historian ๐ฎ
rclone moveto source:path dest:path [flags]
๐ Options ๐
--absoluteโ put a leading/in front of path names--combinedstring โ make a combined report of changes to this file--csvโ output in CSV format--dest-afterstring โ report all files that exist on the dest post-sync--differstring โ report all non-matching files to this file-d,--dir-slashโ append a slash to directory names (defaulttrue)--dirs-onlyโ only list directories--errorstring โ report all files with errors (hashing or reading) to this file--files-onlyโ only list files (defaulttrue)-F,--formatstring โ output format, seelsfhelp for details (default"p")--hashh โ use this hash whenhis used in the formatMD5|SHA-1|DropboxHash(default"md5")-h,--helpโ help for moveto--matchstring โ report all matching files to this file--missing-on-dststring โ report all files missing from the destination to this file--missing-on-srcstring โ report all files missing from the source to this file-s,--separatorstring โ separator for the items in the format (default";")-t,--timeformatstring โ specify a custom time format, see docs for details (default:2006-01-02 15:04:05)
options shared with other commands are described next. see the global flags page (https://rclone.org/flags/) for global options not listed here. ๐
๐ Copy Options ๐
flags for anything which can copy a file ๐
--check-firstโ does every single check before any transfer kicks off. like, all the vibes get verified first, then the moving starts โจ-c,--checksumโ looks for changes using size and checksum (if the remote has one, otherwise it falls back to size only). the thorough queen ๐--compare-deststringArray โ pulls in extra server-side paths to include during the comparison step ๐ฆ--copy-deststringArray โ same energy as--compare-destbut it also copies files from those paths into the destination ๐--cutoff-modeHARD|SOFT|CAUTIOUSโ picks the mode for stopping transfers once you hit the max transfer limit:HARD,SOFTorCAUTIOUS(defaultHARD) ๐--ignore-case-syncโ ignores case when syncing. case? never heard of her ๐--ignore-checksumโ skips the post-copy checksum check, no cap ๐--ignore-existingโ skips every file that already exists on the destination. it's giving "you're already here, bye" ๐--ignore-sizeโ ignores size when deciding to skip, so it uses modtime or checksum instead ๐-I,--ignore-timesโ does not skip items that match on size and time; transfers everything, unconditionally. literally no skipping, periodt ๐ฅ--immutableโ do not modify files. and if existing files have been modified? it fails. that's the rule ๐ซ--inplaceโ downloads straight to the destination file instead of doing the atomic download-to-temp-then-rename thing ๐ง-l,--linksโ translates symlinks to and from regular files, and adds a.rclonelinkextension in the process ๐--max-backlogint โ the maximum number of objects sitting in the sync or check backlog (default10000) ๐--max-durationDuration โ the maximum duration rclone will keep transferring data for (default0s) โณ--max-transferSizeSuffix โ the maximum size of data to transfer (defaultoff) ๐งณ-M,--metadataโ if you set it, metadata gets preserved when copying objects ๐ท๏ธ--modify-windowDuration โ the max time difference that still counts as "the same" (default1ns) ๐ฐ๏ธ--multi-thread-chunk-sizeSizeSuffix โ chunk size for multi-thread downloads/uploads, unless the filesystem sets its own (default64Mi) ๐งฉ--multi-thread-cutoffSizeSuffix โ files above this size get the multi-thread download treatment (default256Mi) ๐--multi-thread-streamsint โ how many streams to use for multi-thread downloads (default4) ๐--multi-thread-write-buffer-sizeSizeSuffix โ the in-memory buffer size used for writing while in multi-thread mode (default128Ki) โ๏ธ--name-transformstringArray โ transforms paths during the copy process ๐ช--no-check-destโ don't check the destination at all, just copy regardless. bold. iconic. possibly unhinged ๐ญ--no-traverseโ don't traverse the destination file system on copy ๐ฒ--no-update-dir-modtimeโ don't update directory modification times ๐--no-update-modtimeโ don't update the destination modtime if the files turn out to be identical ๐--order-bystring โ instructions for how to order the transfers, like'size,descending'๐--partial-suffixstring โ adds that suffix to the temporary file name when--inplaceis not being used (default".partial") ๐--refresh-timesโ refreshes the modtime of remote files โป๏ธ--server-side-across-configsโ lets server-side operations (like a copy) work across different configs ๐ค--size-onlyโ skips based on size only, not modtime or checksum ๐--streaming-upload-cutoffSizeSuffix โ the cutoff for switching to a chunked upload when the file size is unknown; the upload starts once it hits the cutoff or when the file ends (default100Ki) ๐-u,--updateโ skips files that are newer on the destination side โญ๏ธ
โจ Important Options โจ
important flags that are useful for most commands, bestie โ the little daily drivers ๐
-n,--dry-runโ does a trial run with zero permanent changes ๐งช-i,--interactiveโ turns on interactive mode ๐โโ๏ธ-v,--verbosecount โ prints lots more stuff (repeat it for even more) ๐ฃ๏ธ
๐ธ Filter Options ๐ธ
flags for filtering directory listings โ this is where you get to be picky and honestly? slay ๐
--delete-excludedโ deletes files on the destination that got excluded from the sync ๐๏ธ--excludestringArray โ excludes files matching the pattern ๐ซ--exclude-fromstringArray โ reads exclude patterns from a file (use-to read from stdin) ๐--exclude-if-presentstringArray โ excludes directories if that filename is present inside them ๐--files-fromstringArray โ reads a list of source-file names from a file (use-to read from stdin) ๐--files-from-rawstringArray โ reads the list of source-file names from a file with no processing of the lines at all (use-to read from stdin) ๐ถ๏ธ--files-from0stringArray โ reads the list of source-file names from a file using NUL as the separator (use-to read from stdin) ๐ซง-f,--filterstringArray โ adds a file filtering rule ๐ธ๏ธ--filter-fromstringArray โ reads file filtering patterns from a file (use-to read from stdin) ๐๏ธ--hash-filterstring โ partitions filenames by hash usingk/n, or randomly with@/n๐ฒ--ignore-caseโ ignores case in filters, so it's fully case insensitive ๐ค--includestringArray โ includes files matching the pattern ๐--include-fromstringArray โ reads include patterns from a file (use-to read from stdin) ๐ฅ--max-ageDuration โ only transfers files younger than this, insor with ams|s|m|h|d|w|M|ysuffix (defaultoff) ๐ฃ--max-depthint โ if set, limits the recursion depth to this (default-1) ๐ณ๏ธ--max-sizeSizeSuffix โ only transfers files smaller than this, in KiB or with aB|K|M|G|T|Psuffix (defaultoff) ๐--metadata-excludestringArray โ excludes metadatas matching the pattern ๐--metadata-exclude-fromstringArray โ reads metadata exclude patterns from a file (use-to read from stdin) ๐--metadata-filterstringArray โ adds a metadata filtering rule ๐งต--metadata-filter-fromstringArray โ reads metadata filtering patterns from a file (use-to read from stdin) ๐--metadata-includestringArray โ includes metadatas matching the pattern โ--metadata-include-fromstringArray โ reads metadata include patterns from a file (use-to read from stdin) ๐--min-ageDuration โ only transfers files older than this, insor with ams|s|m|h|d|w|M|ysuffix (defaultoff) ๐ง--min-sizeSizeSuffix โ only transfers files bigger than this, in KiB or with aB|K|M|G|T|Psuffix (defaultoff) ๐
๐ฆ Listing Options ๐ฆ
flags for listing directories โ the chill ones, no transferring required ๐
--default-timeTime โ the time to show when the modtime is unknown, for both files and directories (default2000-01-01T00:00:00Z) ๐--fast-listโ uses a recursive list if the remote supports it; costs more memory but does fewer transactions โก
๐ See Also ๐
rclone(https://rclone.org/commands/rclone/) โ shows help for rclone commands, flags and backends ๐
๐
rclone ncdu ๐
Explore a remote with a text based user interface. No cap. ๐๏ธ
Synopsis
Okay bestie, so picture this: this command pops open a whole text based user interface that lets you navigate a remote. It's the literal answer to the question every server owner asks at 2am โ "What is using all my disk space?" ๐ญ๐
To build that UI, it first scans the entire remote you gave it and builds up an in memory representation of everything. The cute part? You can totally use rclone ncdu during the scanning phase โ you'll literally watch it building up the directory structure as it goes along. It's giving construction site but make it โจaestheticโจ ๐๏ธ
You interact with the interface by pressing keys. Press ? to toggle the help on and off. The supported keys are, and I need you to screenshot this:
โ,โ or k,j to Move
โ,l to enter
โ,h to return
g toggle graph
c toggle counts
a toggle average size in directory
m toggle modified time
u toggle human-readable format
n,s,C,A,M sort by name,size,count,asize,mtime
d delete file/directory
v select file/directory
V enter visual select mode
D delete selected files/directories
y copy current path to clipboard
Y display current path
^L refresh screen (fix screen corruption)
r recalculate file sizes
? to toggle help on and off
ESC to close the menu box
q/^c to quit
Listed files/directories may be prefixed by a one-character flag, and some of them get combined with a description in brackets at the end of the line. These flags mean the following, periodt:
eโ means this is an empty directory, i.e. contains no files (but may contain empty subdirectories) ๐ซ~โ means this is a directory where some of the files (possibly in subdirectories) have unknown size, and therefore the directory size may be underestimated (and average size inaccurate, as it is average of the files with known sizes) ๐คทโโ๏ธ.โ means an error occurred while reading a subdirectory, and therefore the directory size may be underestimated (and average size inaccurate) ๐ฌ!โ means an error occurred while reading this directory ๐ฅ
This is an homage to the ncdu tool (https://dev.yorhel.nl/ncdu) but for rclone remotes. It is missing lots of features at the moment but is useful as it stands. Unlike ncdu it does not show excluded files. ๐
Heads up bestie: it might take some time to delete big files/directories. The UI won't respond in the meantime since the deletion is done synchronously. So like... stare at the frozen screen and trust the process, okay? ๐งโโ๏ธ
For a non-interactive listing of the remote, see the tree (https://rclone.org/commands/rclone_tree/) command. To just get the total size of the remote you can also use the size (https://rclone.org/commands/rclone_size/) command. ๐
rclone ncdu remote:path [flags]
โจ Options โจ
-h,--helpโ help for ncdu ๐
Options shared with other commands are described next. See the global flags page (https://rclone.org/flags/) for global options not listed here.
๐งบ Filter Options ๐งบ
Flags for filtering directory listings. Every single one, no skipping, I gotchu:
--delete-excludedโ Delete files on dest excluded from sync--exclude stringArrayโ Exclude files matching pattern--exclude-from stringArrayโ Read file exclude patterns from file (use-to read from stdin)--exclude-if-present stringArrayโ Exclude directories if filename is present--files-from stringArrayโ Read list of source-file names from file (use-to read from stdin)--files-from-raw stringArrayโ Read list of source-file names from file without any processing of lines (use-to read from stdin)--files-from0 stringArrayโ Read list of source-file names from file using NUL as separator (use-to read from stdin)-f,--filter stringArrayโ Add a file filtering rule--filter-from stringArrayโ Read file filtering patterns from a file (use-to read from stdin)--hash-filter stringโ Partition filenames by hashk/nor randomly@/n--ignore-caseโ Ignore case in filters (case insensitive)--include stringArrayโ Include files matching pattern--include-from stringArrayโ Read file include patterns from file (use-to read from stdin)--max-age Durationโ Only transfer files younger than this insor suffixms|s|m|h|d|w|M|y(default off)--max-depth intโ If set limits the recursion depth to this (default-1)--max-size SizeSuffixโ Only transfer files smaller than this in KiB or suffixB|K|M|G|T|P(default off)--metadata-exclude stringArrayโ Exclude metadatas matching pattern--metadata-exclude-from stringArrayโ Read metadata exclude patterns from file (use-to read from stdin)--metadata-filter stringArrayโ Add a metadata filtering rule--metadata-filter-from stringArrayโ Read metadata filtering patterns from a file (use-to read from stdin)--metadata-include stringArrayโ Include metadatas matching pattern--metadata-include-from stringArrayโ Read metadata include patterns from file (use-to read from stdin)--min-age Durationโ Only transfer files older than this insor suffixms|s|m|h|d|w|M|y(default off)--min-size SizeSuffixโ Only transfer files bigger than this in KiB or suffixB|K|M|G|T|P(default off)
๐ Listing Options ๐
Flags for listing directories, short and sweet:
--default-time Timeโ Time to show if modtime is unknown for files and directories (default2000-01-01T00:00:00Z)--fast-listโ Use recursive list if available; uses more memory but fewer transactions
๐ See Also ๐
rclone(https://rclone.org/commands/rclone/) โ Show help for rclone commands, flags and backends.
๐ฆ rclone nfsmount ๐ฆ
Mount the remote as file system on a mountpoint. Yes bestie, an actual mount. Iconic behavior. ๐ซถ
Synopsis
Rclone nfsmount allows Linux, FreeBSD, macOS and Windows to mount any of Rclone's cloud storage systems as a file system with FUSE. ๐ธ
First things first: set up your remote using rclone config. Then check it works with rclone ls etc. Vibe check before the big move. โ
On Linux and macOS, you can run mount in either foreground or background (aka daemon) mode. Mount runs in foreground mode by default. Use the --daemon flag to force background mode. On Windows you can run mount in foreground only โ the flag is ignored there, sorry boo. ๐
In background mode rclone acts as a generic Unix mount program: the main program starts, spawns a background rclone process to setup and maintain the mount, waits until success or timeout and exits with appropriate code (killing the child process if it fails). Very responsible of it ngl. ๐
On Linux/macOS/FreeBSD start the mount like this, where /path/to/local/mount is an empty existing directory:
rclone nfsmount remote:path/to/files /path/to/local/mount
On Windows you can start a mount in different ways. See below for details. If foreground mount is used interactively from a console window, rclone will serve the mount and occupy the console so another window should be used to work with the mount until rclone is interrupted e.g. by pressing Ctrl-C. ๐ฅ๏ธ
The following examples will mount to an automatically assigned drive, to specific drive letter X:, to path C:\path\parent\mount (where parent directory or drive must exist, and mount must not exist, and is not supported when mounting as a network drive), and the last example will mount as network share \\cloud\remote and map it to an automatically assigned drive:
rclone nfsmount remote:path/to/files *
rclone nfsmount remote:path/to/files X:
rclone nfsmount remote:path/to/files C:\path\parent\mount
rclone nfsmount remote:path/to/files \\cloud\remote
When the program ends while in foreground mode, either via Ctrl+C or receiving a SIGINT or SIGTERM signal, the mount should be automatically stopped. Cleanup queen. โจ
When running in background mode the user will have to stop the mount manually:
# Linux
fusermount -u /path/to/local/mount
#... or on some systems
fusermount3 -u /path/to/local/mount
# OS X or Linux when using nfsmount
umount /path/to/local/mount
The umount operation can fail, for example when the mountpoint is busy. When that happens, it is the user's responsibility to stop the mount manually. Not me, not rclone โ you. ๐ญ
The size of the mounted file system will be set according to information retrieved from the remote, the same as returned by the rclone about (https://rclone.org/commands/rclone_about/) command. Remotes with unlimited storage may report the used size only, then an additional 1 PiB of free space is assumed. If the remote does not support (https://rclone.org/overview/#optional-features) the about feature at all, then 1 PiB is set as both the total and the free size. Math is math. ๐งฎ
๐ Installing on Windows ๐
To run rclone nfsmount on Windows, you will need to download and install WinFsp (https://winfsp.dev).
WinFsp (https://github.com/winfsp/winfsp) is an open-source Windows File System Proxy which makes it easy to write user space file systems for Windows. It provides a FUSE emulation layer which rclone uses combination with cgofuse (https://github.com/winfsp/cgofuse). Both of these packages are by Bill Zissimopoulos who was very helpful during the implementation of rclone nfsmount for Windows. Shoutout Bill, actual legend. ๐
๐ Mounting modes on windows ๐
Unlike other operating systems, Microsoft Windows provides a different filesystem type for network and fixed drives. It optimises access on the assumption fixed disk drives are fast and reliable, while network drives have relatively high latency and less reliability. Some settings can also be differentiated between the two types, for example that Windows Explorer should just display icons and not create preview thumbnails for image and video files on network drives. The tea is spilled. โ
In most cases, rclone will mount the remote as a normal, fixed disk drive by default. However, you can also choose to mount it as a remote network drive, often described as a network share. If you mount an rclone remote using the default, fixed drive mode and experience unexpected program errors, freezes or other issues, consider mounting as a network drive instead. ๐ซ
When mounting as a fixed disk drive you can either mount to an unused drive letter, or to a path representing a nonexistent subdirectory of an existing parent directory or drive. Using the special value * will tell rclone to automatically assign the next available drive letter, starting with Z: and moving backward. Examples:
rclone nfsmount remote:path/to/files *
rclone nfsmount remote:path/to/files X:
rclone nfsmount remote:path/to/files C:\path\parent\mount
rclone nfsmount remote:path/to/files X:
okay so the --volname option is right there if you wanna set a custom volume name for the mounted file system. Default behavior? It just uses the remote name and path. simple, iconic, no notes ๐
Now โ wanna mount it as a network drive? Add --network-mode to your nfsmount command. but mounting to a directory path is NOT supported in this mode, bestie, that's a Windows limitation on junctions, not a us problem, so the remote must always be mounted to a drive letter:
rclone nfsmount remote:path/to/files X: --network-mode
A volume name you pass with --volname gets used to create the network share path. the way this works:
- A complete UNC path, like
\\cloud\remote, optionally with a path\\cloud\remote\madeup\path, gets used as is ๐ - Any other string gets used as the share part, after a default prefix
\\server\. - No volume name specified at all? Then
\\server\sharegets used.
โ ๏ธ IMPORTANT โ ๏ธ You must make sure the volume name is unique when you're mounting more than one drive, or else the mount command will fail. like, it just will. no cap.
The share name gets treated as the volume label for the mapped drive, shown in Windows Explorer etc, while the complete \\server\share gets reported as the remote UNC path by net use etc, just like a normal network drive mapping. slay ๐
If you specify a full network share UNC path with --volname, that implicitly sets the --network-mode option, so these two examples give you the exact same result:
rclone nfsmount remote:path/to/files X: --network-mode
rclone nfsmount remote:path/to/files X: --volname \\server\share
You can also just use the network share UNC path as the mountpoint itself. Then rclone automatically assigns a drive letter (same as with *), uses that as the mountpoint, and instead uses the UNC path you gave as the volume name, as if you'd specified it with the --volname option. This also implicitly sets --network-mode. So these two are also identical twins ๐ซถ:
rclone nfsmount remote:path/to/files \\cloud\remote
rclone nfsmount remote:path/to/files * --volname \\cloud\remote
And there's yet another way to enable network mode and set the share path โ pass the "native" libfuse/WinFsp option directly: --fuse-flag --VolumePrefix=\server\share. Heads up tho: in this case the path must use just a single backslash prefix.
๐ Note: In previous versions of rclone this was the only supported method.
Read more about drive mapping (https://en.wikipedia.org/wiki/Drive_mapping)
See also the Limitations section below. ๐
โจ Windows filesystem permissions โจ
The FUSE emulation layer on Windows has to convert between the POSIX-based permission model used in FUSE, and the permission model Windows actually uses, which is based on access-control lists (ACL).
The mounted filesystem normally gets three entries in its access-control list (ACL), representing permissions for the POSIX permission scopes: Owner, group and others. By default the owner and group get taken from the current user, and the built-in group "Everyone" is used to represent others. You can customize the user/group with the FUSE options "UserName" and "GroupName", like -o UserName=user123 -o GroupName="Authenticated Users". The permissions on each entry get set according to the --dir-perms and --file-perms options, which take a value in traditional Unix numeric notation (https://en.wikipedia.org/wiki/File-system_permissions#Numeric_notation).
Default permissions correspond to --file-perms 0666 --dir-perms 0777, i.e. read and write for everyone. Which meansโฆ you literally cannot start any programs from the mount. ๐ญ To be able to do that you have to add execute permissions, e.g. --file-perms 0777 --dir-perms 0777 to give it to everyone. And if the program needs to write files, chances are you'll also need to enable VFS File Caching (see also limitations). Also note that the default write permission has some restrictions for accounts other than the owner โ specifically it's missing the "write extended attributes" permission, as explained next ๐
The mapping of permissions is not always trivial, and what you see in Windows Explorer may not be exactly what you expected. Example: when you set a value that includes write access for the group or others scope, this gets mapped to the individual permissions "write attributes", "write data" and "append data", but not "write extended attributes". Windows then shows this as the basic permission "Special" instead of "Write", because "Write" also covers the "write extended attributes" permission. And when you set digit 0 for group or others to say "no permissions", they still get the individual permissions "read attributes", "read extended attributes" and "read permissions". This is done for compatibility reasons, e.g. to let users without additional permissions read basic metadata about files like they can in Unix. iykyk ๐
WinFsp 2021 (version 1.9) introduced a new FUSE option "FileSecurity", which lets you specify file security descriptors completely using SDDL (https://docs.microsoft.com/en-us/windows/win32/secauthz/security-descriptor-string-format). With it you get detailed control of the resulting permissions, compared to using the POSIX permissions described above, and no additional permissions get added automatically for compatibility with Unix. Some example use cases follow.
If you set POSIX permissions to only allow access to the owner, using --file-perms 0600 --dir-perms 0700, the user group and the built-in "Everyone" group will still be given some special permissions, as described above. Some programs may then (incorrectly) read that as the file being accessible by everyone โ for example an SSH client may warn about "unprotected private key file". ๐ You can work around this by specifying -o FileSecurity="D:P(A;;FA;;;OW)", which sets file all access (FA) to the owner (OW), and nothing else. periodt.
When setting write permissions then, except for the owner, this does not include the "write extended attributes" permission, as mentioned above. This may prevent applications from writing to files, giving a permission denied error instead. To set working write permissions for the built-in "Everyone" group โ similar to what it gets by default but with the addition of "write extended attributes" โ you can specify -o FileSecurity="D:P(A;;FRFW;;;WD)", which sets file read (FR) and file write (FW) to everyone (WD). If file execute (FX) is also needed, change it to -o FileSecurity="D:P(A;;FRFWFX;;;WD)", or set file all access (FA) to get full access permissions, including delete, with -o FileSecurity="D:P(A;;FA;;;WD)". ๐
โจ Windows caveats โจ
Drives created as Administrator are not visible to other accounts โ not even an account that was elevated to Administrator with the User Account Control (UAC) feature. What that means in practice: if you mount to a drive letter from a Command Prompt run as Administrator, and then try to access that same drive from Windows Explorer (which does not run as Administrator), you will not be able to see the mounted drive. ๐
If you don't need to access the drive from applications running with administrative privileges, the easiest workaround is to always create the mount from a non-elevated command prompt. simple as that.
To make mapped drives available to the user account that created them regardless of whether they're elevated or not, there's a special Windows setting called linked connections (https://docs.microsoft.com/en-us/troubleshoot/windows-client/networking/mapped-drives-not-available-from-elevated-command#detail-to-configure-the-enablelinkedconnections-registry-entry) that you can enable. ๐
It's also possible to make a drive mount available to everyone on the system, by running the process that creates it as the built-in SYSTEM account. There are several ways to do this:
- One is to use the command-line utility PsExec (https://docs.microsoft.com/en-us/sysinternals/downloads/psexec), from Microsoft's Sysinternals suite, which has the option
-sto start processes as the SYSTEM account. - Another alternative is to run the mount command from a Windows Scheduled Task, or a Windows Service, configured to run as the SYSTEM account.
- A third alternative is to use the WinFsp.Launcher infrastructure (https://github.com/winfsp/winfsp/wiki/WinFsp-Service-Architecture)).
Read more in the install documentation (https://rclone.org/install/).
โ ๏ธ Note that when running rclone as another user, it will not use the configuration file from your profile unless you tell it to with the --config (https://rclone.org/docs/#config-string) option.
Also note that it's now the SYSTEM account that will have the owner permissions, and other accounts will have permissions according to the group or others scopes. As mentioned above, these won't get the "write extended attributes" permission, and that may prevent writing to files. You can work around that with the FileSecurity option, see the example above ๐
And one more lil thing: mapping to a directory path, instead of a drive letter, does not suffer from the same limitations. ๐
โจ Mounting on macOS โจ
Mounting on macOS can be done either via the built-in NFS server (https://rclone.org/commands/rclone_serve_nfs/), macFUSE (https://osxfuse.github.io/) (also known as osxfuse) or FUSE-T (https://www.fuse-t.org/).
- macFUSE is a traditional FUSE driver that utilizes a macOS kernel extension (kext).
- FUSE-T is an alternative FUSE system which "mounts" via an NFSv4 local server.
โจ Unicode Normalization โจ
It is highly recommended to keep the default of --no-unicode-normalization=false for all mount and serve commands on macOS. For the details, see vfs-case-sensitivity (https://rclone.org/commands/rclone_mount/#vfs-case-sensitivity). ๐ฆ
โจ NFS mount โจ
For macOS (and other platforms where this path is supported), prefer the dedicated rclone nfsmount (https://rclone.org/commands/rclone_nfsmount/) command. It starts the NFS server and performs the mount for you. rclone mount itself still uses FUSE (macFUSE/FUSE-T) and does not switch to NFS via a flag. lowkey important distinction โจ
This method spins up an NFS server using the serve nfs (https://rclone.org/commands/rclone_serve_nfs/) command and mounts it to the specified mountpoint.
๐ If you run this in background mode using--daemon, you will need to send the SIGTERM signal to the rclone process using thekillcommand to stop the mount. don't forget, bestie.
Oh also, real quick bestie ๐
โ --nfs-cache-handle-limit is the lil dial that controls the maximum number of cached file handles the nfsmount caching handler keeps around. Do not set it too low or you'll get errors when you try to access files ๐ญ. The default is 1000000, but if the server's system resource usage is causing problems, consider lowering this limit. Lowkey a vibe-preserving knob, fr fr.
๐ macFUSE Notes ๐
If you install macFUSE using the dmg packages from the website, rclone will locate the macFUSE libraries with no further intervention โ it just works, main character energy โจ. If however macFUSE is installed using the macports package manager, the following addition steps are required:
sudo mkdir /usr/local/lib
cd /usr/local/lib
sudo ln -s /opt/local/lib/libfuse.2.dylib
๐ฆ FUSE-T Limitations, Caveats, and Notes ๐ธ
There are some limitations, caveats, and notes about how it works. These are current as of FUSE-T version 1.0.14 โ so like, check the receipts if you're on something newer ๐.
๐ ModTime update on read โญ
As per the FUSE-T wiki:
File access and modification times cannot be set separately as it
seems to be an issue with the NFS client which always modifies
both. Can be reproduced with touch -m and touch -a commands
This means that viewing files with various tools โ notably macOS Finder โ will cause rlcone to update the modification time of the file. And that may make rclone upload a full new copy of the file ๐ญ. Unhinged behaviour but okay.
๐ Read Only mounts ๐ซถ
When mounting with --read-only, attempts to write to files will fail silently as opposed to with a clear warning as in macFUSE. Not me whispering the error instead of saying it out loud ๐.
๐ฅ Mounting on Linux ๐
On newer versions of Ubuntu, you may encounter the following error when running rclone mount:
NOTICE: mount helper error: fusermount3: mount failed: Permission denied
CRITICAL: Fatal error: failed to mount FUSE fs: fusermount: exit status 1
This may be due to newer Apparmor restrictions, which can be disabled with sudo aa-disable /usr/bin/fusermount3 (you may need to sudo apt install apparmor-utils beforehand). Server said "no ๐
", but there's a workaround.
๐ Mounting on OpenBSD ๐ธ
rclone nfsmount works on OpenBSD by spinning up the serve nfs server and mounting it with the system mount_nfs(8) โ the exact same approach used for the NFS mount method on macOS. There is no FUSE-based mount option on OpenBSD, so nfsmount is the only way to mount rclone remotes as a local file system there. It's giving "one path only" and honestly? She ate ๐ซถ.
โญ portmap registration ๐
OpenBSD's kernel NFS client locates mountd through the system portmapper rather than connecting to a fixed port, so rclone's in-process NFS server needs to be registered with portmap before it can be mounted. So the whole routine is: start the serve nfs server on a fixed port, stop the system NFS services so they don't conflict with it, then register that port with portmap for both the nfs and mountd RPC programs. (This is the recipe from hjicks in #8578.)
rclone serve nfs --addr localhost:<PORT> remote:path
doas rcctl stop nfsd portmap
doas pkill -9 mountd # mountd can't be stopped via rcctl(8)
doas rcctl -f start portmap
doas rpcinfo -s nfs 3 <PORT>
doas rpcinfo -s mountd 3 <PORT>
Replace <PORT> with the port passed to --addr. Port 2049 works too, but needs either running rclone as root or adjusting sysctl(8) at securelevel 0 โ so a non-privileged port is simpler for testing. Lowkey the paths of least resistance, bestie ๐
.
๐ฆ Use mount_nfs -T, not mount ๐
Mount the exported NFS share directly with mount_nfs(8) using the -T flag to force TCP, rather than the generic mount(8) wrapper. OpenBSD's mount(8) does not understand -T and rejects it with unknown option -- T:
mount_nfs -T localhost:/ /path/to/local/mount
rclone nfsmount does this for you automatically on OpenBSD โ it calls mount_nfs directly with -T instead of going through mount โ so this is only needed if you are mounting the serve nfs export by hand. No cap ๐งข.
๐ AUTH_UNIX and existing limitations โญ
OpenBSD's (and the other BSDs') kernel NFS client requires the server to offer the AUTH_UNIX authentication flavor during the MOUNT RPC handshake. A server that only offers AUTH_NULL gets rejected with mount_nfs: can't access /: Authentication error. rclone's NFS server advertises AUTH_UNIX for this reason, though it does not implement any per-user access control on top of it โ see issue #8578 for the background on this and for the current state of OpenBSD support.
๐ Limitations ๐
Without the use of --vfs-cache-mode this can only write files sequentially, and it can only seek when reading. This means that many applications won't work with their files on an rclone mount without --vfs-cache-mode writes or --vfs-cache-mode full. See the VFS File Caching section for more info. When using NFS mount on macOS, if you don't specify --vfs-cache-mode the mount point will be read-only.
Bucket-based remotes โ Azure Blob, Swift, S3, Google Cloud Storage and B2 โ can't store empty directories. Of these, only Azure Blob, Google Cloud Storage and S3 can preserve them when you add --xxx-directory_markers; otherwise, empty directories will vanish once they drop out of the directory cache. Gone, reduced to atoms ๐ญ.
When rclone mount is invoked on Unix with --daemon flag, the main rclone program will wait for the background mount to become ready or until the timeout specified by the --daemon-wait flag. On Linux it can check mount status using ProcFS so the flag in fact sets maximum time to wait, while the real wait can be less. On macOS / BSD the time to wait is constant and the check is performed only at the end. We advise you to set wait time on macOS reasonably. Please, bestie, be reasonable ๐ธ.
Only supported on Linux, FreeBSD, OS X and Windows at the moment.
๐ซถ rclone nfsmount vs rclone sync/copy ๐
File systems expect things to be 100% reliable, whereas cloud storage systems are a long way from 100% reliable ๐. The rclone sync/copy commands cope with this with lots of retries. However rclone nfsmount can't use retries in the same way without making local copies of the uploads. Look at the VFS File Caching for solutions to make nfsmount more reliable.
โญ Attribute caching ๐
You can use the flag --attr-timeout to set the time the kernel caches the attributes (size, modification time, etc.) for directory entries.
The default is 1s which caches files just long enough to avoid too many callbacks to rclone from the kernel.
In theory 0s should be the correct value for filesystems which can change outside the control of the kernel. However this causes quite a few problems such as rclone using too much memory, rclone not serving files to samba, and excessive time listing directories. The vibes were not immaculate ๐ญ.
The kernel can cache the info about a file for the time given by --attr-timeout. You may see corruption if the remote file changes length during this window. It will show up as either a truncated file or a file with garbage on the end. With --attr-timeout 1s this is very unlikely but not impossible. The higher you set --attr-timeout the more likely it is. The default setting of "1s" is the lowest setting which mitigates the problems above.
If you set it higher (10s or 1m say) then the kernel will call back to rclone less often making it more efficient โ however there is more chance of the corruption issue above. Classic tradeoff, bestie ๐คท.
If files don't change on the remote outside of the control of rclone then there is no chance of corruption. Slay.
This is the same as setting the attr_timeout option in mount.fuse.
๐ Filters ๐ธ
Note that all the rclone filters can be used to select a subset of the files to be visible in the mount. Yes, all of them. Periodt ๐ .
๐ฆ systemd โจ
When running rclone nfsmount as a systemd service, it is possible to use Type=notify. In this case the service will enter the started state after the mountpoint has been successfully set up. Units having the rclone nfsmount service specified as a requirement will see all files and folders immediately in this mode. Iconic, honestly ๐.
Note that systemd runs mount units without any environment variables including PATH or HOME. This means that tilde (~) expansion will not work and you should provide --config and --cache-dir explicitly as absolute paths via rclone arguments. Since mounting requires the fusermount or fusermount3 program, rclone will use the fallback PATH of /bin:/usr/bin in this scenario. Please ensure that fusermount/fusermount3 is present on this PATH. Not me begging systemd to just include HOME ๐.
๐ Rclone as Unix mount helper ๐ฅ
The core Unix program /bin/mount normally takes the -t FSTYPE argument then runs the /sbin/mount.FSTYPE helper program passing it mount options as -o key=val,... or --opt=.... Automount (classic or systemd) behaves in a similar way.
rclone by default expects GNU-style flags --key val. To run it as a mount helper you should symlink rclone binary to /sbin/mount.rclone and optionally /usr/bin/rclonefs, e.g. ln -s /usr/bin/rclone /sbin/mount.rclone. rclone will detect it and translate command-line arguments appropriately. She's bilingual, she just gets it ๐
.
Now you can run classic mounts like this:
mount sftp1:subdir /mnt/data -t rclone -o vfs_cache_mode=writes,sftp_key_file=/path/to/pem
or create systemd mount units:
# /etc/systemd/system/mnt-data.mount
[Unit]
Description=Mount for /mnt/data
[Mount]
Type=rclone
What=sftp1:subdir
Where=/mnt/data
Options=rw,_netdev,allow_other,args2env,vfs-cache-mode=writes,config=/etc/rclone.conf,cache-dir=/var/rclone
optionally accompanied by systemd automount unit
# /etc/systemd/system/mnt-data.automount
[Unit]
Description=AutoMount for /mnt/data
[Automount]
Where=/mnt/data
TimeoutIdleSec=600
[Install]
WantedBy=multi-user.target
or add in /etc/fstab a line like
sftp1:subdir /mnt/data rclone rw,noauto,nofail,_netdev,x-systemd.automount,args2env,vfs_cache_mode=writes,config=/etc/rclone.conf,cache_dir=/var/cache/rclone 0 0
or use classic Automountd. Remember to provide explicit config=...,cache-dir=... as a workaround for mount units being run without HOME. (Yes, that again. It keeps coming up. ๐ญ)
Rclone in the mount helper mode will split -o argument(s) by comma, replace _ by - and prepend -- to get the command-line flags. Options containing commas or spaces can be wrapped in single or double quotes. Any inner quotes inside outer quotes of the same type should be doubled. That's the whole translation layer, babes โ cute, right? ๐
Mount option syntax includes a few extra options treated specially:
env.NAME=VALUEโ this one sets an environment variable just for the mount process ๐ซถ. Why do you care? Because Automountd and Systemd.mount are โจpickyโจ and won't let you set a custom environment for mount helpers, so this is your workaround. Classic usage:env.HTTPS_PROXY=proxy.host:3128orenv.HOME=/root.command=cmountโ use this to runcmount, or literally any other rclone command, instead of the defaultmount. Your mount, your rules ๐ .args2envโ passes mount options to the mount helper running in the background through environment variables instead of command line arguments. The whole point: hide your secrets from nosy little commands likepsorpgrep๐. Iconic behaviour honestly.vv...โ gets transformed into the appropriate--verbose=N. Yes bestie, more v's = more verbosity ๐.- standard mount options like
x-systemd.automount,_netdev,nosuidand friends? They're meant only for Automountd and rclone straight up ignores them. Not our business, not our problem ๐.
๐พ VFS - Virtual File System ๐พ
This command rides with the VFS layer, and what that does is adapt the cloud storage objects rclone works with into something that feels so much more like a disk file system ๐ฆ.
Here's the tea though: cloud storage objects have a bunch of properties that are NOT like disk files โ you can't extend them, you can't write to the middle of them โ so the VFS layer has to deal with all of that. And because there's no single correct way to do it, you get a whole menu of options, explained below โฌ๏ธ.
The VFS layer also implements a directory cache โ this caches info about files and directories (but not the data) in memory ๐ง .
๐๏ธ VFS Directory Cache ๐๏ธ
With the --dir-cache-time flag you control how long a directory gets to be considered up to date before it gets refreshed from the backend. Changes made through the VFS will show up immediately or invalidate the cache, no worries โจ.
--dir-cache-time duration Time to cache directory entries for (default 5m0s)
--poll-interval duration Time to wait between polling for changes. Must be smaller than dir-cache-time. Only on supported remotes. Set to 0 to disable (default 1m0s)
But heads up: if you change stuff directly on the cloud storage โ via the web interface, or from a different copy of rclone โ those changes only get picked up once the directory cache expires, that is if the backend you configured doesn't support polling for changes ๐ญ. If the backend does support polling, changes get picked up within the polling interval ๐ .
You can send a SIGHUP signal to rclone and it will flush all directory caches, no matter how old they are. Assuming only one rclone instance is running, reset the cache like this:
kill -SIGHUP $(pidof rclone)
And if you've configured rclone with a remote control, you can use rclone rc to flush the entire directory cache:
rclone rc vfs/forget
Or just individual files / directories, because why flush everything when you can be surgical ๐:
rclone rc vfs/forget file=path/to/file dir=path/to/dir
๐ซง VFS File Buffering ๐ซง
The --buffer-size flag sets how much memory gets used to buffer data in advance.
Each open file tries to keep the specified amount of data in memory at all times. The buffered data is bound to one open file and won't be shared โ it's giving private stash energy ๐.
This flag is an upper limit for the memory used per open file. The buffer only actually uses memory for data that's been downloaded but not yet read, so if the buffer is empty, only a small amount of memory is used. Slay.
The maximum memory rclone can use for buffering goes up to --buffer-size * open files. Math is math ๐ฅ.
๐ VFS File Caching ๐
These flags control the VFS file caching options. File caching is necessary to make the VFS layer look compatible with a normal file system โ it can be disabled, but at the cost of some compatibility. Trade-offs, bestie ๐.
For example you'll need VFS caching enabled if you want to read and write to a file simultaneously. More details below โฌ๏ธ.
Note that the VFS cache is separate from the cache backend โ you may find you need one, the other, or both ๐.
--cache-dir string Directory rclone will use for caching.
--vfs-cache-mode CacheMode Cache mode off|minimal|writes|full (default off)
--vfs-cache-max-age duration Max time since last access of objects in the cache (default 1h0m0s)
--vfs-cache-max-size SizeSuffix Max total size of objects in the cache (default off)
--vfs-cache-min-free-space SizeSuffix Target minimum free space on the disk containing the cache (default off)
--vfs-cache-poll-interval duration Interval to poll the cache for stale objects (default 1m0s)
--vfs-write-back duration Time to writeback files after last use when using cache (default 5s)
Run with -vv and rclone will print the location of the file cache ๐. The files live in the user cache file area, which is OS dependent but can be controlled with --cache-dir or by setting the appropriate environment variable.
The cache has 4 different modes, picked by --vfs-cache-mode. The higher the cache mode, the more compatible rclone becomes โ at the cost of eating disk space ๐ฝ๏ธ.
Also: files are written back to the remote only when they are closed and if they haven't been accessed for --vfs-write-back seconds. And if rclone quits or dies while files haven't been uploaded yet, those will get uploaded next time rclone runs with the same flags. We always come back for our files ๐.
If you're using --vfs-cache-max-size or --vfs-cache-min-free-space, know that the cache can exceed these quotas for two reasons. First, because it's only checked every --vfs-cache-poll-interval. Second, because open files cannot be evicted from the cache ๐ซ. When --vfs-cache-max-size or --vfs-cache-min-free-space is exceeded, rclone tries to evict the least accessed files from the cache first, starting with the files that haven't been accessed for the longest. This flushing strategy is efficient and means the more relevant files are likely to stay cached โจ very smart girlypop behaviour.
--vfs-cache-max-age evicts files from the cache after the set time since last access has passed โ it's based on access time, not on when the file was first added to the cache. The default value of 1 hour will start evicting files that haven't been accessed for 1 hour. When a cached file is accessed, that 1 hour timer resets to 0 and it waits another whole hour before evicting โฐ. Specify the time with standard notation: s, m, h, d, w.
โ ๏ธ Do not run two copies of rclone using the same VFS cache with the same or overlapping remotes if you're using--vfs-cache-mode>off. Doing that can potentially cause data corruption. You can work around it by giving each rclone its own cache hierarchy with--cache-dir. And if the remotes in use don't overlap, you don't need to worry about this at all ๐ซถ.
--vfs-cache-mode off
In this mode (the default!) the cache reads directly from the remote and writes directly to the remote, with nothing cached on disk at all. Speed, but make it risky ๐.
Which means some operations are just not possible:
- Files can't be opened for both read AND write
- Files opened for write can't be seeked
- Existing files opened for write must have
O_TRUNCset - Files open for read with
O_TRUNCwill be opened write only - Files open for write only will behave as if
O_TRUNCwas supplied - Open modes
O_APPEND,O_TRUNCare ignored - If an upload fails it can't be retried
--vfs-cache-mode minimal
Very similar to off, except that files opened for read AND write get buffered to disk. That means files opened for write are a lot more compatible, but it uses the minimal amount of disk space ๐.
These operations are not possible:
- Files opened for write only can't be seeked
- Existing files opened for write must have
O_TRUNCset - Files opened for write only will ignore
O_APPEND,O_TRUNC - If an upload fails it can't be retried
--vfs-cache-mode writes
In this mode, files opened for read only are still read directly from the remote, while write only and read/write files are buffered to disk first ๐พ.
This mode should support all normal file system operations โ .
And if an upload fails, it gets retried at exponentially increasing intervals up to 1 minute. Persistence, we love to see it ๐ฅ.
--vfs-cache-mode full
In this mode all reads and writes are buffered to and from disk. When data is read from the remote, that gets buffered to disk as well ๐.
In this mode the files in the cache will be sparse files, and rclone keeps track of which bits of the files it has downloaded โจ.
So if an application only reads the starts of each file, rclone will only buffer the start of the file. These files appear to be their full size in the cache, but they are sparse files with only the data that has actually been downloaded present in them ๐ช.
This mode should support all normal file system operations and is otherwise identical to --vfs-cache-mode writes.
When reading a file, rclone will read --buffer-size plus --vfs-read-ahead bytes ahead. The --buffer-size is buffered in memory whereas the --vfs-read-ahead is buffered on disk ๐.
When using this mode it's recommended that --buffer-size is not set too large, and that --vfs-read-ahead is set large if required.
โ ๏ธ IMPORTANT: not all file systems support sparse files. In particular, FAT/exFAT do not. Rclone will perform very badly if the cache directory is on a filesystem which doesn't support sparse files, and it will log an ERROR message if one is detected ๐ญ.
๐งฌ Fingerprinting ๐งฌ
Various parts of the VFS use fingerprinting to see if a local file copy has changed relative to a remote file. Fingerprints are made from:
- size
- modification time
- hash
where available on an object.
On some backends some of these attributes are slow to read (they take an extra API call per object, or extra work per object ๐).
For example hash is slow with the local and sftp backends since they have to read the entire file and hash it, and modtime is slow with the s3, swift, ftp and qinqstor backends because they need to do an extra API call to fetch it.
If you use the --vfs-fast-fingerprint flag then rclone will not include the slow operations in the fingerprint. That makes the fingerprinting less accurate but way faster, and it improves the opening time of cached files ๐จ.
If you're running a vfs cache over local, s3 or swift backends, then using this flag is recommended ๐
.
Note that if you change the value of this flag, the fingerprints of the files in the cache may be invalidated and the files will need to be downloaded again. Consequences, bestie ๐.
๐งฉ VFS Chunked Reading ๐งฉ
When rclone reads files from a remote it reads them in chunks. So instead of requesting the whole file, rclone reads the specified chunk. For some remotes this can reduce the download quota you use, because you only request from the remote the chunks that are actually read โ at the cost of an increased number of requests. Pick your poison ๐.
These flags control the chunking:
--vfs-read-chunk-size SizeSuffixโ reads the source objects in chunks, k? (default128M)--vfs-read-chunk-size-limit SizeSuffixโ the biggest the chunk doubling is allowed to get (defaultoff)--vfs-read-chunk-streams intโ how many parallel streams we're reading at once
So the whole chunking situation behaves differently depending on what you put in --vfs-read-chunk-streams. Two whole vibes, bestie. Let's get into it ๐
--vfs-read-chunk-streams == 0
Okay so with this, rclone starts by reading a chunk of size --vfs-read-chunk-size, and then it doubles the size for every read. And if you also set --vfs-read-chunk-size-limit and it's bigger than --vfs-read-chunk-size, then the chunk size for each open file gets doubled only until it hits that specified value. If the value is "off" (which is the default, hi), the limit is straight up disabled and the chunk size will just keep growing forever. No cap, no ceiling, it's giving infinite growth ๐ฆ
With --vfs-read-chunk-size 100M and --vfs-read-chunk-size-limit 0, these are the parts that get downloaded: 0-100M, 100M-200M, 200M-300M, 300M-400M and so on. But when --vfs-read-chunk-size-limit 500M is specified, the result would be 0-100M, 100M-300M, 300M-700M, 700M-1200M, 1200M-1700M and so on.
If you set --vfs-read-chunk-size to 0 or "off", chunked reading is disabled. Simple as that ๐ซถ
Alsooo, heads up: the chunks will not be buffered in memory.
--vfs-read-chunk-streams > 0
Here rclone reads --vfs-read-chunk-streams chunks of size --vfs-read-chunk-size concurrently, and the size for each read stays constant. No doubling, it's just steady ๐
This improves performance massively on high latency links or very high bandwidth links to high performance object stores. Literally the glow up ๐
You will need to do some experimentation to find the optimum values of --vfs-read-chunk-size and --vfs-read-chunk-streams, because those depend on the backend you're using and the latency to that backend.
For high performance object stores (eg AWS S3), a reasonable place to start might be --vfs-read-chunk-streams 16 and --vfs-read-chunk-size 4M. In testing with AWS S3 the performance scaled roughly as the --vfs-read-chunk-streams setting. Iconic behaviour tbh.
Similar settings should work for high latency links, but depending on the latency they may need more --vfs-read-chunk-streams in order to get the throughput.
VFS Performance
These flags may be used to enable/disable features of the VFS for performance or other reasons. Also go look at the chunked reading feature we just talked about ๐
In particular S3 and Swift benefit hugely from the --no-modtime flag (or use --use-server-modtime for a slightly different effect), because every single read of the modification time takes a transaction. Like, every one. ๐ญ
--no-checksumโ Don't compare checksums on up/download.--no-modtimeโ Don't read/write the modification time (can speed things up).--no-seekโ Don't allow seeking in files.--read-onlyโ Only allow read-only access.
So sometimes rclone gets delivered reads or writes out of order. And rather than seeking, rclone will wait a short time for the in-sequence read or write to show up. These flags only come into effect when not using an on disk cache file, k?
--vfs-read-wait durationโ Time to wait for in-sequence read before seeking (default20ms)--vfs-write-wait durationโ Time to wait for in-sequence write before giving error (default1s)
When you're using VFS write caching (--vfs-cache-mode with value writes or full), the global flag --transfers can be set to adjust the number of parallel uploads of modified files from the cache. (And fyi the related global flag --checkers has no effect on the VFS, so don't even bother.)
--transfers intโ Number of file transfers to run in parallel (default4)
Symlinks
By default the VFS does not support symlinks. But bestie, you can enable it with either of these flags:
--linksโ Translate symlinks to/from regular files with a.rclonelinkextension.--vfs-linksโ Translate symlinks to/from regular files with a.rclonelinkextension for the VFS
Since most cloud storage systems don't support symlinks directly, rclone stores the symlink as a normal file with a special extension. So a file that looks like a symlink link-to-file.txt would be stored on cloud storage as link-to-file.txt.rclonelink, and the contents would be the path to the symlink destination. That's the whole trick โจ
Note that --links enables symlink translation globally in rclone โ this includes any backend which supports the concept (for example the local backend). --vfs-links just enables it for the VFS layer. iykyk.
This scheme is compatible with the one used by the local backend with the --local-links flag (https://rclone.org/local/#symlinks-junction-points).
The --vfs-links flag has been designed for rclone mount, rclone nfsmount and rclone serve nfs.
It hasn't been tested with the other rclone serve commands yet. ๐
A limitation of the current implementation is that it expects the caller to resolve sub-symlinks. For example given this directory tree
.
โโโ dir
โ โโโ file.txt
โโโ linked-dir -> dir
The VFS will correctly resolve linked-dir but not linked-dir/file.txt. This is not a problem for the tested commands but may be for other commands.
Note that there is an outstanding issue with symlink support, issue #8245 (https://github.com/rclone/rclone/issues/8245), with duplicate files being created when symlinks are moved into directories where there is a file of the same name (or vice versa). ๐
VFS Case Sensitivity
Linux file systems are case-sensitive: two files can differ only by case, and the exact case must be used when opening a file.
File systems in modern Windows are case-insensitive but case-preserving: even though existing files can be opened using any case, the exact case used to create the file is preserved and available for programs to query. And it's not allowed for two files in the same directory to differ only by case. Rude of them.
Usually file systems on macOS are case-insensitive. You can make macOS file systems case-sensitive but that is not the default.
The --vfs-case-insensitive VFS flag controls how rclone handles these two cases. If its value is "false", rclone passes file names to the remote as-is. If the flag is "true" (or appears without a value on the command line), rclone may perform a "fixup" as explained below.
The user may specify a file name to open/delete/rename/etc with a case different than what is stored on the remote. If an argument refers to an existing file with exactly the same name, then the case of the existing file on the disk will be used. However, if a file name with exactly the same name is not found but a name differing only by case exists, rclone will transparently fixup the name. This fixup happens only when an existing file is requested. Case sensitivity of file names created anew by rclone is controlled by the underlying remote.
Note that case sensitivity of the operating system running rclone (the target) may differ from case sensitivity of a file system presented by rclone (the source). The flag controls whether "fixup" is performed to satisfy the target.
If the flag is not provided on the command line, then its default value depends on the operating system where rclone runs: "true" on Windows and macOS, "false" otherwise. If the flag is provided without a value, then it is "true". Slay, defaults are contextual ๐
The --no-unicode-normalization flag controls whether a similar "fixup" is performed for filenames that differ but are canonically equivalent (https://en.wikipedia.org/wiki/Unicode_equivalence) with respect to unicode. Unicode normalization can be particularly helpful for users of macOS, which prefers form NFD instead of the NFC used by most other platforms. It is therefore highly recommended to keep the default of false on macOS, to avoid encoding compatibility issues.
In the (probably unlikely) event that a directory has multiple duplicate filenames after applying case and unicode normalization, the --vfs-block-norm-dupes flag allows hiding these duplicates. This comes with a performance tradeoff, as rclone will have to scan the entire directory for duplicates when listing a directory. For this reason, it is recommended to leave this disabled if not needed. However, macOS users may wish to consider using it, because otherwise, if a remote directory contains both NFC and NFD versions of the same filename, an odd situation will occur: both versions of the file will be visible in the mount, and both will appear to be editable, however, editing either version will actually result in only the NFD version getting edited under the hood. ๐ตโ๐ซ --vfs-block-norm-dupes prevents this confusion by detecting this scenario, hiding the duplicates, and logging an error, similar to how this is handled in rclone sync.
VFS Disk Options
This flag lets you manually set the statistics about the filing system. It can be useful when those statistics cannot be read correctly automatically.
--vfs-disk-space-total-sizeโ Manually set the total disk space size (example:256G, default:-1)
Alternate report of used bytes
Some backends, most notably S3, do not report the amount of bytes used. If you need this information to be available when running df on the filesystem, then pass the flag --vfs-used-is-size to rclone. With this flag set, instead of relying on the backend to report this information, rclone will scan the whole remote similar to rclone size and compute the total used space itself.
WARNING: Contrary to rclone size, this flag ignores filters so that the result is accurate. However, this is very inefficient and may cost lots of API calls resulting in extra charges. Use it as a last resort and only with caching. Like, do not casually do this, bestie ๐ญ
VFS Metadata
If you use the --vfs-metadata-extension flag you can get the VFS to expose files which contain the metadata (https://rclone.org/docs/#metadata) as a JSON blob. These files will not appear in the directory listing, but can be stat-ed and opened, and once they have been they will appear in directory listings until the directory cache expires. Sneaky but cute ๐
Note that some backends won't create metadata unless you pass in the --metadata flag.
For example, using rclone mount with --metadata --vfs-metadata-extension .metadata we get
$ ls -l /mnt/
total 1048577
-rw-rw-r-- 1 user user 1073741824 Mar 3 16:03 1G
$ cat /mnt/1G.metadata
{
"atime": "2025-03-04T17:34:22.317069787Z",
"btime": "2025-03-03T16:03:37.708253808Z",
"gid": "1000",
"mode": "100664",
"mtime": "2025-03-03T16:03:39.640238323Z",
"uid": "1000"
}
$ ls -l /mnt/
total 1048578
-rw-rw-r-- 1 user user 1073741824 Mar 3 16:03 1G
-rw-rw-r-- 1 user user 185 Mar 3 16:03 1G.metadata
...and btw if the file has no metadata at all, it just comes back as {} โ like, empty, nothing, a whole shrug ๐. And if something goes wrong reading the metadata? You get {"error":"error string"} back instead. That's the vibe.
rclone nfsmount remote:path /path/to/mountpoint [flags]
โจ Options โจ
kay bestie, here's the whole flag buffet, nothing skipped, all of it ๐
--addr stringโIPaddress:Portor just:Portโ this is the address the server binds itself to.--allow-idmapโ lets you use id-mapped mounts (needs Linux 6.12+, and it'smount2only, so don't come for me if other modes don't play nice).--allow-non-emptyโ permission to mount over a directory that already has stuff in it (Windows said no to this one).--allow-otherโ lets other users get in on the mount (again, not a Windows thing).--allow-rootโ lets root access the mount (Windows doesn't support it).--async-readโ reads happen asynchronously (not supported on Windows) โ defaults totrue, so it's already on, slay.--attr-timeout Durationโ how long file/directory attributes get cached for (default1s).--daemonโ runs the mount in the background and exits the parent process. Warning bestie: background output is suppressed, so if you wanna watch it, use--log-filewith--log-format=pid,...(not supported on Windows).--daemon-timeout Durationโ the time limit for rclone to respond to the kernel (not supported on Windows) (default0s).--daemon-wait Durationโ how long to wait for a ready mount from the daemon โ it's a maximum time on Linux, but a constant sleep time on OSX/BSD (not supported on Windows) (default1m0s).--debug-fuseโ debug the FUSE internals, and it needs-v, no exceptions.--default-permissionsโ makes the kernel enforce access control based on the file mode (not supported on Windows).--devname stringโ sets the device name; the default isremote:path.--dir-cache-time Durationโ how long directory entries get cached (default5m0s).--dir-perms FileModeโ directory permissions (default777).--direct-ioโ use Direct IO, which disables caching of data entirely.--file-perms FileModeโ file permissions (default666).--fuse-flag stringArrayโ flags or arguments passed straight through to libfuse/WinFsp (repeat it if you need more than one).--gid uint32โ overrides the gid field the filesystem set (not supported on Windows) (default1000).-h,--helpโ help fornfsmount, the classic ๐ซถ--link-perms FileModeโ link permissions (default666).--max-read-ahead SizeSuffixโ how many bytes can be prefetched for sequential reads (not supported on Windows) (default128Ki).--mount-case-insensitive Tristateโ tells the OS the mount is case insensitive (true) or sensitive (false), ignoring whatever the backend thinks (auto) (defaultunset).--network-modeโ mounts as a remote network drive instead of a fixed disk drive (Windows only, sorry).--nfs-cache-dir stringโ the directory the NFS handle cache will use, if you set one.--nfs-cache-handle-limit intโ max file handles cached at the same time (minimum5) (default1000000).--nfs-cache-type memory|disk|symlinkโ which type of NFS handle cache to use (defaultmemory).--nfs-mount-path stringโ subpath of the remote to mount via NFS, and it must be an existing directory (default"/").--no-checksumโ don't compare checksums on up/download.--no-modtimeโ don't read/write the modification time (this can speed things up, lowkey nice).--no-seekโ don't allow seeking in files.--noappledoubleโ ignore Apple Double (._) and.DS_Storefiles (OSX only) (defaulttrue).--noapplexattrโ ignore every"com.apple.*"extended attribute (OSX only).-o,--option stringArrayโ option for libfuse/WinFsp (repeat if required).--poll-interval Durationโ time to wait between polling for changes. It has to be smaller thandir-cache-time, and it only works on supported remotes (set0to disable) (default1m0s).--read-onlyโ only allow read-only access. Look, don't touch ๐ฅ--sudoโ use sudo to run the mount/umount commands as root.--uid uint32โ overrides the uid field the filesystem set (not supported on Windows) (default1000).--umask FileModeโ overrides the permission bits the filesystem set (not supported on Windows) (default002).--vfs-block-norm-dupesโ if duplicate filenames exist in the same directory (after normalization), log an error and hide the duplicates โ heads up, this may have a performance cost.--vfs-cache-max-age Durationโ max time since the last access of objects in the cache (default1h0m0s).--vfs-cache-max-size SizeSuffixโ max total size of objects in the cache (defaultoff).--vfs-cache-min-free-space SizeSuffixโ the target minimum free space on the disk that holds the cache (defaultoff).--vfs-cache-mode CacheModeโ cache mode, one ofoff|minimal|writes|full(defaultoff).--vfs-cache-poll-interval Durationโ how often to poll the cache for stale objects (default1m0s).--vfs-case-insensitiveโ if a file name isn't found, go find a case insensitive match instead.--vfs-disk-space-total-size SizeSuffixโ specify the total space of the disk (defaultoff).--vfs-fast-fingerprintโ use fast (and less accurate, ngl) fingerprints for change detection.--vfs-handle-caching Durationโ how long to keep file handles and downloaders alive after the last close (default5s).--vfs-linksโ translate symlinks to/from regular files with a.rclonelinkextension for the VFS.--vfs-metadata-extension stringโ set the extension to read metadata from.--vfs-read-ahead SizeSuffixโ extra read ahead over--buffer-sizewhen using cache-mode full.--vfs-read-chunk-size SizeSuffixโ read the source objects in chunks (default128Mi).--vfs-read-chunk-size-limit SizeSuffixโ if it's greater than--vfs-read-chunk-size, double the chunk size after each chunk read until you hit the limit ('off'means unlimited) (defaultoff).--vfs-read-chunk-streams intโ the number of parallel streams to read at once.--vfs-read-wait Durationโ how long to wait for an in-sequence read before seeking (default20ms).--vfs-refreshโ refreshes the directory cache recursively in the background on start.--vfs-used-is-size rclone sizeโ use therclone sizealgorithm for the Used size.--vfs-write-back Durationโ how long to writeback files after the last use when using cache (default5s).--vfs-write-wait Durationโ how long to wait for an in-sequence write before throwing an error (default1s).--volname stringโ set the volume name (Windows and OSX only).--write-back-cacheโ makes the kernel buffer writes before sending them along to rclone. Without this, writethrough caching is what you get (not supported on Windows).
the options that get shared with the other commands are described right down below ๐ and for the global options that aren't listed here, go peek at the global flags page at https://rclone.org/flags/.
๐ธ Filter Options ๐ธ
flags for filtering directory listings, because you don't always want everything, bestie:
--delete-excludedโ delete files on the destination that got excluded from the sync.--exclude stringArrayโ exclude files matching the pattern.--exclude-from stringArrayโ read exclude patterns out of a file (use-to read from stdin).--exclude-if-present stringArrayโ exclude directories if that filename is present.--files-from stringArrayโ read the list of source-file names from a file (use-to read from stdin).--files-from-raw stringArrayโ read the list of source-file names from a file without any processing of the lines (use-to read from stdin).--files-from0 stringArrayโ read the list of source-file names from a file using NUL as the separator (use-to read from stdin).-f,--filter stringArrayโ add a file filtering rule.--filter-from stringArrayโ read file filtering patterns from a file (use-to read from stdin).--hash-filter stringโ partition filenames by hashk/nor randomly@/n.--ignore-caseโ ignore case in filters (case insensitive, periodt).--include stringArrayโ include files matching the pattern.--include-from stringArrayโ read file include patterns from a file (use-to read from stdin).--max-age Durationโ only transfer files younger than this, insor with a suffix fromms|s|m|h|d|w|M|y(defaultoff).--max-depth intโ if you set it, it limits the recursion depth to this (default-1).--max-size SizeSuffixโ only transfer files smaller than this, in KiB or with a suffix fromB|K|M|G|T|P(defaultoff).--metadata-exclude stringArrayโ exclude metadatas matching the pattern.--metadata-exclude-from stringArrayโ read metadata exclude patterns from a file (use-to read from stdin).--metadata-filter stringArrayโ add a metadata filtering rule.--metadata-filter-from stringArrayโ read metadata filtering patterns from a file (use-to read from stdin).--metadata-include stringArrayโ include metadatas matching the pattern.--metadata-include-from stringArrayโ read metadata include patterns from a file (use-to read from stdin).--min-age Durationโ only transfer files older than this, insor with a suffix fromms|s|m|h|d|w|M|y(defaultoff).--min-size SizeSuffixโ only transfer files bigger than this, in KiB or with a suffix fromB|K|M|G|T|P(defaultoff).
๐ฆ See Also ๐ฆ
- rclone (
https://rclone.org/commands/rclone/) โ show help for rclone commands, flags and backends.
๐ rclone obscure ๐
okay so this command is literally the password-hider bestie. It's for when you need to obscure a password for use in the rclone config file. That's the whole job. ๐
โจ Synopsis โจ
So here's the tea: in the rclone config file, human-readable passwords get obscured. How? By encrypting them and writing them out in base64. And no, bestie โ this is not a secure way of encrypting these passwords, because rclone itself can decrypt them. It's not about real security, it's about preventing "eyedropping" โ namely someone seeing a password in the rclone config file by accident. ๐
And like, so many equally important things (think access tokens ๐) are not obscured in the config file. But lowkey it's very hard to shoulder surf a 64 character hex token, so whatever. ๐
This command can also accept a password through STDIN instead of as an argument โ just pass a hyphen as the argument. It'll use the first line of STDIN as the password, not including the trailing newline.
echo 'secretpassword' | rclone obscure -
And if there's no data on STDIN to read? rclone obscure defaults to obfuscating the hyphen itself. Iconic behaviour honestly. ๐
If you actually want to encrypt the config file then please use config file encryption โ see rclone config (https://rclone.org/commands/rclone_config/) for more info.
rclone obscure password [flags]
โจ Options โจ
-h,--helpโ help for obscure
See the global flags page (https://rclone.org/flags/) for global options not listed here.
โจ See Also โจ
rclone(https://rclone.org/commands/rclone/) โ Show help for rclone commands, flags and backends.
๐ rclone rc ๐
Run a command against a running rclone. That's the vibe. Run a command against a running rclone.
โจ Synopsis โจ
So this runs a command against a rclone that's already running and vibing. Use the --url flag to specify a non default URL to connect on. It can be either a ":port", which is taken to mean http://localhost:port, or a "host:port", which is taken to mean http://host:port. ๐
A username and password can be passed in with --user and --pass.
And heads up, bestie: --rc-addr, --rc-user, --rc-pass will be read also for --url, --user, --pass. They're besties like that. ๐ซถ
The --unix-socket flag can be used to connect over a unix socket, like this:
# start server on /tmp/my.socket
rclone rcd --rc-addr unix:///tmp/my.socket
# Connect to it
rclone rc --unix-socket /tmp/my.socket core/stats
Arguments should be passed in as parameter=value.
The result will be returned as a JSON object by default. ๐ฆ
The --json parameter can be used to pass in a JSON blob as an input instead of key=value arguments. Real talk: this is the only way of passing in more complicated values.
The -o/--opt option can be used to set a key "opt" with key, value options in the form -o key=value or -o key. It can be repeated as many times as required. This is useful for rc commands which take the "opt" parameter, which by convention is a dictionary of strings.
-o key=value -o key2
Will place this in the "opt" value:
{"key":"value", "key2","")
The -a/--arg option can be used to set strings in the "arg" value. It can be repeated as many times as required. This is useful for rc commands which take the "arg" parameter, which by convention is a list of strings.
-a value -a value2
Will place this in the "arg" value:
["value", "value2"]
Use --loopback to connect to the rclone instance running rclone rc. This is very useful for testing commands without having to run an rclone rc server, e.g.:
rclone rc --loopback operations/about fs=/
Use rclone rc to see a list of all possible commands. ๐
rclone rc commands parameter [flags]
โจ Options โจ
-a,--argstringArray โ Argument placed in the"arg"array-h,--helpโ help for rc--jsonstring โ Input JSON - use instead of key=value args--loopbackโ If set connect to this rclone instance not via HTTP--no-outputโ If set, don't output the JSON result-o,--optstringArray โ Option in the form name=value or name placed in the"opt"array--passstring โ Password to use to connect to rclone remote control--unix-socketstring โ Path to a unix domain socket to dial to, instead of opening a TCP connection directly--urlstring โ URL to connect to rclone remote control (default"http://localhost:5572/")--userstring โ Username to use to rclone remote control
See the global flags page (https://rclone.org/flags/) for global options not listed here.
โจ See Also โจ
rclone(https://rclone.org/commands/rclone/) โ Show help for rclone commands, flags and backends.
๐ฆ rclone rcat ๐ฆ
Copies standard input to file on remote. Copies standard input to file on remote. Let's go. ๐
โจ Synopsis โจ
Reads from standard input (stdin) and copies it to a single remote file.
echo "hello world" | rclone rcat remote:path/to/file
ffmpeg - | rclone rcat remote:path/to/file
If the remote file already exists, it will be overwritten. No warning, no take-backs. ๐ญ
rcat will try to upload small files in a single request, which is usually more efficient than the streaming/chunked upload endpoints, which use multiple requests. Exact behaviour depends on the remote. What is considered a small file may be set through --streaming-upload-cutoff. Uploading only starts after the cutoff is reached or if the file ends before that. The data must fit into RAM. The cutoff needs to be small enough to adhere the limits of your remote, please see there. Generally speaking, setting this cutoff too high will decrease your performance.
Use the --size flag to preallocate the file in advance at the remote end and actually stream it, even if remote backend doesn't support streaming.
--size should be the exact size of the input stream in bytes. If the size of the stream is different in length to the --size passed in then the transfer will likely fail. So like, get it right bestie. ๐
Note that the upload cannot be retried because the data is not stored. If the backend supports multipart uploading then individual chunks can be retried. If you need to transfer a lot of data, you may be better off caching it locally and then rclone move it to the destination which can use retries.
rclone rcat remote:path [flags]
โจ Options โจ
-h,--helpโ help for rcat--sizeint โ File size hint to preallocate (default-1)
Options shared with other commands are described next. See the global flags page (https://rclone.org/flags/) for global options not listed here.
โจ Important Options โจ
Important flags useful for most commands
-n,--dry-runโ Do a trial run with no permanent changes-i,--interactiveโ Enable interactive mode-v,--verbosecount โ Print lots more stuff (repeat for more)
โจ See Also โจ
rclone(https://rclone.org/commands/rclone/) โ Show help for rclone commands, flags and backends.
๐ rclone rcd ๐
Run rclone listening to remote control commands only. Run rclone listening to remote control commands only.
โจ Synopsis โจ
This runs rclone so that it only listens to remote control commands.
This is useful if you are controlling rclone via the rc API. ๐
If you pass in a path to a directory, rclone will serve that directory for GET requests on the URL passed in. It will also open the URL in the browser when rclone is run. ๐
See the rc documentation (https://rclone.org/rc/) for more info on the rc flags.
โจ Server options โจ
Use --rc-addr to specify which IP address and port the server should listen on, eg --rc-addr 1.2.3.4:8000 or --rc-addr :8080 to listen to all IPs. By default it only listens on localhost. You can use port :0 to let the OS choose an available port. ๐
If you set --rc-addr to listen on a public or LAN accessible IP address then using Authentication is advised โ see the next section for info.
You can use a unix socket by setting the url to unix:///path/to/socket or just by using an absolute path name.
--rc-addr may be repeated to listen on multiple IPs/ports/sockets. Socket activation, described further below, can also be used to accomplish the same.
--rc-server-read-timeout and --rc-server-write-timeout can be used to control the timeouts on the server. Note that this is the total time for a transfer.
--rc-max-header-bytes controls the maximum number of bytes the server will accept in the HTTP header.
--rc-response-header can be used to set an HTTP header for all responses, will overriding existing values. The flag may be repeated to add multiple headers. Use the format Header-Name: value.
--rc-allow-origin enables cross-origin (CORS) requests from browsers by setting the Access-Control-Allow-Origin header on every response to the origin given, e.g. --rc-allow-origin https://app.example.com. Browser CORS preflight OPTIONS requests are answered by rclone without needing authentication as browsers never send credentials with them. Setting this to * allows any origin which is a security risk on an authenticated server. โ ๏ธ
--rc-baseurl controls the URL prefix that rclone serves from. By default rclone will serve from the root. If you used --rc-baseurl "/rclone" then rclone would serve from a URL starting with "/rclone/". This is useful if you wish to proxy rclone serve. Rclone automatically inserts leading and trailing "/" on --rc-baseurl, so --rc-baseurl "rclone", --rc-baseurl "/rclone" and --rc-baseurl "/rclone/" are all treated identically. ๐
--rc-disable-zip may be set to disable the zipping download option.
โจ Protocol โจ
The server supports HTTP/1.1 and HTTP/2. HTTP/2 is used automatically for TLS connections. For non-TLS connections, HTTP/2 cleartext (h2c) is supported, allowing HTTP/2 without encryption. โจ
โจ TLS (SSL) โจ
By default this will serve over http. If you want you can serve over https. You will need to supply the --rc-cert and --rc-key flags. If you wish to do client side certificate validation then you will need to supply --rc-client-ca also.
When TLS is configured every listener given with --rc-addr serves TLS. An individual listener can be prefixed with http:// to serve unencrypted HTTP on that address, or with tls:// to state explicitly that it must serve TLS. Using a tls:// address without --rc-cert and --rc-key is an error. ๐ญ
--rc-cert must be set to the path of a file containing either a PEM encoded certificate, or a concatenation of that with the CA certificate. --rc-key must be set to the path of a file with the PEM encoded private key. If setting --rc-client-ca, it should be set to the path of a file with PEM encoded client certificate authority certificates.
--rc-min-tls-version is minimum TLS version that is acceptable. Valid values are "tls1.0", "tls1.1", "tls1.2" and "tls1.3" (default "tls1.0").
โจ Socket activation โจ
Instead of the listening addresses specified above, rclone will listen to all FDs passed by the service manager, if any (and ignore any arguments passed by --rc-addr).
Okay so socket activation? It's giving โจmain character service energyโจ. This lets rclone be a socket-activated service, bestie. You set it up with .socket and .service unit files, exactly like the ones described over at https://www.freedesktop.org/software/systemd/man/latest/systemd.socket.html. ๐ซถ
Wanna test socket activation ad-hoc? The systemd-socket-activate command has you covered:
systemd-socket-activate -l 8000 -- rclone serve
This will socket-activate rclone on the first connection to port 8000 over TCP. No cap, it just vibes until someone knocks. ๐
TEMPLATE ๐จ
--rc-template lets you, yes you, specify a custom markup template for the HTTP and WebDAV serve functions. The server exports the following markup to be used within the template to serve pages:
.Nameโ The full path of a file/directory..Titleโ Directory listing of.Name..Sortโ The current sort used. This is changeable via the?sort=parameter. Possible values:namedirfirst,name,size,time(defaultnamedirfirst)..Orderโ The current ordering used. This is changeable via the?order=parameter. Possible values:asc,desc(defaultasc)..Queryโ Currently unused. (she's on break ๐).Breadcrumbโ Allows for creating a relative navigation..Linkโ The link of the Text relative to the root..Textโ The Name of the directory.
.Entriesโ Information about a specific file/directory..URLโ The url of an entry..Leafโ Currently same as.URLbut intended to be just the name..IsDirโ Boolean for if an entry is a directory or not..Sizeโ Size in bytes of the entry..ModTimeโ The UTC timestamp of an entry.
The server also makes the following functions available so that they can be used within the template. These functions help extend the options for dynamic rendering of HTML. They can be used to render HTML based on specific conditions. ๐ฆ
afterEpochโ Returns the time since the epoch for the given time.containsโ Checks whether a given substring is present or not in a given string.hasPrefixโ Checks whether the given string begins with the specified prefix.hasSuffixโ Checks whether the given string end with the specified suffix.
AUTHENTICATION ๐
By default this will serve files without needing a login. (yes bestie, wide open, of course that's the default, we love a chill server ๐)
You can either use an htpasswd file which can take lots of users, or set a single username and password with the --rc-user and --rc-pass flags.
Alternatively, you can have the reverse proxy manage authentication and use the username provided in the configured header with --user-from-header (e.g., --rc-user-from-header=x-remote-user). Ensure the proxy is trusted and headers cannot be spoofed, as misconfiguration may lead to unauthorized access. ๐
Not kidding about that one โ a spoofable header is a whole entire security situation. Trust the proxy, or don't use this.
If either of the above authentication methods is not configured and client certificates are required by the --client-ca flag passed to the server, the client certificate common name will be considered as the username. Cute, right? ๐ธ
Use --rc-htpasswd /path/to/htpasswd to provide an htpasswd file. This is in standard apache format and supports MD5, SHA1 and BCrypt for basic authentication. Bcrypt is recommended. fr fr, pick Bcrypt.
To create an htpasswd file:
touch htpasswd
htpasswd -B htpasswd user
htpasswd -B htpasswd anotherUser
The password file can be updated while rclone is running. Live updates, she's flexible like that ๐
When authentication is enabled every request must be authenticated, including HTTP OPTIONS requests, as the answer to an OPTIONS request can reveal whether a path exists. Health checks or monitoring which use unauthenticated OPTIONS requests will need to send credentials. The exception is browser CORS preflight requests when --rc-allow-origin is set, which are answered without authentication as browsers never send credentials with them.
Use --rc-realm to set the authentication realm.
Use --rc-salt to change the password hashing salt from the default.
rclone rcd <path to files to serve>* [flags]
OPTIONS ๐
-h,--helpโ help forrcd
Options shared with other commands are described next. See the global flags page (https://rclone.org/flags/) for global options not listed here.
RC OPTIONS ๐
Flags to control the Remote Control API. Buckle up, there's a lot of them, but every single one is iconic in her own way:
--rcโ Enable the remote control server--rc-addr stringArrayโ IPaddress:Port or :Port to bind server to (defaultlocalhost:5572)--rc-allow-origin stringโ Origin which cross-domain request (CORS) can be executed from--rc-baseurl stringโ Prefix for URLs - leave blank for root--rc-cert stringโ TLS PEM key (concatenation of certificate and CA certificate)--rc-client-ca stringโ Client certificate authority to verify clients with--rc-enable-metricsโ Enable the Prometheus metrics path at the remote control server--rc-files stringโ Path to local files to serve on the HTTP server--rc-htpasswd stringโ A htpasswd file - if not provided no authentication is done--rc-job-expire-duration Durationโ Expire finished async jobs older than this value (default1m0s)--rc-job-expire-interval Durationโ Interval to check for expired async jobs (default10s)--rc-key stringโ TLS PEM Private key--rc-max-header-bytes intโ Maximum size of request header (default4096)--rc-min-tls-version stringโ Minimum TLS version that is acceptable (default"tls1.0")--rc-no-authโ Don't require auth for certain methods--rc-pass stringโ Password for authentication--rc-realm stringโ Realm for authentication--rc-response-header stringArrayโ Set HTTP header for all responses, overriding existing values--rc-salt stringโ Password hashing salt (default"dlPL2MqE")--rc-serveโ Enable the serving of remote objects--rc-serve-no-modtimeโ Don't read the modification time (can speed things up)--rc-server-read-timeout Durationโ Timeout for server reading data (default1h0m0s)--rc-server-write-timeout Durationโ Timeout for server writing data (default1h0m0s)--rc-template stringโ User-specified template--rc-user stringโ User name for authentication--rc-user-from-header stringโ User name from a defined HTTP header--rc-web-fetch-url stringโ URL to fetch the releases for webgui (default"https://api.github.com/repos/rclone/rclone-webui-react/releases/latest")--rc-web-guiโ Launch WebGUI on localhost--rc-web-gui-force-updateโ Force update to latest version of web gui--rc-web-gui-no-open-browserโ Don't open the browser automatically--rc-web-gui-updateโ Check and update to latest version of web gui
SEE ALSO ๐
rclone(https://rclone.org/commands/rclone/) - Show help for rclone commands, flags and backends.
๐ rclone rmdirs
Deleting empty directories under the path. Like a little spring cleaning for your remote bestie ๐งนโจ
Synopsis
Okay so here's the tea: this one recursively removes any empty directories it finds under the path โ and yes, that includes directories that only contain other empty directories. Sneaky nesting, but we get them all. ๐
The root path itself will also get removed if it's empty, unless you supply the --leave-root flag. So if you're attached to that root, speak now.
If you only wanna delete just the empty directory given by path and not recurse at all, use the command [rmdir](https://rclone.org/commands/rclone_rmdir/) instead. Different vibe, less chaos.
This is genuinely useful for tidying up remotes that rclone has left a lot of empty directories in (a crime rclone commits constantly, no cap). For example the [delete](https://rclone.org/commands/rclone_delete/) command will delete files but leave the directory structure behind โ unless you used it with the option --rmdirs. Rude of it tbh.
Heads up: this will delete --checkers directories concurrently, so if you have thousands of empty directories, lowkey consider increasing that number. She's efficient but she's got a limit. ๐ฅ
And if you wanna delete a path and any objects inside it, you want the [purge](https://rclone.org/commands/rclone_purge/) command instead. rmdirs is strictly for the empties.
rclone rmdirs remote:path [flags]
Options
-h,--helpโ help for rmdirs ๐ซถ--leave-rootโ Do not remove root directory if empty
Options shared with other commands are described next. See the global flags page (https://rclone.org/flags/) for global options not listed here.
Important Options
Important flags useful for most commands โ the icons of the group chat:
-n,--dry-runโ Do a trial run with no permanent changes-i,--interactiveโ Enable interactive mode-v,--verbose countโ Print lots more stuff (repeat for more)
See Also
- [rclone](https://rclone.org/commands/rclone/) โ Show help for rclone commands, flags and backends.
๐ rclone selfupdate
Update the rclone binary. Glow-up mode: activated. ๐
Synopsis
This command downloads the latest release of rclone and replaces the currently running binary. The download is verified with a hashsum and a cryptographically signed signature, so she's checked, she's secure, she's legit โ see the [release signing docs](https://rclone.org/release_signing/) for the details. ๐
If you use it without flags (or with the implied --stable flag), it installs the latest stable release. But bestie, listen โ sometimes certain issues only get fixed (or features only get added) in the latest beta release. In those cases you should run the command with the --beta flag, i.e. rclone selfupdate --beta. And the smartest move? You can check in advance which version would be installed by adding the --check flag first, then repeat the command without it once you're satisfied. Then you just sit back and let it cook. โจ
Sometimes the rclone team may recommend you a concrete beta or stable rclone release to troubleshoot your issue or add a bleeding edge feature. For that, the --version VER flag โ if given โ will update you to that concrete version instead of the latest one. And if you omit the micro version from VER (for example 1.53), the latest matching micro version will be used. iykyk.
Upon a successful update, rclone will print a message that contains a previous version number. You will need it if you later decide to revert your update for some reason (no judgment, we've all been there ๐). Then you'll have to note the previous version and run the following command: rclone selfupdate [--beta] OLDVER. If the old version contains only dots and digits (for example v1.54.0) then it's a stable release so you won't need the --beta flag. Beta releases have additional information similar to v1.54.0-beta.5111.06f1c0c61. (And if you are a developer and use a locally built rclone, the version number will end with -DEV, you will have to rebuild it as it obviously can't be distributed.) ๐
If you previously installed rclone via a package manager, the package may include local documentation or configure services. You may wish to update with the flag --package deb or --package rpm (whichever is correct for your OS) to update these too. This command with the default --package zip will update only the rclone executable โ so the local manual may become inaccurate after it. Noted. ๐
The [rclone mount](https://rclone.org/commands/rclone_mount/) command may or may not support extended FUSE options depending on the build and OS. selfupdate will refuse to update if the capability would be discarded. She's protective like that. ๐ซถ
Note: Windows forbids deletion of a currently running executable, so this command will rename the old executable to rclone.old.exe upon success.
Please note that this command was not available before rclone version 1.55. If it fails for you with the message unknown command "selfupdate", then you will need to update manually following the [install documentation](https://rclone.org/install/). Fr fr.
rclone selfupdate [flags]
Options
--betaโ Install beta release--checkโ Check for latest release, do not download-h,--helpโ help for selfupdate--output stringโ Save the downloaded binary at a given path (default: replace running binary)--package stringโ Package format:zip|deb|rpm(default:zip)--stableโ Install stable release (this is the default)--version stringโ Install the given rclone version (default: latest)
See the global flags page (https://rclone.org/flags/) for global options not listed here.
See Also
- [rclone](https://rclone.org/commands/rclone/) โ Show help for rclone commands, flags and backends.
๐ฆ rclone serve
Serve a remote over a protocol. Main character energy, honestly. ๐
Synopsis
Serve a remote over a given protocol. Requires the use of a subcommand to specify the protocol, e.g.
rclone serve http remote:
When the --metadata flag is enabled, the following metadata fields will be provided as headers:
content-dispositioncache-controlcontent-languagecontent-encoding
Note: The availability of these fields depends on whether the remote supports metadata. So... sometimes it's giving, sometimes it's not. ๐คท
Each subcommand has its own options which you can see in their help.
rclone serve <protocol> [opts] <remote> [flags]
Options
-h,--helpโ help for serve
See the global flags page (https://rclone.org/flags/) for global options not listed here.
See Also
- [rclone](https://rclone.org/commands/rclone/) โ Show help for rclone commands, flags and backends.
- [rclone serve dlna](https://rclone.org/commands/rclone_serve_dlna/) โ Serve remote:path over DLNA
- [rclone serve docker](https://rclone.org/commands/rclone_serve_docker/) โ Serve any remote on docker's volume plugin API.
- [rclone serve ftp](https://rclone.org/commands/rclone_serve_ftp/) โ Serve remote:path over FTP.
- [rclone serve http](https://rclone.org/commands/rclone_serve_http/) โ Serve the remote over HTTP.
- [rclone serve nfs](https://rclone.org/commands/rclone_serve_nfs/) โ Serve the remote as an NFS mount
- [rclone serve restic](https://rclone.org/commands/rclone_serve_restic/) โ Serve the remote for restic's REST API.
- [rclone serve s3](https://rclone.org/commands/rclone_serve_s3/) โ Serve remote:path over s3.
- [rclone serve sftp](https://rclone.org/commands/rclone_serve_sftp/) โ Serve the remote over SFTP.
- [rclone serve webdav](https://rclone.org/commands/rclone_serve_webdav/) โ Serve remote:path over WebDAV.
๐ rclone serve dlna
Serve remote:path over DLNA ๐บโจ
Synopsis
Run a DLNA media server for media stored in an rclone remote. Many devices, such as the Xbox and PlayStation, can automatically discover this server in the LAN and play audio/video from it. VLC is also supported. Service discovery uses UDP multicast packets (SSDP) and will thus only work on LANs. Local legends only. ๐
Rclone will list all files present in the remote, without filtering based on media formats or file extensions. Additionally, there is no media transcoding support. This means that some players might show files that they are not able to play back correctly. So like... it'll show you the snack but you might not be able to eat it. ๐ญ
Rclone will add external subtitle files (.srt) to videos if they have the same filename as the video file itself (except the extension), either in the same directory as the video, or in a Subs subdirectory. Subtitles said slay. ๐
Server options
Use --addr to specify which IP address and port the server should listen on, e.g. --addr 1.2.3.4:8000 or --addr :8080 to listen to all IPs.
Use --name to choose the friendly server name, which is by default rclone (hostname).
Use --log-trace in conjunction with -vv to enable additional debug logging of all UPNP traffic. For when you really need to see everything. ๐
VFS - Virtual File System
This command uses the VFS layer. This adapts the cloud storage objects that rclone uses into something which looks much more like a disk filing system.
Cloud storage objects have lots of properties which aren't like disk files โ you can't extend them or write to the middle of them, so the VFS layer has to deal with that. Because there is no one right way of doing this, there are various options explained below.
The VFS layer also implements a directory cache โ this caches info about files and directories (but not the data) in memory. Chill, it's just metadata.
VFS Directory Cache
Using the --dir-cache-time flag, you can control how long a directory should be considered up to date and not refreshed from the backend. Changes made through the VFS will appear immediately or invalidate the cache. So your own edits are always seen instantly, iconic. ๐
--dir-cache-time duration Time to cache directory entries for (default 5m0s)
--poll-interval duration Time to wait between polling for changes. Must be smaller than dir-cache-time. Only on supported remotes. Set to 0 to disable (default 1m0s)
However โ and this is the important part โ changes made directly on the cloud storage by the web interface or a different copy of rclone will only be picked up once the directory cache expires, if the backend configured does not support polling for changes. If the backend does support polling, changes will be picked up within the polling interval. No cap.
You can send a SIGHUP signal to rclone for it to flush all directory caches, regardless of how old they are. Assuming only one rclone instance is running, you can reset the cache like this:
kill -SIGHUP $(pidof rclone)
If you configure rclone with a remote control then you can use rclone rc to flush the whole directory cache:
rclone rc vfs/forget
Or individual files or directories:
rclone rc vfs/forget file=path/to/file dir=path/to/dir
VFS File Buffering
The --buffer-size flag determines the amount of memory that will be used to buffer data in advance. It's like pre-loading the vibes. ๐ธ
Each open file will try to keep the specified amount of data in memory at all times. The buffered data is bound to one open file and won't be shared. Possessive, but okay.
This flag is an upper limit for the used memory per open file. The buffer will only use memory for data that is downloaded but not yet read. If the buffer is empty, only a small amount of memory will be used.
The maximum memory used by rclone for buffering can be up to --buffer-size * open files. So maybe do the math before you go wild, bestie. ๐งฎ
โจ VFS File Caching โจ
okay so these are the flags that run the whole VFS file caching situation ๐ . File caching is literally what makes the VFS layer pretend to be a normal file system, bestie. You can turn it off, but then you're paying for it in compatibility, and that's the trade.
Like, for example? If you wanna read AND write to a file at the same time you need VFS caching enabled. More deets down below ๐
Heads up: the VFS cache is a whole separate thing from the cache backend. You might need one, or the other, or both. Not the same, no cap ๐ซถ
--cache-dirstring โ Directory rclone will use for caching.--vfs-cache-modeCacheMode โ Cache modeoff|minimal|writes|full(defaultoff)--vfs-cache-max-ageduration โ Max time since last access of objects in the cache (default1h0m0s)--vfs-cache-max-sizeSizeSuffix โ Max total size of objects in the cache (defaultoff)--vfs-cache-min-free-spaceSizeSuffix โ Target minimum free space on the disk containing the cache (defaultoff)--vfs-cache-poll-intervalduration โ Interval to poll the cache for stale objects (default1m0s)--vfs-write-backduration โ Time to writeback files after last use when using cache (default5s)
If you run with -vv, rclone will straight up tell you where the file cache lives ๐. The files sit in the user cache file area โ which is OS dependent, but you can boss it around with --cache-dir or by setting the appropriate environment variable.
The cache has 4 different modes, picked with --vfs-cache-mode. The higher the cache mode, the more compatible rclone gets โ and the more disk space it eats. That's the deal, periodt.
Now, important: files only get written back to the remote when they're closed and if they haven't been accessed for --vfs-write-back seconds. So if rclone quits or dies with files that haven't uploaded yet, don't panic โ those will get uploaded next time you run rclone with the same flags ๐
If you're using --vfs-cache-max-size or --vfs-cache-min-free-space, bestie, be aware the cache can exceed those quotas, and there are exactly two reasons why:
- It's only checked every
--vfs-cache-poll-interval. - Open files can't be evicted from the cache.
When --vfs-cache-max-size or --vfs-cache-min-free-space gets exceeded, rclone tries to evict the least accessed files first. It starts with files that haven't been touched for the longest. This flushing strategy is efficient, so the more relevant files are likely to stay cached ๐โจ
--vfs-cache-max-age evicts files from the cache once the set time since last access has passed โ it's based on access time, not on when the file was first added. The default of 1 hour means rclone starts evicting anything that hasn't been accessed for 1 hour. But the moment a cached file gets accessed, that 1 hour timer resets to 0 and waits a whole other hour before evicting. Specify the time with standard notation: s, m, h, d, w.
โ ๏ธ Do NOT run two copies of rclone using the same VFS cache with the same or overlapping remotes if you're using--vfs-cache-mode>off. This can potentially cause data corruption. Like, actually. You can work around it by giving each rclone its own cache hierarchy with--cache-dir. And if the remotes in use don't overlap? Then you're fine, don't even worry about it ๐ง
๐ --vfs-cache-mode off ๐
In this mode (the default, btw) the cache reads directly from the remote and writes directly to the remote, without caching anything on disk.
Which means some operations are just not possible, sorry:
- Files can't be opened for both read AND write
- Files opened for write can't be seeked
- Existing files opened for write must have
O_TRUNCset - Files open for read with
O_TRUNCwill be opened write only - Files open for write only will behave as if
O_TRUNCwas supplied - Open modes
O_APPEND,O_TRUNCare ignored - If an upload fails it can't be retried
๐ธ --vfs-cache-mode minimal ๐ธ
This one is very similar to "off", except that files opened for read AND write will be buffered to disk. So files opened for write are a lot more compatible โ while using the absolute minimal disk space. Queen of efficiency, lowkey ๐
These operations are not possible:
- Files opened for write only can't be seeked
- Existing files opened for write must have
O_TRUNCset - Files opened for write only will ignore
O_APPEND,O_TRUNC - If an upload fails it can't be retried
๐ฆ --vfs-cache-mode writes ๐ฆ
In this mode, files opened for read only are still read directly from the remote โ but write only and read/write files are buffered to disk first.
This mode should support all normal file system operations ๐
And if an upload fails? It gets retried at exponentially increasing intervals, up to 1 minute. Growth mindset fr fr ๐
๐ --vfs-cache-mode full ๐
In this mode all reads and writes are buffered to and from disk. When data is read from the remote, that gets buffered to disk too.
Fun fact: in this mode the files in the cache are sparse files, and rclone keeps track of which bits of each file it's actually downloaded. So if an app only reads the starts of each file, rclone only buffers the start of the file. Those files will appear to be their full size in the cache, but they're sparse files with only the downloaded data actually present in them. Sneaky. Iconic. ๐ซถ
This mode should support all normal file system operations, and is otherwise identical to --vfs-cache-mode writes.
When reading a file, rclone reads --buffer-size plus --vfs-read-ahead bytes ahead. The --buffer-size is buffered in memory, whereas the --vfs-read-ahead is buffered on disk.
When you're using this mode, it's recommended that --buffer-size is not set too large, and --vfs-read-ahead is set large if required.
๐จ IMPORTANT: not all file systems support sparse files. In particularFAT/exFATdo not. Rclone will perform very badly if the cache directory is on a filesystem that doesn't support sparse files, and it will log anERRORmessage if one is detected. Do not skip this one bestie ๐ญ
๐ Fingerprinting ๐
Various parts of the VFS use fingerprinting to see if a local file copy has changed relative to a remote file. Fingerprints are made from:
- size
- modification time
- hash
...where available on an object.
On some backends, some of these attributes are slow to read โ like they take an extra API call per object, or extra work per object. Rough.
For example hash is slow with the local and sftp backends, because they have to read the entire file and hash it. And modtime is slow with the s3, swift, ftp and qinqstor backends, because they need to do an extra API call to fetch it.
So if you use the --vfs-fast-fingerprint flag, rclone will not include the slow operations in the fingerprint. This makes fingerprinting less accurate but much faster, and it improves the opening time of cached files. Speed vs accuracy, the eternal vibe check โ๏ธ
If you're running a vfs cache over local, s3 or swift backends, using this flag is recommended, fr fr.
Note that if you change the value of this flag, the fingerprints of the files in the cache may be invalidated and the files will need to be downloaded again. So maybe don't flip it back and forth for fun ๐
๐ VFS Chunked Reading ๐
When rclone reads files from a remote, it reads them in chunks. So instead of requesting the whole entire file, rclone reads just the chunk specified. This can reduce the used download quota for some remotes โ because you're only requesting the chunks that are actually read โ at the cost of an increased number of requests.
These flags control the chunking:
--vfs-read-chunk-sizeSizeSuffix โ Read the source objects in chunks (default128M)--vfs-read-chunk-size-limitSizeSuffix โ Max chunk doubling size (defaultoff)--vfs-read-chunk-streamsint โ The number of parallel streams to read at once
The chunking behaves differently depending on the --vfs-read-chunk-streams parameter. Two whole personalities, iykyk.
โญ --vfs-read-chunk-streams == 0
Rclone will start reading a chunk of size --vfs-read-chunk-size, and then double the size for each read. When --vfs-read-chunk-size-limit is specified, and greater than --vfs-read-chunk-size, the chunk size for each open file gets doubled only until the specified value is reached. If the value is "off", which is the default, the limit is disabled and the chunk size will grow indefinitely. No brakes, no cap ๐๏ธ
With --vfs-read-chunk-size 100M and --vfs-read-chunk-size-limit 0 the following parts will be downloaded: 0-100M, 100M-200M, 200M-300M, 300M-400M and so on. When --vfs-read-chunk-size-limit 500M is specified, the result would be 0-100M, 100M-300M, 300M-700M, 700M-1200M, 1200M-1700M and so on.
Setting --vfs-read-chunk-size to 0 or "off" disables chunked reading entirely.
The chunks will not be buffered in memory.
๐ฅ --vfs-read-chunk-streams > 0
Rclone reads --vfs-read-chunk-streams chunks of size --vfs-read-chunk-size concurrently. The size for each read will stay constant.
This improves performance massively on high latency links, or very high bandwidth links to high performance object stores. It's giving parallel queen energy ๐ โจ
Some experimentation will be needed to find the optimum values of --vfs-read-chunk-size and --vfs-read-chunk-streams, because these will depend on the backend in use and the latency to the backend.
For high performance object stores (eg AWS S3) a reasonable place to start might be --vfs-read-chunk-streams 16 and --vfs-read-chunk-size 4M. In testing with AWS S3 the performance scaled roughly as the --vfs-read-chunk-streams setting.
Similar settings should work for high latency links, but depending on the latency they may need more --vfs-read-chunk-streams in order to get the throughput.
๐ VFS Performance ๐
These flags may be used to enable/disable features of the VFS for performance or other reasons. See also the chunked reading feature above ๐
In particular S3 and Swift benefit hugely from the --no-modtime flag (or use --use-server-modtime for a slightly different effect), because each read of the modification time takes a transaction. Every single one. Expensive bestie ๐ญ
--no-checksumโ Don't compare checksums on up/download.--no-modtimeโ Don't read/write the modification time (can speed things up).--no-seekโ Don't allow seeking in files.--read-onlyโ Only allow read-only access.
Sometimes rclone is delivered reads or writes out of order. Rather than seeking, rclone will wait a short time for the in-sequence read or write to come in. These flags only come into effect when not using an on disk cache file.
--vfs-read-waitduration โ Time to wait for in-sequence read before seeking (default20ms)--vfs-write-waitduration โ Time to wait for in-sequence write before giving error (default1s)
When using VFS write caching (--vfs-cache-mode with value writes or full), the global flag --transfers can be set to adjust the number of parallel uploads of modified files from the cache. And just so you know โ the related global flag --checkers has no effect on the VFS. So don't bother tweaking it for this, bestie ๐
--transfers intโ Number of file transfers to run in parallel (default 4). Yeah bestie, that's literally just "how many at once", dial it up if your connection can take it ๐
๐ฆ Symlinks ๐ฆ
okay so by default the VFS is like "symlinks? never heard of her" โ no symlink support at all. but you can turn it on with either of these two flags:
--linksโ Translate symlinks to/from regular files with a.rclonelinkextension.--vfs-linksโ Translate symlinks to/from regular files with a.rclonelinkextension for the VFS.
the way this works is lowkey genius: most cloud storage systems don't do symlinks at all, so rclone just stores the symlink as a totally normal file with a special extension. so a file that shows up as a symlink called link-to-file.txt is actually stored on cloud storage as link-to-file.txt.rclonelink, and the contents of that file are literally the path to the symlink destination. iconic behavior, no cap ๐ซถ
heads up though, there's a real difference between the two:
--linksturns symlink translation on globally in rclone โ that includes any backend that supports the concept (for example the local backend).--vfs-linksonly turns it on for the VFS layer.
this scheme is compatible with the one the local backend uses with the --local-links flag (https://rclone.org/local/#symlinks-junction-points). ๐
the --vfs-links flag was designed for rclone mount, rclone nfsmount and rclone serve nfs.
and it has not been tested with the other rclone serve commands yet. so like, it might slay there, but nobody's verified that. ๐
there's also a limitation in the current implementation: it expects the caller to resolve sub-symlinks. for example, given this directory tree
.
โโโ dir
โ โโโ file.txt
โโโ linked-dir -> dir
the VFS will correctly resolve linked-dir but not linked-dir/file.txt. this isn't a problem for the tested commands, but it may be for other commands. ๐
and ngl there's an outstanding issue with symlink support, issue #8245 (https://github.com/rclone/rclone/issues/8245), where duplicate files get created when symlinks are moved into directories where there's a file of the same name (or vice versa). so like, be aware. โจ
๐ธ VFS Case Sensitivity ๐ธ
let's talk case, because this is where things get ~spicy~.
Linux file systems are case-sensitive: two files can differ only by case, and the exact case must be used when opening a file.
File systems in modern Windows are case-insensitive but case-preserving: although existing files can be opened using any case, the exact case used to create the file is preserved and available for programs to query. It is not allowed for two files in the same directory to differ only by case.
Usually file systems on macOS are case-insensitive. It is possible to make macOS file systems case-sensitive, but that is not the default.
so the --vfs-case-insensitive VFS flag controls how rclone handles these two cases:
- if its value is
"false", rclone passes file names to the remote as-is. - if the flag is
"true"(or appears without a value on the command line), rclone may perform a "fixup" as explained below. ๐
here's the fixup tea โ โ the user may specify a file name to open/delete/rename/etc with a case different than what is stored on the remote. If an argument refers to an existing file with exactly the same name, then the case of the existing file on the disk will be used. However, if a file name with exactly the same name is not found but a name differing only by case exists, rclone will transparently fixup the name. This fixup happens only when an existing file is requested. Case sensitivity of file names created anew by rclone is controlled by the underlying remote.
note that case sensitivity of the operating system running rclone (the target) may differ from case sensitivity of a file system presented by rclone (the source). The flag controls whether "fixup" is performed to satisfy the target. ๐
and if the flag is not provided on the command line, then its default value depends on the operating system where rclone runs:
"true"on Windows and macOS"false"otherwise
If the flag is provided without a value, then it is "true". periodt. ๐
the --no-unicode-normalization flag controls whether a similar "fixup" is performed for filenames that differ but are canonically equivalent (https://en.wikipedia.org/wiki/Unicode_equivalence) with respect to unicode. Unicode normalization can be particularly helpful for users of macOS, which prefers form NFD instead of the NFC used by most other platforms. It is therefore highly recommended to keep the default of false on macOS, to avoid encoding compatibility issues. ๐ง
in the (probably unlikely) event that a directory has multiple duplicate filenames after applying case and unicode normalization, the --vfs-block-norm-dupes flag allows hiding these duplicates. This comes with a performance tradeoff, as rclone will have to scan the entire directory for duplicates when listing a directory. For this reason, it is recommended to leave this disabled if not needed. ๐
however, macOS users may wish to consider using it, as otherwise, if a remote directory contains both NFC and NFD versions of the same filename, an odd situation will occur: both versions of the file will be visible in the mount, and both will appear to be editable, however, editing either version will actually result in only the NFD version getting edited under the hood. ๐ญ
--vfs-block-norm-dupes prevents this confusion by detecting this scenario, hiding the duplicates, and logging an error, similar to how this is handled in rclone sync. slay, honestly. โจ
๐ VFS Disk Options ๐
This flag allows you to manually set the statistics about the filing system. It can be useful when those statistics cannot be read correctly automatically. (it happens, bestie, backends be lying.)
--vfs-disk-space-total-sizeโ Manually set the total disk space size (example:256G, default:-1)
๐ Alternate report of used bytes ๐
Some backends, most notably S3, do not report the amount of bytes used. If you need this information to be available when running df on the filesystem, then pass the flag --vfs-used-is-size to rclone. With this flag set, instead of relying on the backend to report this information, rclone will scan the whole remote similar to rclone size and compute the total used space itself.
WARNING: Contrary to rclone size, this flag ignores filters so that the result is accurate. However, this is very inefficient and may cost lots of API calls resulting in extra charges. Use it as a last resort and only with caching. ๐ธ
like, fr fr, this is the "break glass in case of emergency" flag. do not just casually turn this on and go get lunch. ๐ซ
โญ VFS Metadata โญ
If you use the --vfs-metadata-extension flag you can get the VFS to expose files which contain the metadata (https://rclone.org/docs/#metadata) as a JSON blob. ๐
These files will not appear in the directory listing, but can be stat-ed and opened, and once they have been (stat-ed/opened) they will appear in directory listings until the directory cache expires.
Note that some backends won't create metadata unless you pass in the --metadata flag.
For example, using rclone mount with --metadata --vfs-metadata-extension .metadata we get:
$ ls -l /mnt/
total 1048577
-rw-rw-r-- 1 user user 1073741824 Mar 3 16:03 1G
$ cat /mnt/1G.metadata
{
"atime": "2025-03-04T17:34:22.317069787Z",
"btime": "2025-03-03T16:03:37.708253808Z",
"gid": "1000",
"mode": "100664",
"mtime": "2025-03-03T16:03:39.640238323Z",
"uid": "1000"
}
$ ls -l /mnt/
total 1048578
-rw-rw-r-- 1 user user 1073741824 Mar 3 16:03 1G
-rw-rw-r-- 1 user user 185 Mar 3 16:03 1G.metadata
see how 1G.metadata just appears once you've touched it? that's the directory cache doing its thing. ๐
If the file has no metadata it will be returned as {} and if there is an error reading the metadata the error will be returned as {"error":"error string"}.
so like, always check for that error key before you trust the blob, iykyk ๐
rclone serve dlna remote:path [flags]
โจ Options โจ
okay bestie, here's the full flag menu for serve dlna โ every single one, no skips ๐
--addrstring โ theip:portor just:portthe DLNA http server binds to (default":7879")--announce-intervalDuration โ how long to wait between SSDP announcements (default12m0s)--dir-cache-timeDuration โ how long directory entries get cached (default5m0s)--dir-permsFileMode โ directory permissions (default777)--file-permsFileMode โ file permissions (default666)--giduint32 โ override the gid field the filesystem sets (not supported on Windows) (default1000)-h,--helpโ help fordlna--interfacestringArray โ the interface to use for SSDP (repeat it as many times as you need)--link-permsFileMode โ link permissions (default666)--log-traceโ turn on trace logging of SOAP traffic--namestring โ name of the DLNA server--no-checksumโ don't compare checksums on up/download--no-modtimeโ don't read/write the modification time (can speed things up)--no-seekโ don't allow seeking inside files--poll-intervalDuration โ time to wait between polling for changes; must be smaller thandir-cache-timeand only works on supported remotes (set0to disable) (default1m0s)--read-onlyโ only allow read-only access--uiduint32 โ override the uid field the filesystem sets (not supported on Windows) (default1000)--umaskFileMode โ override the permission bits the filesystem sets (not supported on Windows) (default002)--vfs-block-norm-dupesโ if duplicate filenames exist in the same directory (after normalization), log an error and hide the duplicates (may cost you performance)--vfs-cache-max-ageDuration โ max time since last access of objects in the cache (default1h0m0s)--vfs-cache-max-sizeSizeSuffix โ max total size of objects in the cache (defaultoff)--vfs-cache-min-free-spaceSizeSuffix โ target minimum free space on the disk containing the cache (defaultoff)--vfs-cache-modeCacheMode โ cache modeoff|minimal|writes|full(defaultoff)--vfs-cache-poll-intervalDuration โ interval to poll the cache for stale objects (default1m0s)--vfs-case-insensitiveโ if a file name isn't found, go find a case insensitive match--vfs-disk-space-total-sizeSizeSuffix โ specify the total space of disk (defaultoff)--vfs-fast-fingerprintโ use fast (less accurate) fingerprints for change detection--vfs-handle-cachingDuration โ time to keep file handle and downloaders alive after last close (default5s)--vfs-linksโ translate symlinks to/from regular files with a.rclonelinkextension for the VFS--vfs-metadata-extensionstring โ set the extension to read metadata from--vfs-read-aheadSizeSuffix โ extra read ahead over--buffer-sizewhen using cache-mode full--vfs-read-chunk-sizeSizeSuffix โ read the source objects in chunks (default128Mi)--vfs-read-chunk-size-limitSizeSuffix โ if greater than--vfs-read-chunk-size, double the chunk size after each chunk read, until the limit is reached ('off'is unlimited) (defaultoff)--vfs-read-chunk-streamsint โ the number of parallel streams to read at once--vfs-read-waitDuration โ time to wait for in-sequence read before seeking (default20ms)--vfs-refreshโ refreshes the directory cache recursively in the background on start--vfs-used-is-sizerclone size โ use therclone sizealgorithm for Used size--vfs-write-backDuration โ time to writeback files after last use when using cache (default5s)--vfs-write-waitDuration โ time to wait for in-sequence write before giving error (default1s)
Options shared with other commands are described next. See the global flags page (https://rclone.org/flags/) for global options not listed here.
๐ Filter Options ๐
Flags for filtering directory listings, bestie โ this is the "what do I actually want" section ๐
--delete-excludedโ delete files on dest excluded from sync--excludestringArray โ exclude files matching pattern--exclude-fromstringArray โ read file exclude patterns from file (use-to read from stdin)--exclude-if-presentstringArray โ exclude directories if filename is present--files-fromstringArray โ read list of source-file names from file (use-to read from stdin)--files-from-rawstringArray โ read list of source-file names from file without any processing of lines (use-to read from stdin)--files-from0stringArray โ read list of source-file names from file using NUL as separator (use-to read from stdin)-f,--filterstringArray โ add a file filtering rule--filter-fromstringArray โ read file filtering patterns from a file (use-to read from stdin)--hash-filterstring โ partition filenames by hashk/nor randomly@/n--ignore-caseโ ignore case in filters (case insensitive)--includestringArray โ include files matching pattern--include-fromstringArray โ read file include patterns from file (use-to read from stdin)--max-ageDuration โ only transfer files younger than this, insor suffixms|s|m|h|d|w|M|y(defaultoff)--max-depthint โ if set, limits the recursion depth to this (default-1)--max-sizeSizeSuffix โ only transfer files smaller than this, in KiB or suffixB|K|M|G|T|P(defaultoff)--metadata-excludestringArray โ exclude metadatas matching pattern--metadata-exclude-fromstringArray โ read metadata exclude patterns from file (use-to read from stdin)--metadata-filterstringArray โ add a metadata filtering rule--metadata-filter-fromstringArray โ read metadata filtering patterns from a file (use-to read from stdin)--metadata-includestringArray โ include metadatas matching pattern--metadata-include-fromstringArray โ read metadata include patterns from file (use-to read from stdin)--min-ageDuration โ only transfer files older than this, insor suffixms|s|m|h|d|w|M|y(defaultoff)--min-sizeSizeSuffix โ only transfer files bigger than this, in KiB or suffixB|K|M|G|T|P(defaultoff)
๐ See Also ๐
rclone serve(https://rclone.org/commands/rclone_serve/) โ Serve a remote over a protocol.
๐ณ rclone serve docker ๐ณ
bestie. we're serving ANY remote on docker's volume plugin API. it's giving "cloud storage but docker thinks it's a local volume" and honestly? iconic โจ
๐ Synopsis ๐
This command implements the Docker volume plugin API, which lets docker use rclone as a data storage mechanism for a whole buffet of cloud providers. rclone provides the docker volume plugin based on it. no cap.
So here's the tea on how you make a docker plugin: you create a Unix or TCP socket that Docker goes looking for when you use the plugin, and then it listens for commands from the docker daemon and runs the corresponding code when necessary. Docker plugins can run as a managed plugin under control of the docker daemon, or as an independent native service. For testing, you can literally just run it straight from the command line, like:
sudo rclone serve docker --base-dir /tmp/rclone-volumes --socket-addr localhost:8787 -vv
Running rclone serve docker will create the said socket, listening for commands from Docker to create the necessary Volumes. Normally you don't need to give the --socket-addr flag at all. The API will listen on the unix domain socket at /run/docker/plugins/rclone.sock. In the example above, rclone will create a TCP socket and a small file /etc/docker/plugins/rclone.spec containing the socket address. We use sudo because both of those paths are writeable only by the root user. ๐
If you later decide to change the listening socket, the docker daemon must be restarted to reconnect to /run/docker/plugins/rclone.sock or to parse the new /etc/docker/plugins/rclone.spec. Until you restart it, any volume related docker commands will timeout trying to access the old socket. ๐ญ Running directly is supported on Linux only โ not on Windows or MacOS. This is not a problem with managed plugin mode, described in detail in the full documentation (https://rclone.org/docker).
The command will create volume mounts under the path given by --base-dir (by default /var/lib/docker-volumes/rclone, available only to root) and maintain the JSON formatted file docker-plugin.state in the rclone cache directory, holding book-keeping records of created and mounted volumes.
All mount and VFS options are submitted by the docker daemon via API, but you can also provide defaults on the command line as well as set the path to the config file and cache directory, or adjust logging verbosity.
๐ Restarting or upgrading the plugin ๐
When the plugin is restarted (for example with docker plugin disable rclone && docker plugin enable rclone, when upgrading the plugin, or when the host reboots) rclone reads its docker-plugin.state file and restores the volumes and mounts that were active before. The plugin starts serving its socket straight away and re-establishes the mounts in the background, so a slow or unreachable remote no longer prevents the plugin from coming back up. periodt. ๐ซถ
But โ and this is the part you need to hear, bestie โ restarting the plugin necessarily stops and restarts the process that serves the FUSE mounts. Any container that is already running and holding files open on an rclone volume keeps a handle to the old, now dead mount, so those handles start returning transport endpoint is not connected until the container is restarted. This is a limitation of replacing the process behind a live FUSE mount and cannot be avoided by rclone โ the plugin itself recovers and newly started containers work normally, but:
- Restart any containers that were using rclone volumes after you restart or upgrade the plugin (e.g.
docker restart <container>), or stop them before and start them after. - Databases and other applications that keep files open continuously (Grafana, Prometheus, SQLite-backed apps, etc.) are the most affected and should always be restarted.
fr fr, if you've got a database squatting on an rclone volume, restart it. don't be that person ๐
๐ก๏ธ Security
so like, the plugin API takes a remote (aka fs) option when you create a volume, and bestie, it gets parsed exactly like an rclone connection string. Connection strings are trusted configuration โ they can carry inline backend options, and some backends use those options to run local commands (the sftp backend's ssh option spawning an external binary is the classic example ๐). Which means anyone who can send requests to the plugin socket can make rclone run arbitrary commands as whoever's running rclone serve docker โ and that's typically root. so. yeah. Treat access to that socket as literally equal to that level of access, and only ever expose it to callers you trust. periodt.
When rclone is listening on the default unix socket at /run/docker/plugins/rclone.sock, it makes that socket with mode 0660, owned by root and the group given by --socket-gid (which defaults to the process GID), so only root and members of that group โ normally just the docker daemon โ can reach it. Do not loosen these permissions, and do not hand that group over to untrusted users. nope nope nope ๐
When you use --socket-addr to listen on a TCP socket, there is no authentication and the API is reachable by literally anyone who can open the port, so bind it to a loopback or otherwise trusted address and protect it with a firewall, okay? And note: holding Docker daemon access is already equivalent to root on the host, so a caller who can issue docker volume create doesn't actually gain anything new from this. the real concern is exposing the socket more widely than the daemon itself. ๐
๐ VFS - Virtual File System
This command uses the VFS layer. It takes the cloud storage objects rclone works with and adapts them into something that looks wayyy more like a disk filing system โจ
Cloud storage objects have lots of properties that aren't like disk files โ you can't extend them, you can't write to the middle of them โ so the VFS layer has to deal with all of that. And because there's no one single correct way of doing it, there are various options, explained below. ๐ซถ
The VFS layer also implements a directory cache โ it caches info about files and directories (but not the data) in memory.
๐ VFS Directory Cache
Using the --dir-cache-time flag, you control how long a directory should be considered up to date and not refreshed from the backend. Changes made through the VFS will show up immediately or invalidate the cache. slay.
--dir-cache-time duration Time to cache directory entries for (default 5m0s)
--poll-interval duration Time to wait between polling for changes. Must be smaller than dir-cache-time. Only on supported remotes. Set to 0 to disable (default 1m0s)
However ๐ changes made directly on the cloud storage โ through the web interface, or by a different copy of rclone โ will only get picked up once the directory cache expires, if the backend you configured doesn't support polling for changes. If the backend does support polling, changes get picked up within the polling interval. iykyk.
You can send a SIGHUP signal to rclone and it'll flush all directory caches, no matter how old they are. Assuming only one rclone instance is running, you can reset the cache like this:
kill -SIGHUP $(pidof rclone)
If you configure rclone with a remote control, then you can use rclone rc to flush the whole directory cache:
rclone rc vfs/forget
Or individual files or directories:
rclone rc vfs/forget file=path/to/file dir=path/to/dir
๐งธ VFS File Buffering
The --buffer-size flag determines the amount of memory that'll be used to buffer data in advance.
Each open file will try to keep the specified amount of data in memory at all times. The buffered data is bound to one open file and won't be shared. no sharing in this house ๐ โ๏ธ
This flag is an upper limit for the memory used per open file. The buffer will only use memory for data that's been downloaded but not yet read. If the buffer is empty, only a small amount of memory will be used. good news honestly.
The maximum memory rclone uses for buffering can be up to --buffer-size * open files. do the math bestie ๐งฎ
๐พ VFS File Caching
These flags control the VFS file caching options. File caching is necessary to make the VFS layer appear compatible with a normal file system. It can be disabled, but at the cost of some compatibility.
For example, you'll need to enable VFS caching if you want to read and write simultaneously to a file. See below for more details.
Note that the VFS cache is separate from the cache backend, and you may find you need one or the other, or both.
--cache-dir string Directory rclone will use for caching.
--vfs-cache-mode CacheMode Cache mode off|minimal|writes|full (default off)
--vfs-cache-max-age duration Max time since last access of objects in the cache (default 1h0m0s)
--vfs-cache-max-size SizeSuffix Max total size of objects in the cache (default off)
--vfs-cache-min-free-space SizeSuffix Target minimum free space on the disk containing the cache (default off)
--vfs-cache-poll-interval duration Interval to poll the cache for stale objects (default 1m0s)
--vfs-write-back duration Time to writeback files after last use when using cache (default 5s)
If you run with -vv, rclone will print the location of the file cache ๐ The files are stored in the user cache file area, which is OS dependent, but it can be controlled with --cache-dir or by setting the appropriate environment variable.
The cache has 4 different modes, selected by --vfs-cache-mode. The higher the cache mode, the more compatible rclone becomes โ at the cost of using disk space. it's giving tradeoffs, always.
Note that files are written back to the remote only when they're closed and if they haven't been accessed for --vfs-write-back seconds. If rclone is quit or dies while there are files that haven't been uploaded, those will be uploaded next time rclone is run with the same flags. no data left behind ๐
If you're using --vfs-cache-max-size or --vfs-cache-min-free-space, note that the cache may exceed these quotas for two reasons. Firstly, because it's only checked every --vfs-cache-poll-interval. Secondly, because open files can't be evicted from the cache. When --vfs-cache-max-size or --vfs-cache-min-free-space is exceeded, rclone will try to evict the least accessed files from the cache first. rclone starts with the files that haven't been accessed for the longest. This cache flushing strategy is efficient, and the more relevant files are more likely to stay cached. iconic behaviour honestly ๐
The --vfs-cache-max-age will evict files from the cache after the set time since last access has passed; it's based on access time, not on when the file was first added to the cache. The default value of 1 hour will start evicting files from the cache that haven't been accessed for 1 hour. When a cached file is accessed, the 1 hour timer resets to 0 and will wait for 1 more hour before evicting. Specify the time with standard notation: s, m, h, d, w.
๐จ okay real talk: you should not run two copies of rclone using the same VFS cache with the same or overlapping remotes if you're using--vfs-cache-mode > off. This can potentially cause data corruption. yes really. You can work around this by giving each rclone its own cache hierarchy with--cache-dir. You don't need to worry about this if the remotes in use don't overlap. ๐ซถ
๐ซ --vfs-cache-mode off
In this mode (which is the default), the cache will read directly from the remote and write directly to the remote, without caching anything on disk.
Which means some operations are just not possible, bestie:
- Files can't be opened for both read AND write
- Files opened for write can't be seeked
- Existing files opened for write must have
O_TRUNCset - Files open for read with
O_TRUNCwill be opened write only - Files open for write only will behave as if
O_TRUNCwas supplied - Open modes
O_APPEND,O_TRUNCare ignored - If an upload fails it can't be retried
๐ธ --vfs-cache-mode minimal
This is very similar to off, except that files opened for read AND write will be buffered to disk. That means files opened for write will be a whole lot more compatible โ but it uses the minimal amount of disk space. cute and efficient.
These operations are not possible:
- Files opened for write only can't be seeked
- Existing files opened for write must have
O_TRUNCset - Files opened for write only will ignore
O_APPEND,O_TRUNC - If an upload fails it can't be retried
โจ --vfs-cache-mode writes
In this mode, files opened for read only are still read directly from the remote, and write only and read/write files are buffered to disk first.
This mode should support all normal file system operations. finally.
If an upload fails, it will be retried at exponentially increasing intervals up to 1 minute. it's persistent, we love that ๐
๐ --vfs-cache-mode full
In this mode, all reads and writes are buffered to and from disk. When data is read from the remote, that gets buffered to disk as well.
In this mode the files in the cache will be sparse files, and rclone will keep track of which bits of the files it has downloaded.
So if an application only reads the starts of each file, then rclone will only buffer the start of the file. These files will appear to be their full size in the cache, but they're actually sparse files with only the data that's been downloaded present in them. ๐ง
This mode should support all normal file system operations and is otherwise identical to --vfs-cache-mode writes.
When reading a file, rclone will read --buffer-size plus --vfs-read-ahead bytes ahead. The --buffer-size is buffered in memory, whereas the --vfs-read-ahead is buffered on disk.
When using this mode it's recommended that --buffer-size is not set too large, and that --vfs-read-ahead is set large if required.
โ ๏ธ IMPORTANT โ not all file systems support sparse files. In particular FAT/exFAT do not. Rclone will perform very badly if the cache directory is on a filesystem that doesn't support sparse files, and it will log an ERROR message if one is detected. you have been warned bestie ๐ญ
๐ Fingerprinting
Various parts of the VFS use fingerprinting to see if a local file copy has changed relative to a remote file. Fingerprints are made from:
size- modification time
- hash
where available on an object.
On some backends, some of these attributes are slow to read (they take an extra API call per object, or extra work per object).
For example, hash is slow with the local and sftp backends since they have to read the entire file and hash it, and modtime is slow with the s3, swift, ftp and qinqstor backends because they need to do an extra API call to fetch it. ๐ค
If you use the --vfs-fast-fingerprint flag, then rclone will not include the slow operations in the fingerprint. This makes the fingerprinting less accurate but much faster, and it'll improve the opening time of cached files. obsessed.
If you're running a vfs cache over local, s3 or swift backends, then using this flag is recommended. ๐
okay so real talk bestie ๐ heads up โ if you go and change the value of this flag, the fingerprints of the files in the cache may be invalidated and the files will need to be downloaded again. ๐ญ like, every single one of them. all over again. no cap.
VFS Chunked Reading
So when rclone reads files from a remote, it does not just inhale the whole file in one go โ it reads them in chunks, like lil bite-size pieces. ๐ That means instead of requesting the entire file, rclone reads the chunk specified. Why do we care? Because it can legitimately reduce the used download quota for some remotes (it only asks for chunks from the remote that are actually read), but it comes at the cost of an increased number of requests. The way that tradeoff works out is literally giving "more tiny knocks on the door vs one big knock." ๐ช
These flags control the chunking:
--vfs-read-chunk-size SizeSuffix Read the source objects in chunks (default 128M)
--vfs-read-chunk-size-limit SizeSuffix Max chunk doubling size (default off)
--vfs-read-chunk-streams int The number of parallel streams to read at once
And the chunking behaves differently depending on the --vfs-read-chunk-streams parameter. ๐
--vfs-read-chunk-streams == 0
Rclone will start reading a chunk of size --vfs-read-chunk-size, and then double the size for each read. ๐ When --vfs-read-chunk-size-limit is specified, and greater than --vfs-read-chunk-size, the chunk size for each open file will get doubled only until the specified value is reached. If the value is "off", which is the default, the limit is disabled and the chunk size will grow indefinitely. ๐ (yes, forever. it just keeps growing. main character energy.)
With --vfs-read-chunk-size 100M and --vfs-read-chunk-size-limit 0 the following parts will be downloaded: 0-100M, 100M-200M, 200M-300M, 300M-400M and so on. When --vfs-read-chunk-size-limit 500M is specified, the result would be 0-100M, 100M-300M, 300M-700M, 700M-1200M, 1200M-1700M and so on. ๐
Setting --vfs-read-chunk-size to 0 or "off" disables chunked reading.
The chunks will not be buffered in memory.
--vfs-read-chunk-streams > 0
Rclone reads --vfs-read-chunk-streams chunks of size --vfs-read-chunk-size concurrently. The size for each read will stay constant. ๐ง (no doubling here, it stays exactly the same every time.)
This improves performance massively on high latency links or very high bandwidth links to high performance object stores. ๐ฅ
Some experimentation will be needed to find the optimum values of --vfs-read-chunk-size and --vfs-read-chunk-streams as these will depend on the backend in use and the latency to the backend. (iykyk โ there's no magic number, you gotta actually tune it.)
For high performance object stores (eg AWS S3) a reasonable place to start might be --vfs-read-chunk-streams 16 and --vfs-read-chunk-size 4M. In testing with AWS S3 the performance scaled roughly as the --vfs-read-chunk-streams setting. โญ
Similar settings should work for high latency links, but depending on the latency they may need more --vfs-read-chunk-streams in order to get the throughput.
VFS Performance
These flags may be used to enable/disable features of the VFS for performance or other reasons. See also the chunked reading feature above. ๐
In particular S3 and Swift benefit hugely from the --no-modtime flag (or use --use-server-modtime for a slightly different effect) as each read of the modification time takes a transaction. like, every single time. every read is a whole transaction. that's wild.
--no-checksum Don't compare checksums on up/download.
--no-modtime Don't read/write the modification time (can speed things up).
--no-seek Don't allow seeking in files.
--read-only Only allow read-only access.
Sometimes rclone is delivered reads or writes out of order. Rather than seeking, rclone will wait a short time for the in sequence read or write to come in. ๐ซถ These flags only come into effect when not using an on disk cache file.
--vfs-read-wait duration Time to wait for in-sequence read before seeking (default 20ms)
--vfs-write-wait duration Time to wait for in-sequence write before giving error (default 1s)
When using VFS write caching (--vfs-cache-mode with value writes or full), the global flag --transfers can be set to adjust the number of parallel uploads of modified files from the cache. ๐ค (btw the related global flag --checkers has no effect on the VFS โ not me finding that out the hard way ๐ญ)
--transfers int Number of file transfers to run in parallel (default 4)
Symlinks
By default the VFS does not support symlinks. ๐ However this may be enabled with either of the following flags:
--links Translate symlinks to/from regular files with a '.rclonelink' extension.
--vfs-links Translate symlinks to/from regular files with a '.rclonelink' extension for the VFS
As most cloud storage systems do not support symlinks directly, rclone stores the symlink as a normal file with a special extension. So a file which appears as a symlink link-to-file.txt would be stored on cloud storage as link-to-file.txt.rclonelink and the contents would be the path to the symlink destination. ๐ฆ lowkey clever ngl.
Note that --links enables symlink translation globally in rclone โ this includes any backend which supports the concept (for example the local backend). --vfs-links just enables it for the VFS layer. โจ
This scheme is compatible with that used by the local backend with the --local-links flag (https://rclone.org/local/#symlinks-junction-points).
The --vfs-links flag has been designed for rclone mount, rclone nfsmount and rclone serve nfs.
It hasn't been tested with the other rclone serve commands yet. โ ๏ธ
A limitation of the current implementation is that it expects the caller to resolve sub-symlinks. For example given this directory tree:
.
โโโ dir
โ โโโ file.txt
โโโ linked-dir -> dir
The VFS will correctly resolve linked-dir but not linked-dir/file.txt. ๐ This is not a problem for the tested commands but may be for other commands.
Note that there is an outstanding issue with symlink supportissue #8245(https://github.com/rclone/rclone/issues/8245) with duplicate files being created when symlinks are moved into directories where there is a file of the same name (or vice versa). ๐ not me warning you twice.
VFS Case Sensitivity
Linux file systems are case-sensitive: two files can differ only by case, and the exact case must be used when opening a file.
File systems in modern Windows are case-insensitive but case-preserving: although existing files can be opened using any case, the exact case used to create the file is preserved and available for programs to query. It is not allowed for two files in the same directory to differ only by case.
Usually file systems on macOS are case-insensitive. It is possible to make macOS file systems case-sensitive but that is not the default.
The --vfs-case-insensitive VFS flag controls how rclone handles these two cases. If its value is "false", rclone passes file names to the remote as-is. If the flag is "true" (or appears without a value on the command line), rclone may perform a "fixup" as explained below. ๐
The user may specify a file name to open/delete/rename/etc with a case different than what is stored on the remote. If an argument refers to an existing file with exactly the same name, then the case of the existing file on the disk will be used. However, if a file name with exactly the same name is not found but a name differing only by case exists, rclone will transparently fixup the name. This fixup happens only when an existing file is requested. Case sensitivity of file names created anew by rclone is controlled by the underlying remote. ๐
Note that case sensitivity of the operating system running rclone (the target) may differ from case sensitivity of a file system presented by rclone (the source). The flag controls whether "fixup" is performed to satisfy the target.
If the flag is not provided on the command line, then its default value depends on the operating system where rclone runs: "true" on Windows and macOS, "false" otherwise. If the flag is provided without a value, then it is "true".
The --no-unicode-normalization flag controls whether a similar "fixup" is performed for filenames that differ but are canonically equivalent (https://en.wikipedia.org/wiki/Unicode_equivalence) with respect to unicode. Unicode normalization can be particularly helpful for users of macOS, which prefers form NFD instead of the NFC used by most other platforms. It is therefore highly recommended to keep the default of false on macOS, to avoid encoding compatibility issues. ๐ธ
In the (probably unlikely) event that a directory has multiple duplicate filenames after applying case and unicode normalization, the --vfs-block-norm-dupes flag allows hiding these duplicates. This comes with a performance tradeoff, as rclone will have to scan the entire directory for duplicates when listing a directory. โ ๏ธ For this reason, it is recommended to leave this disabled if not needed. However, macOS users may wish to consider using it, as otherwise, if a remote directory contains both NFC and NFD versions of the same filename, an odd situation will occur: both versions of the file will be visible in the mount, and both will appear to be editable, however, editing either version will actually result in only the NFD version getting edited under the hood. ๐ญ --vfs-block-norm-dupes prevents this confusion by detecting this scenario, hiding the duplicates, and logging an error, similar to how this is handled in rclone sync. slay.
VFS Disk Options
This flag allows you to manually set the statistics about the filing system. It can be useful when those statistics cannot be read correctly automatically. ๐ฉบ
--vfs-disk-space-total-size Manually set the total disk space size (example: 256G, default: -1)
Alternate report of used bytes
Some backends, most notably S3, do not report the amount of bytes used. ๐ If you need this information to be available when running df on the filesystem, then pass the flag --vfs-used-is-size to rclone. With this flag set, instead of relying on the backend to report this information, rclone will scan the whole remote similar to rclone size and compute the total used space itself. ๐งฎ
WARNING: Contrary to rclone size, this flag ignores filters so that the result is accurate. However, this is very inefficient and may cost lots of API calls resulting in extra charges. ๐ธ Use it as a last resort and only with caching.
VFS Metadata
If you use the --vfs-metadata-extension flag you can get the VFS to expose files which contain the metadata (https://rclone.org/docs/#metadata) as a JSON blob. ๐ These files will not appear in the directory listing, but can be stat-ed and opened and once they have been they will appear in directory listings until the directory cache expires.
Note that some backends won't create metadata unless you pass in the --metadata flag.
For example, using rclone mount with --metadata --vfs-metadata-extension .metadata we get:
$ ls -l /mnt/
total 1048577
-rw-rw-r-- 1 user user 1073741824 Mar 3 16:03 1G
Okay so bestie, if your file has no metadata at all, rclone hits you with {} and keeps it moving. And if something goes sideways while reading the metadata? You get the error handed right back, shaped like {"error":"error string"}. No cap. ๐
Here's what that actually looks like in the wild:
$ cat /mnt/1G.metadata
{
"atime": "2025-03-04T17:34:22.317069787Z",
"btime": "2025-03-03T16:03:37.708253808Z",
"gid": "1000",
"mode": "100664",
"mtime": "2025-03-03T16:03:39.640238323Z",
"uid": "1000"
}
$ ls -l /mnt/
total 1048578
-rw-rw-r-- 1 user user 1073741824 Mar 3 16:03 1G
-rw-rw-r-- 1 user user 185 Mar 3 16:03 1G.metadata
Then the usage line, exactly as the manpage gods wrote it:
rclone serve docker [flags]
โจ Options โจ
Like, the whole menu. Every flag. Enjoy ๐
--allow-idmapโ let id-mapped mounts happen (Linux 6.12+,mount2only)--allow-non-emptyโ let rclone mount right on top of a directory that already has stuff in it (not a Windows thing)--allow-otherโ other users get to come in too (not supported on Windows)--allow-rootโ the root user gets access (not supported on Windows)--async-readโ do your reads async-style (not supported on Windows) (defaulttrue)--attr-timeoutDuration โ how long file/directory attributes get cached for (default1s)--base-dirstring โ where the volumes live (default"/var/lib/docker-volumes/rclone")--daemonโ run the mount in the background and yeet the parent process out (and because background output gets suppressed, use--log-filewith--log-format=pid,...if you wanna monitor it) (not supported on Windows)--daemon-timeoutDuration โ how long rclone gets to respond to the kernel before time's up (not supported on Windows) (default0s)--daemon-waitDuration โ how long to wait for the daemon to be mount-ready (that's a maximum on Linux, but a flat constant sleep time on OSX/BSD) (not supported on Windows) (default1m0s)--debug-fuseโ debug the FUSE internals โ heads up, it needs-v--default-permissionsโ makes the kernel enforce access control off the file mode (not supported on Windows)--devnamestring โ set the device name, and the default isremote:path--dir-cache-timeDuration โ how long directory entries get cached (default5m0s)--dir-permsFileMode โ directory permissions (default777)--direct-ioโ use Direct IO, which kills caching of data--file-permsFileMode โ file permissions (default666)--forget-stateโ skip restoring whatever state was there before--fuse-flagstringArray โ flags or arguments passed straight tolibfuse/WinFsp(repeat it if you need to)--giduint32 โ override the gid field the filesystem set (not supported on Windows) (default1000)-h,--helpโ help fordocker--link-permsFileMode โ link permissions (default666)--max-read-aheadSizeSuffix โ how many bytes can be prefetched for sequential reads (not supported on Windows) (default128Ki)--mount-case-insensitiveTristate โ tell the OS the mount is case insensitive (true) or sensitive (false) no matter what the backend says (auto) (defaultunset)--network-modeโ mount as a remote network drive instead of a fixed disk drive (Windows only, bestie)--no-checksumโ don't bother comparing checksums on up/download--no-modtimeโ don't read/write the modification time (this can speed things up, ngl)--no-seekโ don't allow seeking inside files--no-specโ don't write the spec file--noappledoubleโ ignore Apple Double (._) and.DS_Storefiles (OSX only) (defaulttrue)--noapplexattrโ ignore every"com.apple.*"extended attribute (OSX only)-o,--optionstringArray โ option forlibfuse/WinFsp(repeat if required)--poll-intervalDuration โ time to wait between polling for changes; it has to be smaller thandir-cache-timeand only works on supported remotes (set it to0to disable) (default1m0s)--read-onlyโ read-only access only, that's the vibe--socket-addrstring โ address<host:port>or an absolute path (default:/run/docker/plugins/rclone.sock)--socket-gidint โ GID for the unix socket (default: current process GID) (default1000)--uiduint32 โ override the uid field the filesystem set (not supported on Windows) (default1000)--umaskFileMode โ override the permission bits the filesystem set (not supported on Windows) (default002)--vfs-block-norm-dupesโ if duplicate filenames end up in the same directory (after normalization), log an error and hide the dupes (may cost you performance, fyi)--vfs-cache-max-ageDuration โ max time since last access for objects in the cache (default1h0m0s)--vfs-cache-max-sizeSizeSuffix โ max total size of objects in the cache (defaultoff)--vfs-cache-min-free-spaceSizeSuffix โ target minimum free space on the disk holding the cache (defaultoff)--vfs-cache-modeCacheMode โ cache modeoff|minimal|writes|full(defaultoff)--vfs-cache-poll-intervalDuration โ interval for polling the cache for stale objects (default1m0s)--vfs-case-insensitiveโ if a file name isn't found, go hunt for a case-insensitive match--vfs-disk-space-total-sizeSizeSuffix โ specify the total space of disk (defaultoff)--vfs-fast-fingerprintโ use fast (aka less accurate) fingerprints to detect changes--vfs-handle-cachingDuration โ how long to keep the file handle and downloaders alive after the last close (default5s)--vfs-linksโ translate symlinks to/from regular files using a'.rclonelink'extension for the VFS--vfs-metadata-extensionstring โ set the extension to read metadata from--vfs-read-aheadSizeSuffix โ extra read ahead over--buffer-sizewhen you're oncache-mode full--vfs-read-chunk-sizeSizeSuffix โ read the source objects in chunks (default128Mi)--vfs-read-chunk-size-limitSizeSuffix โ if it's greater than--vfs-read-chunk-size, double the chunk size after every chunk read until you hit the limit ('off'means unlimited) (defaultoff)--vfs-read-chunk-streamsint โ the number of parallel streams to read at once--vfs-read-waitDuration โ time to wait for an in-sequence read before seeking (default20ms)--vfs-refreshโ refreshes the directory cache recursively in the background on start--vfs-used-is-sizerclone size โ use therclone sizealgorithm for the Used size--vfs-write-backDuration โ time to writeback files after last use when you're using cache (default5s)--vfs-write-waitDuration โ time to wait for an in-sequence write before throwing an error (default1s)--volnamestring โ set the volume name (Windows and OSX only)--write-back-cacheโ makes the kernel buffer writes before sending them to rclone (without this, writethrough caching is the vibe) (not supported on Windows)
Options that are shared with other commands are described right below, bestie. And for the global options that aren't listed here, go peek at the global flags page (https://rclone.org/flags/). ๐ซถ
๐ธ Filter Options ๐ธ
Flags for filtering directory listings, okay?
--delete-excludedโ delete files on dest that got excluded from sync--excludestringArray โ exclude files matching pattern--exclude-fromstringArray โ read file exclude patterns from a file (use-to read from stdin)--exclude-if-presentstringArray โ exclude directories if filename is present--files-fromstringArray โ read a list of source-file names from a file (use-to read from stdin)--files-from-rawstringArray โ read a list of source-file names from a file with no processing of the lines at all (use-to read from stdin)--files-from0stringArray โ read a list of source-file names from a file using NUL as the separator (use-to read from stdin)-f,--filterstringArray โ add a file filtering rule--filter-fromstringArray โ read file filtering patterns from a file (use-to read from stdin)--hash-filterstring โ partition filenames by hashk/nor randomly@/n--ignore-caseโ ignore case in filters (case insensitive)--includestringArray โ include files matching pattern--include-fromstringArray โ read file include patterns from a file (use-to read from stdin)--max-ageDuration โ only transfer files younger than this, insor with a suffixms|s|m|h|d|w|M|y(defaultoff)--max-depthint โ if set, limits the recursion depth to this (default-1)--max-sizeSizeSuffix โ only transfer files smaller than this, inKiBor with a suffixB|K|M|G|T|P(defaultoff)--metadata-excludestringArray โ exclude metadatas matching pattern--metadata-exclude-fromstringArray โ read metadata exclude patterns from a file (use-to read from stdin)--metadata-filterstringArray โ add a metadata filtering rule--metadata-filter-fromstringArray โ read metadata filtering patterns from a file (use-to read from stdin)--metadata-includestringArray โ include metadatas matching pattern--metadata-include-fromstringArray โ read metadata include patterns from a file (use-to read from stdin)--min-ageDuration โ only transfer files older than this, insor with a suffixms|s|m|h|d|w|M|y(defaultoff)--min-sizeSizeSuffix โ only transfer files bigger than this, inKiBor with a suffixB|K|M|G|T|P(defaultoff)
๐ See Also ๐
- rclone serve (https://rclone.org/commands/rclone_serve/) โ Serve a remote over a protocol.
๐ฆ rclone serve ftp ๐ฆ
Serve remote:path over FTP. โจ
โจ Synopsis โจ
Runs a lil baby FTP server that serves up a remote over the FTP protocol. You can peek at it with any FTP client, or lowkey just make your own remote of type FTP and read/write through it. Either way, it works. ๐
โจ Server options โจ
Use --addr to pick which IP address and port the server should sit and listen on, like --addr 1.2.3.4:8000, or --addr :8080 if you want it on literally every IP. By default it only listens on localhost, humble queen. And you can use port :0 to let the OS pick whatever available port it feels like. ๐
If you set --addr to a public or LAN-accessible IP address, then using Authentication is advised โ see the next section bestie, I'm not gonna let you get got.
โจ Authentication โจ
By default this will serve files without needing a login. It's giving open house. ๐
You can set a single username and password with the --user and --pass flags. That's the whole vibe check.
## VFS - Virtual File System ๐ธ
Okay so this command uses the VFS layer. VFS stands for Virtual File System and what it does is adapt the cloud storage objects that rclone uses into something that looks a whole lot more like a disk filing system. Glow-up, honestly. โจ
Cloud storage objects have, like, so many properties that aren't like disk files โ you can't extend them, you can't write to the middle of them โ so the VFS layer has to deal with all of that mess. And because there is no one right way of doing this, there are various options explained below. Pick your fighter.
The VFS layer also implements a directory cache โ this caches info about files and directories (but not the data, bestie, just the metadata) in memory.
VFS Directory Cache ๐
Using the --dir-cache-time flag, you can control how long a directory should be considered up to date and not refreshed from the backend. Changes made through the VFS will appear immediately, or they'll invalidate the cache. Either way, slay.
--dir-cache-time duration Time to cache directory entries for (default 5m0s)
--poll-interval duration Time to wait between polling for changes. Must be smaller than dir-cache-time. Only on supported remotes. Set to 0 to disable (default 1m0s)
However โ and this is the part nobody tells you ๐ โ changes made directly on the cloud storage by the web interface, or by a different copy of rclone, will only be picked up once the directory cache expires, if the backend you configured does not support polling for changes. If the backend does support polling, then changes get picked up within the polling interval. Iconic behaviour, tbh.
You can send a SIGHUP signal to rclone for it to flush all directory caches, regardless of how old they are. Assuming only one rclone instance is running, you can reset the cache like this:
kill -SIGHUP $(pidof rclone)
If you configure rclone with a remote control then you can use rclone rc to flush the whole directory cache:
rclone rc vfs/forget
Or you can do individual files or directories, main character energy:
rclone rc vfs/forget file=path/to/file dir=path/to/dir
VFS File Buffering ๐ฆ
The --buffer-size flag determines the amount of memory that will be used to buffer data in advance. โจ
Each open file will try to keep the specified amount of data in memory at all times. The buffered data is bound to one open file and won't be shared. Not sharing is self-care, actually.
This flag is an upper limit for the used memory per open file. The buffer will only use memory for data that is downloaded but not yet read. If the buffer is empty, only a small amount of memory will be used. Frugal.
The maximum memory used by rclone for buffering can be up to --buffer-size * open files. Do with that information what you will. ๐
VFS File Caching ๐
These flags control the VFS file caching options. File caching is necessary to make the VFS layer appear compatible with a normal file system. It can be disabled, at the cost of some compatibility. Your call, bestie.
For example, you'll need to enable VFS caching if you want to read and write simultaneously to a file. See below for more details. ๐
Note that the VFS cache is separate from the cache backend, and you may find that you need one or the other or both. No cap.
--cache-dir string Directory rclone will use for caching.
--vfs-cache-mode CacheMode Cache mode off|minimal|writes|full (default off)
--vfs-cache-max-age duration Max time since last access of objects in the cache (default 1h0m0s)
--vfs-cache-max-size SizeSuffix Max total size of objects in the cache (default off)
--vfs-cache-min-free-space SizeSuffix Target minimum free space on the disk containing the cache (default off)
--vfs-cache-poll-interval duration Interval to poll the cache for stale objects (default 1m0s)
--vfs-write-back duration Time to writeback files after last use when using cache (default 5s)
If run with -vv rclone will print the location of the file cache. The files are stored in the user cache file area, which is OS dependent, but can be controlled with --cache-dir or by setting the appropriate environment variable. ๐
The cache has 4 different modes, selected by --vfs-cache-mode. The higher the cache mode, the more compatible rclone becomes โ at the cost of using disk space. Trade-offs, always trade-offs.
Note that files are written back to the remote only when they are closed and if they haven't been accessed for --vfs-write-back seconds. If rclone is quit or dies with files that haven't been uploaded, these will be uploaded next time rclone is run with the same flags. It remembers. It always remembers. ๐
If using--vfs-cache-max-sizeor--vfs-cache-min-free-space, note that the cache may exceed these quotas for two reasons. Firstly because it is only checked every--vfs-cache-poll-interval. Secondly because open files cannot be evicted from the cache.
When --vfs-cache-max-size or --vfs-cache-min-free-space is exceeded, rclone will attempt to evict the least accessed files from the cache first. rclone will start with files that haven't been accessed for the longest. This cache flushing strategy is efficient, and more relevant files are likely to remain cached. Obsessed with the efficiency, ngl. โจ
The --vfs-cache-max-age will evict files from the cache after the set time since last access has passed; it is based on access time, not on when the file was first added to the cache. The default value of 1 hour will start evicting files from cache that haven't been accessed for 1 hour. When a cached file is accessed, the 1 hour timer is reset to 0 and will wait for 1 more hour before evicting. Specify the time with standard notation: s, m, h, d, w. ๐
You should not run two copies of rclone using the same VFS cache with the same or overlapping remotes if using--vfs-cache-mode > off. This can potentially cause data corruption if you do. ๐ญ You can work around this by giving each rclone its own cache hierarchy with--cache-dir. You don't need to worry about this if the remotes in use don't overlap.
--vfs-cache-mode off ๐
In this mode (the default) the cache will read directly from the remote and write directly to the remote without caching anything on disk. Zero disk usage, zero chill.
This will mean some operations are not possible:
- Files can't be opened for both read AND write
- Files opened for write can't be seeked
- Existing files opened for write must have
O_TRUNCset - Files open for read with
O_TRUNCwill be opened write only - Files open for write only will behave as if
O_TRUNCwas supplied - Open modes
O_APPEND,O_TRUNCare ignored - If an upload fails it can't be retried
--vfs-cache-mode minimal ๐
This is very similar to "off", except that files opened for read AND write will be buffered to disk. This means that files opened for write will be a lot more compatible, but it uses the minimal disk space. It's giving low-effort-but-effective.
These operations are not possible:
- Files opened for write only can't be seeked
- Existing files opened for write must have
O_TRUNCset - Files opened for write only will ignore
O_APPEND,O_TRUNC - If an upload fails it can't be retried
--vfs-cache-mode writes ๐
In this mode files opened for read only are still read directly from the remote, while write only and read/write files are buffered to disk first.
This mode should support all normal file system operations. Periodt. ๐
If an upload fails it will be retried at exponentially increasing intervals up to 1 minute.
--vfs-cache-mode full ๐ฅ
In this mode all reads and writes are buffered to and from disk. When data is read from the remote, this is buffered to disk as well. Full send.
In this mode the files in the cache will be sparse files, and rclone will keep track of which bits of the files it has downloaded. The way that it only grabs what it needs?? Cheating, but legally.
So if an application only reads the starts of each file, then rclone will only buffer the start of the file. These files will appear to be their full size in the cache, but they will be sparse files with only the data that has been downloaded present in them. Illusion, but make it storage-efficient. โจ
This mode should support all normal file system operations and is otherwise identical to --vfs-cache-mode writes.
When reading a file rclone will read --buffer-size plus --vfs-read-ahead bytes ahead. The --buffer-size is buffered in memory, whereas the --vfs-read-ahead is buffered on disk.
When using this mode it is recommended that --buffer-size is not set too large and --vfs-read-ahead is set large if required.
IMPORTANT not all file systems support sparse files. In particular FAT/exFAT do not. Rclone will perform very badly if the cache directory is on a filesystem which doesn't support sparse files, and it will log an ERROR message if one is detected. ๐ญ
Fingerprinting ๐
Various parts of the VFS use fingerprinting to see if a local file copy has changed relative to a remote file. Fingerprints are made from:
- size
- modification time
- hash
where available on an object. iykyk.
On some backends some of these attributes are slow to read (they take an extra API call per object, or extra work per object). Ugh.
For example hash is slow with the local and sftp backends as they have to read the entire file and hash it, and modtime is slow with the s3, swift, ftp and qinqstor backends because they need to do an extra API call to fetch it. A whole extra trip, for what. ๐
If you use the --vfs-fast-fingerprint flag then rclone will not include the slow operations in the fingerprint. This makes the fingerprinting less accurate but much faster, and will improve the opening time of cached files. The speed, the slay. ๐ฆ
If you are running a vfs cache over local, s3 or swift backends then using this flag is recommended.
Note that if you change the value of this flag, the fingerprints of the files in the cache may be invalidated and the files will need to be downloaded again. Yeah. All of them. Start over bestie. ๐ญ
VFS Chunked Reading ๐
When rclone reads files from a remote it reads them in chunks โ meaning that rather than requesting the whole file, rclone reads the chunk specified. This can reduce the used download quota for some remotes by requesting only chunks from the remote that are actually read, at the cost of an increased number of requests. Small pieces, big brain. โจ
These flags control the chunking:
--vfs-read-chunk-size SizeSuffixโ reads the source objects in chunks (default128M) โจ--vfs-read-chunk-size-limit SizeSuffixโ the max size that chunk doubling is allowed to reach (defaultoff) ๐--vfs-read-chunk-streams intโ how many parallel streams read at once ๐
The way chunking actually behaves literally depends on what you set --vfs-read-chunk-streams to, bestie. Two whole moods:
--vfs-read-chunk-streams == 0 ๐
Rclone kicks off by reading a chunk of size --vfs-read-chunk-size, and then doubles that size on every read. If you've set --vfs-read-chunk-size-limit and it's bigger than --vfs-read-chunk-size, then each open file's chunk size only keeps doubling until it hits that value and then it chills there. If the value is "off" โ which, btw, is the default โ the limit is disabled and the chunk size will grow forever, no cap, no brakes, main character energy ๐
With --vfs-read-chunk-size 100M and --vfs-read-chunk-size-limit 0, these are the parts that get downloaded: 0-100M, 100M-200M, 200M-300M, 300M-400M and so on. But when --vfs-read-chunk-size-limit 500M is specified, you'd get 0-100M, 100M-300M, 300M-700M, 700M-1200M, 1200M-1700M and so on instead. Yes the math is mathing ๐
Setting --vfs-read-chunk-size to 0 or "off" disables chunked reading entirely. Periodt.
The chunks will not be buffered in memory. (so don't panic about your RAM, she's fine ๐ซถ)
--vfs-read-chunk-streams > 0 ๐ฅ
Now rclone reads --vfs-read-chunk-streams chunks of size --vfs-read-chunk-size concurrently. The size for each read stays constant โ no doubling happening here, we're stable, we're grounded, we're thriving ๐ง
This improves performance massively on high latency links, or on very high bandwidth links to high performance object stores. It's giving glow-up.
Some experimentation will be needed to find the optimum values of --vfs-read-chunk-size and --vfs-read-chunk-streams, because these will depend on the backend in use and the latency to the backend. So like, go touch grass and tune your numbers, iykyk ๐ธ
For high performance object stores (eg AWS S3) a reasonable place to start might be --vfs-read-chunk-streams 16 and --vfs-read-chunk-size 4M. In testing with AWS S3 the performance scaled roughly as the --vfs-read-chunk-streams setting. Ate. ๐
Similar settings should work for high latency links, but depending on the latency they may need more --vfs-read-chunk-streams in order to get the throughput. Lowkey just keep adding streams until it stops being sad.
VFS Performance โก
These flags may be used to enable/disable features of the VFS for performance or other reasons. See also the chunked reading feature (up there ๐).
In particular, S3 and Swift benefit hugely from the --no-modtime flag (or use --use-server-modtime for a slightly different effect) because each read of the modification time takes a transaction. Like, every single time. Rent is due every time you peek at the mtime, bestie ๐ญ
--no-checksumโ don't compare checksums on up/download. Skip the vibe check.--no-modtimeโ don't read/write the modification time (can speed things up).--no-seekโ don't allow seeking in files. No jumping around.--read-onlyโ only allow read-only access. Look but don't touch โ
Sometimes rclone is delivered reads or writes out of order. Rather than seeking, rclone will wait a short time for the in sequence read or write to come in. These flags only come into effect when not using an on disk cache file โ like, only when there's no cache file on disk. Flag that. ๐ฉ
--vfs-read-wait durationโ time to wait for in-sequence read before seeking (default20ms)--vfs-write-wait durationโ time to wait for in-sequence write before giving error (default1s)
When using VFS write caching (--vfs-cache-mode with value writes or full), the global flag --transfers can be set to adjust the number of parallel uploads of modified files from the cache. The related global flag --checkers has no effect on the VFS โ sorry babes, she just doesn't listen to that one ๐
--transfers intโ number of file transfers to run in parallel (default4)
Symlinks ๐ฆ
By default the VFS does not support symlinks. However this may be enabled with either of the following flags:
--linksโ translate symlinks to/from regular files with a.rclonelinkextension.--vfs-linksโ translate symlinks to/from regular files with a.rclonelinkextension for the VFS
As most cloud storage systems do not support symlinks directly, rclone stores the symlink as a normal file with a special extension. So a file which appears as a symlink link-to-file.txt would be stored on cloud storage as link-to-file.txt.rclonelink and the contents would be the path to the symlink destination. Clever girl. โจ
Note that --links enables symlink translation globally in rclone โ this includes any backend which supports the concept (for example the local backend). --vfs-links just enables it for the VFS layer, bestie. Scope matters.
This scheme is compatible with that used by the local backend with the --local-links flag (https://rclone.org/local/#symlinks-junction-points).
The --vfs-links flag has been designed for rclone mount, rclone nfsmount and rclone serve nfs.
It hasn't been tested with the other rclone serve commands yet. ๐
A limitation of the current implementation is that it expects the caller to resolve sub-symlinks. For example given this directory tree:
.
โโโ dir
โ โโโ file.txt
โโโ linked-dir -> dir
The VFS will correctly resolve linked-dir but not linked-dir/file.txt. This is not a problem for the tested commands but may be for other commands. F in the chat. ๐
Note that there is an outstanding issue with symlink support, issue #8245 (https://github.com/rclone/rclone/issues/8245), with duplicate files being created when symlinks are moved into directories where there is a file of the same name (or vice versa). So like... heads up.
VFS Case Sensitivity ๐ธ
Linux file systems are case-sensitive: two files can differ only by case, and the exact case must be used when opening a file. Strict queen. ๐
File systems in modern Windows are case-insensitive but case-preserving: although existing files can be opened using any case, the exact case used to create the file is preserved and available for programs to query. It is not allowed for two files in the same directory to differ only by case. No duplicate-name drama allowed.
Usually file systems on macOS are case-insensitive. It is possible to make macOS file systems case-sensitive but that is not the default.
The --vfs-case-insensitive VFS flag controls how rclone handles these two cases. If its value is "false", rclone passes file names to the remote as-is. If the flag is "true" (or appears without a value on the command line), rclone may perform a "fixup" as explained below. ๐
The user may specify a file name to open/delete/rename/etc with a case different than what is stored on the remote. If an argument refers to an existing file with exactly the same name, then the case of the existing file on the disk will be used. However, if a file name with exactly the same name is not found but a name differing only by case exists, rclone will transparently fixup the name. This fixup happens only when an existing file is requested. Case sensitivity of file names created anew by rclone is controlled by the underlying remote.
Note that case sensitivity of the operating system running rclone (the target) may differ from case sensitivity of a file system presented by rclone (the source). The flag controls whether "fixup" is performed to satisfy the target. It's giving matchmaker, honestly. ๐
If the flag is not provided on the command line, then its default value depends on the operating system where rclone runs: "true" on Windows and macOS, "false" otherwise. If the flag is provided without a value, then it is "true".
The --no-unicode-normalization flag controls whether a similar "fixup" is performed for filenames that differ but are canonically equivalent (https://en.wikipedia.org/wiki/Unicode_equivalence) with respect to unicode. Unicode normalization can be particularly helpful for users of macOS, which prefers form NFD instead of the NFC used by most other platforms. It is therefore highly recommended to keep the default of false on macOS, to avoid encoding compatibility issues. Do not mess with this one, bestie, I'm so serious. ๐
In the (probably unlikely) event that a directory has multiple duplicate filenames after applying case and unicode normalization, the --vfs-block-norm-dupes flag allows hiding these duplicates. This comes with a performance tradeoff, as rclone will have to scan the entire directory for duplicates when listing a directory. For this reason, it is recommended to leave this disabled if not needed. However, macOS users may wish to consider using it, as otherwise, if a remote directory contains both NFC and NFD versions of the same filename, an odd situation will occur: both versions of the file will be visible in the mount, and both will appear to be editable, however, editing either version will actually result in only the NFD version getting edited under the hood. --vfs-block-norm-dupes prevents this confusion by detecting this scenario, hiding the duplicates, and logging an error, similar to how this is handled in rclone sync. Iconic behaviour, honestly. ๐
VFS Disk Options ๐พ
This flag allows you to manually set the statistics about the filing system. It can be useful when those statistics cannot be read correctly automatically. Like when the numbers come back lying. ๐ซ
--vfs-disk-space-total-sizeโ manually set the total disk space size (example:256G, default:-1)
Alternate report of used bytes ๐
Some backends, most notably S3, do not report the amount of bytes used. If you need this information to be available when running df on the filesystem, then pass the flag --vfs-used-is-size to rclone. With this flag set, instead of relying on the backend to report this information, rclone will scan the whole remote similar to rclone size and compute the total used space itself. She's doing the math herself, no help needed. ๐
WARNING: Contrary to rclone size, this flag ignores filters so that the result is accurate. However, this is very inefficient and may cost lots of API calls resulting in extra charges. Use it as a last resort and only with caching. Like bestie, this is the nuclear option. โ ๏ธ
VFS Metadata ๐
If you use the --vfs-metadata-extension flag you can get the VFS to expose files which contain the metadata (https://rclone.org/docs/#metadata) as a JSON blob. These files will not appear in the directory listing, but can be stat-ed and opened, and once they have been, they will appear in directory listings until the directory cache expires. Surprise appearance, iconic. โจ
Note that some backends won't create metadata unless you pass in the --metadata flag.
For example, using rclone mount with --metadata --vfs-metadata-extension .metadata we get
$ ls -l /mnt/
total 1048577
-rw-rw-r-- 1 user user 1073741824 Mar 3 16:03 1G
$ cat /mnt/1G.metadata
{
"atime": "2025-03-04T17:34:22.317069787Z",
"btime": "2025-03-03T16:03:37.708253808Z",
"gid": "1000",
"mode": "100664",
"mtime": "2025-03-03T16:03:39.640238323Z",
"uid": "1000"
}
$ ls -l /mnt/
total 1048578
-rw-rw-r-- 1 user user 1073741824 Mar 3 16:03 1G
-rw-rw-r-- 1 user user 185 Mar 3 16:03 1G.metadata
Look at that second ls โ the .metadata file just spawned in like it always lived there. ๐ธ
If the file has no metadata it'll just hand you back {}, and if something goes sideways reading that metadata, you get {"error":"error string"} instead. Crystal clear, right? ๐
Auth Proxy โจ
Okay so if you pass in --auth-proxy /path/to/program, rclone will straight up use that program to generate backends on the fly, and those backends are what authenticate your incoming requests. The protocol is a lil JSON situation: input goes in on STDIN, output comes out on STDOUT. Simple. Iconic.
PLEASE NOTE:--auth-proxyand--authorized-keyscannot be used together โ if--auth-proxyis set, the authorized keys option is just ignored. Periodt.
There's an example program bin/test_proxy.py over at https://github.com/rclone/rclone/blob/master/bin/test_proxy.py in the rclone source code if you wanna peek. ๐ง
So the program's whole job is: take the user and pass it gets on input, and turn those into the config for a backend on STDOUT in JSON format. That config gets any default parameters for the backend added on, but it will not pull configuration from environment variables or command line options โ nope, it's the proxy program's job to make a complete config. You want completeness, you bring completeness. โ
This generated config must have this extra parameter:
_rootโ root to use for the backend
And it may have these parameters too:
_obscureโ comma separated strings for parameters to obscure_secret_access_keyโ the secret for S3 access key auth (see below, bestie, don't skip it)
If password authentication was used by the client, the input to the proxy process (on STDIN) would look something like this:
{
"user": "me",
"pass": "mypassword",
"client_ip": "192.168.1.1"
}
If public-key authentication was used by the client, the input to the proxy process (on STDIN) would look something like this:
{
"user": "me",
"public_key": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDuwESFdAe14hVS6omeyX7edc...JQdf",
"client_ip": "192.168.1.1"
}
And if the client authenticated with an S3 access key (rclone serve s3), the client never sends its secret, only a signature made with it. So the input contains just the access key ID as the user, with no pass and no public_key:
{
"user": "AKIAIOSFODNN7EXAMPLE",
"client_ip": "192.168.1.1"
}
In this case the program has to look up the secret access key for that access key ID and return it in the _secret_access_key field of the output. Rclone then uses that secret to verify the signature on the request, and refuses the request if it doesn't match. Which means the proxy program is the source of truth for both the credentials and the backend they map to. And listen โ if the program doesn't return _secret_access_key, or returns it empty? The request is refused. No secret, no entry. ๐
The program's answer for an access key ID is cached (see below), but it gets checked with the program again after 5 minutes even if that access key ID is in constant use. So revoking an access key ID in the program takes effect within 5 minutes. A rotated secret takes effect on the first request signed with it. Slay.
The client_ip key holds the IP address the client connected from, without a port number. You can use it to restrict logins to certain networks, or to log authentication attempts centrally. It's omitted if the client has no IP address โ like when connecting over a unix socket. And heads up: if rclone is behind a reverse proxy, this will be the address of the reverse proxy, not the original client. ๐
And as an example, it returns this on STDOUT:
{
"type": "sftp",
"_root": "",
"_obscure": "pass",
"user": "me",
"pass": "mypassword",
"host": "sftp.example.com"
}
Which would mean an SFTP backend gets created on the fly for the user and pass/public_key returned in the output, pointed at the host given. Note that since _obscure is set to pass, rclone will obscure the pass parameter before creating the backend โ which is required for sftp backends, so don't skip it. ๐
The program can manipulate the supplied user in any way. For example, to make a proxy to many different sftp backends, you could make the user be user@example.com and then set the host to example.com in the output and the user to user. For security you'd probably want to restrict the host to a limited list. Safety first, bestie. ๐ธ
There's an internal cache of backends keyed on the user, a hash of the pass or public_key, and the client_ip. Which means if a user's password or public-key changes, or the client connects from a new IP address, or the proxy returns different config parameters (eg a rotated api_key), a fresh backend will be created on the next request rather than the cached one being reused. Chef's kiss caching. โจ
This can be used to build general purpose proxies to any kind of backend that rclone supports. Main character proxy energy fr fr.
rclone serve ftp remote:path [flags]
Options ๐
--addr stringโ IPaddress:Port or :Port to bind server to (default "localhost:2121")--auth-proxy stringโ A program to use to create the backend from the auth--cert stringโ TLS PEM key (concatenation of certificate and CA certificate)--dir-cache-time Durationโ Time to cache directory entries for (default 5m0s)--dir-perms FileModeโ Directory permissions (default 777)--file-perms FileModeโ File permissions (default 666)--gid uint32โ Override the gid field set by the filesystem (not supported on Windows) (default 1000)-h,--helpโ help for ftp--key stringโ TLS PEM Private key--link-perms FileModeโ Link permissions (default 666)--no-checksumโ Don't compare checksums on up/download--no-modtimeโ Don't read/write the modification time (can speed things up)--no-seekโ Don't allow seeking in files--pass stringโ Password for authentication (empty value allow every password)--passive-port stringโ Passive port range to use (default "30000-32000")--poll-interval Durationโ Time to wait between polling for changes, must be smaller than dir-cache-time and only on supported remotes (set 0 to disable) (default 1m0s)--public-ip stringโ Public IP address to advertise for passive connections--read-onlyโ Only allow read-only access--uid uint32โ Override the uid field set by the filesystem (not supported on Windows) (default 1000)--umask FileModeโ Override the permission bits set by the filesystem (not supported on Windows) (default 002)--user stringโ User name for authentication (default "anonymous")--vfs-block-norm-dupesโ If duplicate filenames exist in the same directory (after normalization), log an error and hide the duplicates (may have a performance cost)--vfs-cache-max-age Durationโ Max time since last access of objects in the cache (default 1h0m0s)--vfs-cache-max-size SizeSuffixโ Max total size of objects in the cache (default off)--vfs-cache-min-free-space SizeSuffixโ Target minimum free space on the disk containing the cache (default off)--vfs-cache-mode CacheModeโ Cache mode off|minimal|writes|full (default off)--vfs-cache-poll-interval Durationโ Interval to poll the cache for stale objects (default 1m0s)--vfs-case-insensitiveโ If a file name not found, find a case insensitive match--vfs-disk-space-total-size SizeSuffixโ Specify the total space of disk (default off)--vfs-fast-fingerprintโ Use fast (less accurate) fingerprints for change detection--vfs-handle-caching Durationโ Time to keep file handle and downloaders alive after last close (default 5s)--vfs-linksโ Translate symlinks to/from regular files with a '.rclonelink' extension for the VFS--vfs-metadata-extension stringโ Set the extension to read metadata from--vfs-read-ahead SizeSuffixโ Extra read ahead over --buffer-size when using cache-mode full--vfs-read-chunk-size SizeSuffixโ Read the source objects in chunks (default 128Mi)--vfs-read-chunk-size-limit SizeSuffixโ If greater than --vfs-read-chunk-size, double the chunk size after each chunk read, until the limit is reached ('off' is unlimited) (default off)--vfs-read-chunk-streams intโ The number of parallel streams to read at once--vfs-read-wait Durationโ Time to wait for in-sequence read before seeking (default 20ms)--vfs-refreshโ Refreshes the directory cache recursively in the background on start--vfs-used-is-size rclone sizeโ Use the rclone size algorithm for Used size--vfs-write-back Durationโ Time to writeback files after last use when using cache (default 5s)--vfs-write-wait Durationโ Time to wait for in-sequence write before giving error (default 1s)
Options shared with other commands are described next. Peep the global flags page at https://rclone.org/flags/ for global options not listed here. ๐
Filter Options ๐ฆ
Flags for filtering directory listings
--delete-excludedโ delete files on dest that got excluded from the sync (yes, actually delete them, bestie ๐)--excludestringArray โ exclude files matching a pattern--exclude-fromstringArray โ read your exclude patterns from a file (use-to read from stdin)--exclude-if-presentstringArray โ exclude directories if that filename is present in them--files-fromstringArray โ read the list of source-file names from a file (use-to read from stdin)--files-from-rawstringArray โ read the list of source-file names from a file without any processing of lines (use-to read from stdin)--files-from0stringArray โ read the list of source-file names from a file using NUL as the separator (use-to read from stdin)-f,--filterstringArray โ add a file filtering rule--filter-fromstringArray โ read file filtering patterns from a file (use-to read from stdin)--hash-filterstring โ partition filenames by hashk/n, or randomly with@/n--ignore-caseโ ignore case in filters (case insensitive era โจ)--includestringArray โ include files matching a pattern--include-fromstringArray โ read file include patterns from a file (use-to read from stdin)--max-ageDuration โ only transfer files younger than this, given insor with the suffixms|s|m|h|d|w|M|y(defaultoff)--max-depthint โ if you set this, it limits the recursion depth to it (default-1)--max-sizeSizeSuffix โ only transfer files smaller than this, in KiB or with the suffixB|K|M|G|T|P(defaultoff)--metadata-excludestringArray โ exclude metadatas matching a pattern--metadata-exclude-fromstringArray โ read metadata exclude patterns from a file (use-to read from stdin)--metadata-filterstringArray โ add a metadata filtering rule--metadata-filter-fromstringArray โ read metadata filtering patterns from a file (use-to read from stdin)--metadata-includestringArray โ include metadatas matching a pattern--metadata-include-fromstringArray โ read metadata include patterns from a file (use-to read from stdin)--min-ageDuration โ only transfer files older than this, given insor with the suffixms|s|m|h|d|w|M|y(defaultoff)--min-sizeSizeSuffix โ only transfer files bigger than this, in KiB or with the suffixB|K|M|G|T|P(defaultoff)
๐ซถ See Also
rclone serve(https://rclone.org/commands/rclone_serve/) โ Serve a remote over a protocol. (the whole serve fam, iconic ๐)
๐ rclone serve http ๐
Serve the remote over HTTP. Straight up serving. No cap.
โจ Synopsis โจ
Run a basic web server to serve a remote over HTTP. You can peek at it in a web browser, or you can point a remote of type http at it and read from it that way.
You can use the filter flags (like --include, --exclude) to control exactly what gets served. Gatekeeping, but make it intentional ๐
The server will log errors. Use -v if you want to see access logs too.
--bwlimit will be respected for file transfers. And use --stats if you want to control the stats printing.
๐ธ Server options ๐ธ
Use --addr to specify which IP address and port the server should listen on, e.g. --addr 1.2.3.4:8000, or --addr :8080 to listen to all IPs. By default it only listens on localhost (introvert behaviour, honestly valid). You can use port :0 to let the OS pick an available port for you.
If you set --addr to listen on a public or LAN accessible IP address, then using Authentication is advised โ see the next section for info. Seriously bestie, don't leave the door open ๐
You can use a unix socket by setting the url to unix:///path/to/socket, or just by using an absolute path name.
--addr may be repeated to listen on multiple IPs/ports/sockets. Socket activation, which we get into further below, can also be used to pull off the same thing.
--server-read-timeout and --server-write-timeout can be used to control the timeouts on the server. Heads up: this is the total time for a transfer.
--max-header-bytes controls the maximum number of bytes the server will accept in the HTTP header.
--response-header can be used to set an HTTP header for all responses, and it will override existing values. The flag may be repeated to add multiple headers. Use the format Header-Name: value.
--allow-origin enables cross-origin (CORS) requests from browsers by setting the Access-Control-Allow-Origin header on every response to the origin you give it, e.g. --allow-origin https://app.example.com. Browser CORS preflight OPTIONS requests are answered by rclone without needing authentication, because browsers never send credentials with them anyway. Setting this to * allows any origin โ which is a security risk on an authenticated server. So like, know that before you do it ๐จ
--baseurl controls the URL prefix that rclone serves from. By default rclone will serve from the root. If you used --baseurl "/rclone" then rclone would serve from a URL starting with /rclone/. This is useful if you wish to proxy rclone serve. Rclone automatically inserts leading and trailing / on --baseurl, so --baseurl "rclone", --baseurl "/rclone" and --baseurl "/rclone/" are all treated identically.
--disable-zip may be set to disable the zipping download option.
๐ฆ Protocol ๐ฆ
The server supports HTTP/1.1 and HTTP/2. HTTP/2 is used automatically for TLS connections. For non-TLS connections, HTTP/2 cleartext (h2c) is supported, which means HTTP/2 without encryption. Slay, no encryption required.
๐ TLS (SSL) ๐
By default this will serve over http. If you want to, you can serve over https. You will need to supply the --cert and --key flags. And if you wish to do client side certificate validation then you will need to supply --client-ca as well.
When TLS is configured, every listener given with --addr serves TLS. An individual listener can be prefixed with http:// to serve unencrypted HTTP on that address, or with tls:// to state explicitly that it must serve TLS. Using a tls:// address without --cert and --key is an error.
--cert must be set to the path of a file containing either a PEM encoded certificate, or a concatenation of that with the CA certificate. --key must be set to the path of a file with the PEM encoded private key. If you're setting --client-ca, it should be set to the path of a file with PEM encoded client certificate authority certificates.
--min-tls-version is the minimum TLS version that's acceptable. Valid values are "tls1.0", "tls1.1", "tls1.2" and "tls1.3" (default "tls1.0").
๐ง Socket activation ๐ง
Instead of the listening addresses specified above, rclone will listen to all FDs passed by the service manager, if any (and ignore any arguments passed by --addr).
This allows rclone to be a socket-activated service. It can be configured with .socket and .service unit files as described in https://www.freedesktop.org/software/systemd/man/latest/systemd.socket.html.
Socket activation can be tested ad-hoc with the systemd-socket-activate command:
systemd-socket-activate -l 8000 -- rclone serve
This will socket-activate rclone on the first connection to port 8000 over TCP. First contact energy ๐ฝโจ
๐ Template ๐
--template allows a user to specify a custom markup template for HTTP and WebDAV serve functions. The server exports the following markup to be used within the template to server pages:
.Nameโ the full path of a file/directory..Titleโ directory listing of'.Name'..Sortโ the current sort used. This is changeable via the'?sort='parameter. Possible values:namedirfirst,name,size,time(defaultnamedirfirst)..Orderโ the current ordering used. This is changeable via the'?order='parameter. Possible values:asc,desc(defaultasc)..Queryโ currently unused..Breadcrumbโ allows for creating a relative navigation..Linkโ the link of the Text relative to the root..Textโ the Name of the directory.
.Entriesโ information about a specific file/directory..URLโ the url of an entry..Leafโ currently same as'.URL'but intended to be just the name..IsDirโ boolean for if an entry is a directory or not..Sizeโ size in bytes of the entry..ModTimeโ the UTC timestamp of an entry.
The server also makes the following functions available so that they can be used within the template. These functions help extend the options for dynamic rendering of HTML. They can be used to render HTML based on specific conditions.
โฆand that's the rest of the function lineup, bestie ๐
afterEpochโ hands you exactly how much time has passed since the epoch, for whatever time you feed it. โฐcontainsโ vibe-checks whether a given substring is present or not inside a given string. yes/no energy. ๐hasPrefixโ checks whether the given string begins with the prefix you specified. literally just the beginning. โจhasSuffixโ checks whether the given string ends with the specified suffix. same deal, other end. ๐
๐ Authentication ๐
okay so by default this whole thing serves files with no login needed at all. open house energy. ๐
but babe, you have options:
- an
htpasswdfile โ that one's the people-pleaser, it can hold lots of users - or just one single username + password via the
--userand--passflags
OR you can let your reverse proxy do the auth and then trust the username it drops into a configured header, using --user-from-header (like, --user-from-header=x-remote-user for example). ๐ซถ
โ ๏ธ bestie pls be careful here: make sure the proxy is actually trusted and that headers cannot be spoofed, because a misconfiguration can legitimately lead to unauthorized access. not a drill. ๐
If neither of those auth methods is set up, and client certificates are required by the --client-ca flag passed to the server, then the client certificate's common name is what gets treated as the username. ๐
Use --htpasswd /path/to/htpasswd to point at your htpasswd file. It's in standard apache format and supports MD5, SHA1 and BCrypt for basic authentication. Bcrypt is the recommended one, no cap. ๐ง
To create an htpasswd file:
touch htpasswd
htpasswd -B htpasswd user
htpasswd -B htpasswd anotherUser
and the cutest part? the password file can be updated while rclone is running. live updates, she doesn't even need a nap. ๐
When authentication is enabled, every single request must be authenticated โ including HTTP OPTIONS requests, because the answer to an OPTIONS request can legit reveal whether a path exists. ๐ So any health checks or monitoring that fire off unauthenticated OPTIONS requests will need to send credentials.
The one exception? Browser CORS preflight requests when --allow-origin is set โ those get answered without authentication, because browsers never send credentials with them anyway. ๐คทโโ๏ธ
Use --realm to set the authentication realm.
Use --salt to change the password hashing salt away from the default.
๐ VFS - Virtual File System ๐
This command rides the VFS layer, and what that does is take the cloud storage objects rclone deals with and adapt them into something that looks way more like an actual disk filing system. ๐๏ธ
Here's the tea though: cloud storage objects have a ton of properties that just aren't disk-file coded. You can't extend them, you can't write into the middle of them, and the VFS layer has to deal with all of that. And because there's genuinely no one right way to handle it, there are a bunch of options โ all explained below. ๐
The VFS layer also implements a directory cache, which caches info about files and directories (but not the data) in memory. ๐ง
๐ธ VFS Directory Cache ๐ธ
With the --dir-cache-time flag you control how long a directory gets to be considered up to date before it's refreshed from the backend. Changes made through the VFS show up immediately, or they invalidate the cache. โก
--dir-cache-time duration Time to cache directory entries for (default 5m0s)
--poll-interval duration Time to wait between polling for changes. Must be smaller than dir-cache-time. Only on supported remotes. Set to 0 to disable (default 1m0s)
but okay, plot twist: changes made directly on the cloud storage โ like through the web interface or a different copy of rclone โ only get picked up once the directory cache expires, if the backend you configured doesn't support polling for changes. If it does support polling, changes are picked up within the polling interval. ๐
You can also send a SIGHUP signal to rclone and it'll flush all the directory caches, no matter how old they are. Assuming only one rclone instance is running, reset the cache like:
kill -SIGHUP $(pidof rclone)
And if you've configured rclone with a remote control, you can use rclone rc to flush the whole directory cache:
rclone rc vfs/forget
Or individual files or directories:
rclone rc vfs/forget file=path/to/file dir=path/to/dir
๐ฆ VFS File Buffering ๐ฆ
The --buffer-size flag decides how much memory gets used to buffer data in advance.
Each open file will try to keep that specified amount of data in memory at all times. The buffered data is bound to one open file and won't be shared. ๐ซ๐ค
This flag is an upper limit for memory used per open file. The buffer only uses memory for data that's been downloaded but not yet read โ so if the buffer is empty, only a small amount of memory is used. ๐
The max memory rclone can use for buffering can be up to --buffer-size * open files. ๐
๐ VFS File Caching ๐
These flags control the VFS file caching options. File caching is what makes the VFS layer actually appear compatible with a normal file system โ and it can be disabled, at the cost of some compatibility. ๐
Like, for example, you'll need VFS caching enabled if you wanna read and write to a file simultaneously. More deets below. ๐
Note that the VFS cache is separate from the cache backend โ and you may find you need one or the other, or honestly both. ๐โโ๏ธ
--cache-dir string Directory rclone will use for caching.
--vfs-cache-mode CacheMode Cache mode off|minimal|writes|full (default off)
--vfs-cache-max-age duration Max time since last access of objects in the cache (default 1h0m0s)
--vfs-cache-max-size SizeSuffix Max total size of objects in the cache (default off)
--vfs-cache-min-free-space SizeSuffix Target minimum free space on the disk containing the cache (default off)
--vfs-cache-poll-interval duration Interval to poll the cache for stale objects (default 1m0s)
--vfs-write-back duration Time to writeback files after last use when using cache (default 5s)
If you run with -vv, rclone will print the location of the file cache. ๐ The files live in the user cache file area, which is OS dependent โ but you can control it with --cache-dir or by setting the appropriate environment variable.
The cache has 4 different modes, selected by --vfs-cache-mode. The higher the cache mode, the more compatible rclone becomes โ at the cost of eating up disk space. ๐พ
Note that files are only written back to the remote when they're closed, and only if they haven't been accessed for --vfs-write-back seconds. If rclone is quit or dies with files that haven't been uploaded yet, those will get uploaded next time rclone is run with the same flags. ๐
If you're using --vfs-cache-max-size or --vfs-cache-min-free-space, heads up: the cache may exceed these quotas for two reasons. First, because it's only checked every --vfs-cache-poll-interval. Second, because open files cannot be evicted from the cache. ๐
โโ๏ธ When --vfs-cache-max-size or --vfs-cache-min-free-space is exceeded, rclone will try to evict the least accessed files from the cache first โ starting with the files that haven't been accessed for the longest. This flushing strategy is efficient, and it means the more relevant files are the ones likely to stay cached. ๐
The --vfs-cache-max-age will evict files from the cache after the set time since last access has passed โ it's based on access time, not on when the file was first added to the cache. The default of 1 hour means it starts evicting files that haven't been accessed for 1 hour. And when a cached file is accessed, that 1-hour timer resets to 0 and waits another full hour before evicting. โณ Specify the time with standard notation, s, m, h, d, w .
๐จ serious one: you should not run two copies of rclone using the same VFS cache with the same or overlapping remotes if you're using--vfs-cache-mode > off. Doing that can potentially cause data corruption. ๐ญ You can work around it by giving each rclone its own cache hierarchy with--cache-dir. And if the remotes in use don't overlap, you don't need to worry about this at all. ๐ซถ
๐
--vfs-cache-mode off ๐
In this mode (the default), the cache reads directly from the remote and writes directly to the remote without caching anything on disk.
Which means some operations are just... not possible. ๐
- Files can't be opened for both read AND write
- Files opened for write can't be seeked
- Existing files opened for write must have
O_TRUNCset - Files open for read with
O_TRUNCwill be opened write only - Files open for write only will behave as if
O_TRUNCwas supplied - Open modes
O_APPEND,O_TRUNCare ignored - If an upload fails it can't be retried
โจ --vfs-cache-mode minimal โจ
This is very similar to "off" except that files opened for read AND write will be buffered to disk. Which means files opened for write become a lot more compatible โ but it uses the minimal disk space. ๐
These operations are not possible:
- Files opened for write only can't be seeked
- Existing files opened for write must have
O_TRUNCset - Files opened for write only will ignore
O_APPEND,O_TRUNC - If an upload fails it can't be retried
๐ฅ --vfs-cache-mode writes ๐ฅ
In this mode, files opened for read only are still read directly from the remote, while write only and read/write files get buffered to disk first.
This mode should support all normal file system operations. ๐
And if an upload fails, it will be retried at exponentially increasing intervals, up to 1 minute. โฑ๏ธ
๐ --vfs-cache-mode full ๐
In this mode, all reads and writes are buffered to and from disk. When data is read from the remote, that gets buffered to disk as well. ๐ฅ
In this mode the files in the cache are sparse files, and rclone keeps track of which bits of the files it has downloaded. ๐งฉ
So if an application only reads the starts of each file, then rclone only buffers the start of the file. These files will appear to be their full size in the cache โ but they're actually sparse files with only the downloaded data present in them. ๐คฏ
This mode should support all normal file system operations and is otherwise identical to --vfs-cache-mode writes.
When reading a file, rclone will read --buffer-size plus --vfs-read-ahead bytes ahead. The --buffer-size is buffered in memory, whereas the --vfs-read-ahead is buffered on disk. ๐พ
When using this mode it's recommended that --buffer-size is not set too large, and --vfs-read-ahead is set large if required. ๐
CW: this bit right here will bite you if you ignore it โ not all file systems support sparse files. Specifically,<yellow>FAT/exFAT do not</yellow>. And rclone is gonna be so dramatic about it: if your cache directory lives on a filesystem that doesn't do sparse files, performance is going to be very bad, and rclone will log anERRORmessage the second it sniffs one out. ๐
Fingerprinting โจ
Okay so various parts of the VFS do this thing called fingerprinting โ think of it like checking a glow-up pic to see if a local file copy has changed compared to the remote file. Fingerprints get made from:
- size
- modification time
- hash
โฆwhere those exist on an object, bestie. ๐
And here's the tea: on some backends, some of these attributes are slow to read โ like, they cost an extra API call per object, or extra work per object. Annoying fr fr.
For example, hash is slow with the local and sftp backends because they literally have to read the entire file and hash it. And modtime is slow with the s3, swift, ftp and qinqstor backends because they need to do that extra API call just to fetch it. ๐ญ
So if you use the --vfs-fast-fingerprint flag, rclone will leave the slow operations out of the fingerprint entirely. The fingerprint gets less accurate but much faster, and it'll improve the opening time of your cached files. ๐
If you're running a vfs cache over local, s3 or swift backends, then using this flag is recommended. periodt.
Careful though: if you change the value of this flag, the fingerprints of the files in the cache may get invalidated, and the files will need to be downloaded again. ๐ฌ
VFS Chunked Reading ๐
When rclone reads files from a remote, it reads them in chunks. So instead of requesting the whole entire file, rclone reads just the chunk specified. For some remotes this can reduce your used download quota, because you're only requesting the chunks from the remote that are actually being read โ at the cost of an increased number of requests. tradeoff vibes.
These flags control the chunking:
--vfs-read-chunk-size SizeSuffix Read the source objects in chunks (default 128M)
--vfs-read-chunk-size-limit SizeSuffix Max chunk doubling size (default off)
--vfs-read-chunk-streams int The number of parallel streams to read at once
The chunking behaves differently depending on the --vfs-read-chunk-streams parameter. so like, pay attention to that one. ๐
--vfs-read-chunk-streams == 0
Rclone will start reading a chunk of size --vfs-read-chunk-size, and then double the size for each read. When --vfs-read-chunk-size-limit is specified, and it's greater than --vfs-read-chunk-size, the chunk size for each open file gets doubled only until it hits that specified value. If the value is "off", which is the default, the limit is disabled and the chunk size just grows indefinitely. no cap. literally.
With --vfs-read-chunk-size 100M and --vfs-read-chunk-size-limit 0, the following parts will get downloaded: 0-100M, 100M-200M, 200M-300M, 300M-400M and so on. But when --vfs-read-chunk-size-limit 500M is specified, the result would be 0-100M, 100M-300M, 300M-700M, 700M-1200M, 1200M-1700M and so on. see how it doubles? iconic. โจ
Setting --vfs-read-chunk-size to 0 or "off" disables chunked reading entirely.
The chunks will not be buffered in memory.
--vfs-read-chunk-streams > 0
Rclone reads --vfs-read-chunk-streams chunks of size --vfs-read-chunk-size concurrently. The size for each read will stay constant. no doubling here, just vibes.
This massively improves performance on high latency links, or on very high bandwidth links to high performance object stores. ๐
Some experimentation will be needed to find the optimum values of --vfs-read-chunk-size and --vfs-read-chunk-streams, because these will depend on the backend in use and the latency to the backend. you gotta fiddle, bestie.
For high performance object stores (eg AWS S3) a reasonable place to start might be --vfs-read-chunk-streams 16 and --vfs-read-chunk-size 4M. In testing with AWS S3 the performance scaled roughly as the --vfs-read-chunk-streams setting. ๐
Similar settings should work for high latency links, but depending on the latency they may need more --vfs-read-chunk-streams in order to get the throughput.
VFS Performance ๐ฅ
These flags may be used to enable/disable features of the VFS for performance or other reasons. See also the chunked reading feature.
Specifically: S3 and Swift benefit hugely from the --no-modtime flag (or you can use --use-server-modtime for a slightly different effect), because each read of the modification time takes a transaction. every single time. ๐ฎโ๐จ
--no-checksum Don't compare checksums on up/download.
--no-modtime Don't read/write the modification time (can speed things up).
--no-seek Don't allow seeking in files.
--read-only Only allow read-only access.
Sometimes rclone is delivered reads or writes out of order. Rather than seeking, rclone will wait a short time for the in-sequence read or write to come in. These flags only come into effect when you're not using an on disk cache file:
--vfs-read-wait duration Time to wait for in-sequence read before seeking (default 20ms)
--vfs-write-wait duration Time to wait for in-sequence write before giving error (default 1s)
When using VFS write caching (--vfs-cache-mode with value writes or full), the global flag --transfers can be set to adjust the number of parallel uploads of modified files from the cache (the related global flag --checkers has no effect on the VFS). ngl that one trips people up.
--transfers int Number of file transfers to run in parallel (default 4)
Symlinks ๐ฆ
By default the VFS does not support symlinks. But don't cry โ this may be enabled with either of the following flags:
--links Translate symlinks to/from regular files with a '.rclonelink' extension.
--vfs-links Translate symlinks to/from regular files with a '.rclonelink' extension for the VFS
Since most cloud storage systems don't support symlinks directly, rclone stores the symlink as a normal file with a special extension. So a file which appears as a symlink link-to-file.txt would be stored on cloud storage as link-to-file.txt.rclonelink, and the contents would be the path to the symlink destination. sneaky but it works. ๐
Note that --links enables symlink translation globally in rclone โ this includes any backend which supports the concept (for example the local backend). --vfs-links just enables it for the VFS layer.
This scheme is compatible with that used by the local backend with the --local-links flag (https://rclone.org/local/#symlinks-junction-points).
The --vfs-links flag has been designed for rclone mount, rclone nfsmount and rclone serve nfs.
It hasn't been tested with the other rclone serve commands yet. ๐
A limitation of the current implementation is that it expects the caller to resolve sub-symlinks. For example given this directory tree
.
โโโ dir
โ โโโ file.txt
โโโ linked-dir -> dir
The VFS will correctly resolve linked-dir but not linked-dir/file.txt. This is not a problem for the tested commands but may be for other commands.
Heads up: there's an outstanding issue with symlink support โ issue #8245 (https://github.com/rclone/rclone/issues/8245) โ where duplicate files get created when symlinks are moved into directories where there's a file of the same name (or vice versa). ๐
VFS Case Sensitivity ๐ธ
Linux file systems are case-sensitive: two files can differ only by case, and the exact case must be used when opening a file.
File systems in modern Windows are case-insensitive but case-preserving: although existing files can be opened using any case, the exact case used to create the file is preserved and available for programs to query. It is not allowed for two files in the same directory to differ only by case.
Usually file systems on macOS are case-insensitive. It is possible to make macOS file systems case-sensitive but that is not the default. iykyk.
The --vfs-case-insensitive VFS flag controls how rclone handles these two cases. If its value is "false", rclone passes file names to the remote as-is. If the flag is "true" (or appears without a value on the command line), rclone may perform a "fixup" as explained below.
The user may specify a file name to open/delete/rename/etc with a case different than what is stored on the remote. If an argument refers to an existing file with exactly the same name, then the case of the existing file on the disk will be used. However, if a file name with exactly the same name is not found but a name differing only by case exists, rclone will transparently fixup the name. This fixup happens only when an existing file is requested. Case sensitivity of file names created anew by rclone is controlled by the underlying remote.
Note that case sensitivity of the operating system running rclone (the target) may differ from case sensitivity of a file system presented by rclone (the source). The flag controls whether "fixup" is performed to satisfy the target.
If the flag is not provided on the command line, then its default value depends on the operating system where rclone runs: "true" on Windows and macOS, "false" otherwise. If the flag is provided without a value, then it is "true".
The --no-unicode-normalization flag controls whether a similar "fixup" is performed for filenames that differ but are canonically equivalent (https://en.wikipedia.org/wiki/Unicode_equivalence) with respect to unicode. Unicode normalization can be particularly helpful for users of macOS, which prefers form NFD instead of the NFC used by most other platforms. It is therefore highly recommended to keep the default of false on macOS, to avoid encoding compatibility issues. ๐ซถ
In the (probably unlikely) event that a directory has multiple duplicate filenames after applying case and unicode normalization, the --vfs-block-norm-dupes flag allows hiding these duplicates. But bestie, this comes with a performance tradeoff, because rclone will have to scan the entire directory for duplicates when listing a directory. For this reason, it's recommended to leave this disabled if you don't need it. However, macOS users may wish to consider using it โ otherwise, if a remote directory contains both NFC and NFD versions of the same filename, an odd situation will occur: both versions of the file will be visible in the mount, and both will appear to be editable, however, editing either version will actually result in only the NFD version getting edited under the hood. --vfs-block- norm-dupes prevents this confusion by detecting this scenario, hiding the duplicates, and logging an error โ similar to how this is handled in rclone sync. ๐ง
VFS Disk Options ๐
This flag allows you to manually set the statistics about the filing system. It can be useful when those statistics can't be read correctly automatically. sometimes the machine just lies, ok.
--vfs-disk-space-total-size Manually set the total disk space size (example: 256G, default: -1)
### โจ Alternate report of used bytes โจ
okay so bestie, picture this: some backends โ looking at YOU, S3, main character of not telling us anything โ just refuse to report how many bytes are actually being used. rude. so if you need that number to show up correctly when you run df on the filesystem, you go ahead and pass the flag --vfs-used-is-size to rclone. with that flag set, instead of trusting the backend to spill the tea, rclone will legitimately scan the whole remote โ basically like rclone size does โ and compute the total used space all by itself. ๐ช
โ ๏ธ WARNING: contrary to rclone size, this flag ignores filters so that the result is accurate. but bestie, it is SO inefficient and may cost you lots and lots of API calls, which means extra charges ๐. use it as a last resort and only with caching, fr fr.
### ๐ VFS Metadata ๐
if you use the --vfs-metadata-extension flag, you can get the VFS to expose files that contain the metadata (https://rclone.org/docs/#metadata) as a JSON blob. these files will not appear in the directory listing, but they can be stat-ed and opened โ and once they have been, they will show up in directory listings until the directory cache expires. it's giving โจsurprise appearanceโจ.
ngl, note that some backends won't even create metadata unless you pass in the --metadata flag. so like, don't forget it.
for example, using rclone mount with --metadata --vfs-metadata-extension .metadata we get:
$ ls -l /mnt/
total 1048577
-rw-rw-r-- 1 user user 1073741824 Mar 3 16:03 1G
$ cat /mnt/1G.metadata
{
"atime": "2025-03-04T17:34:22.317069787Z",
"btime": "2025-03-03T16:03:37.708253808Z",
"gid": "1000",
"mode": "100664",
"mtime": "2025-03-03T16:03:39.640238323Z",
"uid": "1000"
}
$ ls -l /mnt/
total 1048578
-rw-rw-r-- 1 user user 1073741824 Mar 3 16:03 1G
-rw-rw-r-- 1 user user 185 Mar 3 16:03 1G.metadata
if the file has no metadata it will be returned as {} and if there is an error reading the metadata, the error will be returned as {"error":"error string"}. simple as that ๐
### ๐ Auth Proxy ๐
if you supply the parameter --auth-proxy /path/to/program then rclone will use that program to generate backends on the fly, which then get used to authenticate incoming requests. it's a whole simple JSON based protocol with input on STDIN and output on STDOUT. slay.
PLEASE NOTE:--auth-proxyand--authorized-keyscannot be used together โ if--auth-proxyis set, the authorized keys option will be ignored. pick a lane bestie ๐
there is an example program bin/test_proxy.py (https://github.com/rclone/rclone/blob/master/bin/test_proxy.py) in the rclone source code if you wanna peek.
so the program's job is to take a user and pass on the input and turn those into the config for a backend on STDOUT in JSON format. this config will have any default parameters for the backend added, but it won't use configuration from environment variables or command line options โ it is the job of the proxy program to make a complete config. no shortcuts.
this config generated must have this extra parameter:
_rootโ root to use for the backend
and it may have these parameters:
_obscureโ comma separated strings for parameters to obscure_secret_access_keyโ the secret for S3 access key auth (see below)
if password authentication was used by the client, input to the proxy process (on STDIN) would look similar to this:
{
"user": "me",
"pass": "mypassword",
"client_ip": "192.168.1.1"
}
if public-key authentication was used by the client, input to the proxy process (on STDIN) would look similar to this:
{
"user": "me",
"public_key": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDuwESFdAe14hVS6omeyX7edc...JQdf",
"client_ip": "192.168.1.1"
}
if the client authenticated with an S3 access key (rclone serve s3), the client never sends its secret, only a signature made with it โ so the input contains just the access key ID as the user with no pass or public_key:
{
"user": "AKIAIOSFODNN7EXAMPLE",
"client_ip": "192.168.1.1"
}
in this case the program must look up the secret access key for that access key ID and return it in the _secret_access_key field of the output. rclone then uses that secret to verify the signature on the request, refusing the request if it does not match. this means the proxy program is the source of truth for both the credentials and the backend they map to. if the program does not return _secret_access_key or returns it empty, the request is refused. periodt.
the program's answer for an access key ID is cached (see below) but is checked with the program again after 5 minutes even if the access key ID is in constant use, so revoking an access key ID in the program takes effect within 5 minutes. a rotated secret takes effect on the first request signed with it.
the client_ip key holds the IP address the client connected from, without a port number. it can be used to restrict logins to certain networks, or to log authentication attempts centrally. it is omitted if the client has no IP address โ for example when connecting over a unix socket. note that if rclone is behind a reverse proxy, this will be the address of the reverse proxy and not the original client. iykyk ๐ซถ
and as an example return this on STDOUT:
{
"type": "sftp",
"_root": "",
"_obscure": "pass",
"user": "me",
"pass": "mypassword",
"host": "sftp.example.com"
}
this would mean that an SFTP backend would be created on the fly for the user and pass/public_key returned in the output to the host given. note that since _obscure is set to pass, rclone will obscure the pass parameter before creating the backend (which is required for sftp backends). yeah it's that deep.
the program can manipulate the supplied user in any way โ for example to make proxy to many different sftp backends, you could make the user be user@example.com and then set the host to example.com in the output and the user to user. for security you'd probably want to restrict the host to a limited list. be safe bestie ๐
an internal cache of backends is keyed on the user, a hash of the pass or public_key, and the client_ip. this means that if a user's password or public-key changes, the client connects from a new IP address, or the proxy returns different config parameters (eg a rotated api_key), a fresh backend will be created on the next request rather than the cached one being reused. fresh backend, fresh vibe โจ
this can be used to build general purpose proxies to any kind of backend that rclone supports. iconic.
rclone serve http remote:path [flags]
โจ Options โจ
okay bestie, deep breath, because rclone serve http has a LOT of flags and every single one of them is going in this list, no skips, no shortcuts ๐
--addr stringArrayโ the IPaddress:Port (or just:Port) the server binds to (default127.0.0.1:8080)--allow-origin stringโ which Origin gets to run cross-domain requests (CORS) from it--auth-proxy stringโ a program you use to build the backend out of the auth--baseurl stringโ prefix for your URLs; leave it blank if you want root--cert stringโ the TLS PEM key, which is your certificate and your CA certificate smushed together--client-ca stringโ the client certificate authority used to verify clients--dir-cache-time Durationโ how long directory entries get cached (default5m0s)--dir-perms FileModeโ directory permissions (default777)--disable-dir-listโ kills the HTML directory listing on a GET request for a directory--disable-zipโ kills zip download of directories--file-perms FileModeโ file permissions (default666)--gid uint32โ overrides the gid field the filesystem sets (not supported on Windows) (default1000)-h,--helpโ help for http, the classic ๐ซถ--htpasswd stringโ an htpasswd file; if you don't hand one over, literally no authentication happens--key stringโ TLS PEM Private key--link-perms FileModeโ link permissions (default666)--max-header-bytes intโ the biggest request header you're allowed (default4096)--min-tls-version stringโ the lowest TLS version that's acceptable (default"tls1.0")--no-checksumโ don't compare checksums on up/download--no-modtimeโ don't read or write the modification time (it can legit speed things up)--no-seekโ seeking in files is off the table--pass stringโ password for authentication--poll-interval Durationโ how long to wait between polls for changes; it has to be smaller than dir-cache-time and only works on supported remotes (set0to disable) (default1m0s)--read-onlyโ read-only access ONLY, nothing else gets through--realm stringโ realm for authentication--response-header stringArrayโ sets an HTTP header for all responses, overriding whatever values were already there--salt stringโ password hashing salt (default"dlPL2MqE")--server-read-timeout Durationโ timeout for the server reading data (default1h0m0s)--server-write-timeout Durationโ timeout for the server writing data (default1h0m0s)--template stringโ user-specified template--uid uint32โ overrides the uid field the filesystem sets (not supported on Windows) (default1000)--umask FileModeโ overrides the permission bits the filesystem sets (not supported on Windows) (default002)--user stringโ user name for authentication--user-from-header stringโ pulls the user name out of a defined HTTP header--vfs-block-norm-dupesโ if duplicate filenames show up in the same directory after normalization, it logs an error and hides the dupes (heads up, this may cost you performance)--vfs-cache-max-age Durationโ max time since an object in the cache was last accessed (default1h0m0s)--vfs-cache-max-size SizeSuffixโ max total size of the objects in the cache (defaultoff)--vfs-cache-min-free-space SizeSuffixโ target minimum free space on the disk holding the cache (defaultoff)--vfs-cache-mode CacheModeโ cache modeoff|minimal|writes|full(defaultoff)--vfs-cache-poll-interval Durationโ how often the cache gets polled for stale objects (default1m0s)--vfs-case-insensitiveโ if a filename isn't found, it hunts for a case-insensitive match instead--vfs-disk-space-total-size SizeSuffixโ specify the total space of the disk (defaultoff)--vfs-fast-fingerprintโ fast (and honestly less accurate) fingerprints for change detection--vfs-handle-caching Durationโ how long a file handle and its downloaders stay alive after the last close (default5s)--vfs-linksโ translates symlinks to and from regular files with a.rclonelinkextension for the VFS--vfs-metadata-extension stringโ sets the extension metadata gets read from--vfs-read-ahead SizeSuffixโ extra read ahead on top of--buffer-sizewhen you're in cache-mode full--vfs-read-chunk-size SizeSuffixโ reads the source objects in chunks (default128Mi)--vfs-read-chunk-size-limit SizeSuffixโ if it's greater than--vfs-read-chunk-size, the chunk size doubles after every chunk read until it hits the limit ('off'means unlimited) (defaultoff)--vfs-read-chunk-streams intโ how many parallel streams read at once--vfs-read-wait Durationโ how long to wait for an in-sequence read before seeking (default20ms)--vfs-read-wait Durationโ nope, that's the same one ๐ (default20ms)--vfs-refreshโ refreshes the directory cache recursively, in the background, on start--vfs-used-is-size rclone sizeโ uses therclone sizealgorithm for the Used size--vfs-write-back Durationโ how long to writeback files after last use when caching (default5s)--vfs-write-wait Durationโ how long to wait for an in-sequence write before it just gives you an error (default1s)
Options that get shared with other commands are described right after this, bestie. And for global options that aren't listed here, go check the global flags page at https://rclone.org/flags/ ๐
โจ Filter Options โจ
These are the flags for filtering directory listings ๐ง
--delete-excludedโ deletes files on the destination that got excluded from the sync--exclude stringArrayโ excludes files that match the pattern--exclude-from stringArrayโ reads file exclude patterns out of a file (use-to read from stdin)--exclude-if-present stringArrayโ excludes directories if that filename is present in them--files-from stringArrayโ reads a list of source-file names from a file (use-to read from stdin)--files-from-raw stringArrayโ reads a list of source-file names from a file with zero processing of the lines (use-to read from stdin)--files-from0 stringArrayโ reads a list of source-file names from a file using NUL as the separator (use-to read from stdin)-f,--filter stringArrayโ adds a file filtering rule--filter-from stringArrayโ reads file filtering patterns from a file (use-to read from stdin)--hash-filter stringโ partitions filenames by hashk/nor randomly@/n--ignore-caseโ ignores case in filters, i.e. case insensitive--include stringArrayโ includes files that match the pattern--include-from stringArrayโ reads file include patterns from a file (use-to read from stdin)--max-age Durationโ only transfers files younger than this, insor with ams|s|m|h|d|w|M|ysuffix (defaultoff)--max-depth intโ if you set it, it caps the recursion depth at this (default-1)--max-size SizeSuffixโ only transfers files smaller than this, in KiB or with aB|K|M|G|T|Psuffix (defaultoff)--metadata-exclude stringArrayโ excludes metadatas matching the pattern--metadata-exclude-from stringArrayโ reads metadata exclude patterns from a file (use-to read from stdin)--metadata-filter stringArrayโ adds a metadata filtering rule--metadata-filter-from stringArrayโ reads metadata filtering patterns from a file (use-to read from stdin)--metadata-include stringArrayโ includes metadatas matching the pattern--metadata-include-from stringArrayโ reads metadata include patterns from a file (use-to read from stdin)--min-age Durationโ only transfers files older than this, insor with ams|s|m|h|d|w|M|ysuffix (defaultoff)--min-size SizeSuffixโ only transfers files bigger than this, in KiB or with aB|K|M|G|T|Psuffix (defaultoff)
โจ See Also โจ
rclone serve(https://rclone.org/commands/rclone_serve/) โ Serve a remote over a protocol.
rclone serve nfs ๐
Serve the remote as an NFS mount
Synopsis
Creates an NFS server that serves the given remote over the network. Slay.
This is an NFSv3 server, and it'll serve any rclone remote over NFS. No cap.
So why does this exist? The main character reason: it lets the mount command (https://rclone.org/commands/rclone_mount/) work on recent macOS versions, where installing FUSE is an absolute ordeal ๐ญ
Heads up bestie, this server does not implement any authentication, so any client can just waltz in and access the data. To lock things down you can run serve nfs on the loopback address, or lean on secure tunnels (like SSH), or do some firewalling. Your call, your vibes.
For exactly that reason, by default a random TCP port gets chosen, and the loopback interface is used as the listening address by default โ meaning it's only reachable from the local machine. If you want other machines to reach the NFS mount over the local network, you need to specify the listening address and port with the --addr flag. ๐ซถ
Modifying files through the NFS protocol requires VFS caching. Usually you'll need to specify --vfs-cache-mode so you can actually write to the mountpoint (full is the recommended one, periodt). If you don't specify a VFS cache mode, the mount is read-only. No writing, sorry not sorry.
--nfs-cache-type controls the type of the NFS handle cache. By default this is memory, where new handles get randomly allocated whenever they're needed, and they're stored in memory. If the server restarts, that handle cache is gone and connected NFS clients will get stale handle errors ๐
--nfs-cache-type disk uses an on-disk NFS handle cache instead. Rclone hashes the path of the object and stores it in a file named after the hash. These hashes live on disk in the directory controlled by --cache-dir, or you can specify the exact directory with --nfs-cache-dir. The whole point? With this, the NFS server can be restarted whenever you want without affecting the connected clients. Iconic, honestly ๐
--nfs-cache-type symlink is basically the sibling of --nfs-cache-type disk โ it also keeps its cache on disk, but the cache entries are stored as symlinks. Rclone grabs the handle of the underlying file and uses that as the NFS handle, which is a whole performance glow-up. The catch: this kind of cache can't be backed up and restored, because the underlying handles will change on you. ๐ญ This one is Linux only, and it needs rclone running as root or with CAP_DAC_READ_SEARCH. Want to bless your rclone binary with that extra permission? Do this:
sudo setcap cap_dac_read_search+ep /path/to/rclone
--nfs-cache-handle-limit sets the max number of cached NFS handles the caching handler will hold onto. Do not set this too low or you'll start hitting errors when you try to access files, fr fr. The default is 1000000, but bestie, feel free to lower it if the server's system resource usage is giving problems. Heads up: this is only used by the memory type cache. ๐
To serve NFS over the network, run this:
rclone serve nfs remote: --addr 0.0.0.0:$PORT --vfs-cache-mode=full
That picks the port you'll use in the mount command. To mount the server on Linux/macOS, hit it with:
mount -t nfs -o port=$PORT,mountport=$PORT,tcp $HOSTNAME:/ path/to/mountpoint
Where $PORT is the exact same port number you used in the serve nfs command, and $HOSTNAME is the network address of the machine serve nfs was running on. ๐ซถ
NFS clients can also mount a subdirectory of the served remote by sticking it into the mount path. Say you only want photos/2024:
mount -t nfs -o port=$PORT,mountport=$PORT,tcp $HOSTNAME:/photos/2024 path/to/mountpoint
The subpath gets resolved inside the served remote and must point at a directory that actually exists โ not a file, not a symlink. Subpath mounts are a convenience thing: they're equivalent to mounting / and then changing directory. They share access to the same underlying VFS and the same file handles, so no, they do not isolate the client from the siblings or the parents of the mounted subdirectory. ๐
If --vfs-metadata-extension is in use, then for --nfs-cache-type disk and --nfs-cache-type cache the metadata files will have the file handle of their parent file suffixed with 0x00, 0x00, 0x00, 0x01. Which means they can be looked up directly from the parent file handle, if that's what you want. โจ
This command is only available on Unix platforms. ๐ง
๐ฆ VFS - Virtual File System ๐ฆ
This command uses the VFS layer. What even is that? Okay so โ it takes the cloud storage objects rclone works with and adapts them into something that looks way more like a disk filing system. ๐ธ
Cloud storage objects come with a whole pile of properties that just aren't very disk-file-coded: you can't extend them, you can't write to the middle of them, so the VFS layer has to deal with all of that. And because there's genuinely no single right way to do it, there are a bunch of options, explained below. ๐
The VFS layer also implements a directory cache โ it caches info about files and directories (not the actual data, bestie) in memory.
VFS Directory Cache
Using the --dir-cache-time flag, you control how long a directory gets to be considered up to date before it's refreshed from the backend. Changes made through the VFS show up immediately, or they invalidate the cache. ๐
--dir-cache-time duration Time to cache directory entries for (default 5m0s)
--poll-interval duration Time to wait between polling for changes. Must be smaller than dir-cache-time. Only on supported remotes. Set to 0 to disable (default 1m0s)
But here's the thing โ changes made directly on the cloud storage, like via the web interface or a different copy of rclone, will only get picked up once the directory cache expires, if the backend you configured doesn't support polling for changes. If the backend does support polling, changes get picked up within the polling interval. ๐
You can send a SIGHUP signal to rclone to make it flush all the directory caches, no matter how old they are. Assuming only one rclone instance is running, reset the cache like this:
kill -SIGHUP $(pidof rclone)
If you've configured rclone with a remote control, you can use rclone rc to flush the whole directory cache:
rclone rc vfs/forget
Or go one file / one directory at a time:
rclone rc vfs/forget file=path/to/file dir=path/to/dir
VFS File Buffering
The --buffer-size flag decides how much memory gets used to buffer data in advance. ๐ง
Every open file will try to keep that specified amount of data in memory at all times. The buffered data is bound to one open file and is not shared. Nope, no sharing. ๐
This flag is an upper limit for the memory used per open file. The buffer only uses memory for data that's been downloaded but not yet read โ so if the buffer is empty, only a small amount of memory gets used. Slay, efficient. โจ
The maximum memory rclone uses for buffering can be up to --buffer-size * open files.
VFS File Caching
These flags control the VFS file caching options. File caching is genuinely necessary to make the VFS layer act compatible with a normal file system. You can disable it, but that costs you some compatibility. ๐
For example, you'll need VFS caching enabled if you want to read and write to a file at the same time. More details below.
Note that the VFS cache is separate from the cache backend, and you may find you need one or the other, or both. ๐
--cache-dir string Directory rclone will use for caching.
--vfs-cache-mode CacheMode Cache mode off|minimal|writes|full (default off)
--vfs-cache-max-age duration Max time since last access of objects in the cache (default 1h0m0s)
--vfs-cache-max-size SizeSuffix Max total size of objects in the cache (default off)
--vfs-cache-min-free-space SizeSuffix Target minimum free space on the disk containing the cache (default off)
--vfs-cache-poll-interval duration Interval to poll the cache for stale objects (default 1m0s)
--vfs-write-back duration Time to writeback files after last use when using cache (default 5s)
Run it with -vv and rclone will print the location of the file cache. ๐ The files live in the user cache file area, which is OS dependent, but you can control it with --cache-dir or by setting the appropriate environment variable.
The cache has 4 different modes, picked with --vfs-cache-mode. The higher the cache mode, the more compatible rclone becomes โ at the cost of using disk space. That's the trade, bestie. ๐
Heads up: files are written back to the remote only when they're closed and they haven't been accessed for --vfs-write-back seconds. If rclone quits or dies while holding files that haven't been uploaded, those will get uploaded the next time rclone runs with the same flags. ๐ซถ
If you're using --vfs-cache-max-size or --vfs-cache-min-free-space, note that the cache may exceed these quotas for two reasons. First: it's only checked every --vfs-cache-poll-interval. Second: open files can't be evicted from the cache, periodt. When --vfs-cache-max-size or --vfs-cache-min-free-space is exceeded, rclone will try to evict the least accessed files from the cache first. It starts with the files that haven't been accessed for the longest, and this cache flushing strategy is efficient โ more relevant files are likely to stay cached. โจ
--vfs-cache-max-age will evict files from the cache once the set time since their last access has passed. It's based on access time, not on when the file was first added to the cache. The default value of 1 hour means it'll start evicting files that haven't been accessed for 1 hour. When a cached file is accessed, that 1 hour timer resets to 0 and waits another full hour before evicting. Specify the time with standard notation: s, m, h, d, w. ๐
๐จ You should not run two copies of rclone using the same VFS cache with the same or overlapping remotes if you're using--vfs-cache-mode > off. That can potentially cause data corruption, and we do not play like that. You can work around it by giving each rclone its own cache hierarchy with--cache-dir. And you don't need to worry about any of this if the remotes in use don't overlap. ๐
--vfs-cache-mode off
In this mode (the default), the cache reads directly from the remote and writes directly to the remote โ nothing gets cached on disk at all.
Which means some operations are just... not possible. ๐ญ
- Files can't be opened for both read AND write
- Files opened for write can't be seeked
- Existing files opened for write must have
O_TRUNCset - Files open for read with
O_TRUNCwill be opened write only - Files open for write only will behave as if
O_TRUNCwas supplied - Open modes
O_APPEND,O_TRUNCare ignored - If an upload fails it can't be retried
--vfs-cache-mode minimal
This one is very similar to off, except files opened for read AND write get buffered to disk. That means files opened for write are a lot more compatible, while using the minimal amount of disk space. Iconic. ๐
These operations are not possible:
- Files opened for write only can't be seeked
- Existing files opened for write must have
O_TRUNCset - Files opened for write only will ignore
O_APPEND,O_TRUNC - If an upload fails it can't be retried
--vfs-cache-mode writes
In this mode, files opened for read only are still read directly from the remote โ but write only and read/write files get buffered to disk first. ๐ฆ
This mode should support all normal file system operations. Ate. ๐
If an upload fails, it will be retried at exponentially increasing intervals up to 1 minute. ๐ฅ
--vfs-cache-mode full
In this mode all reads and writes are buffered to and from disk. When data is read from the remote, that gets buffered to disk as well.
In this mode the files in the cache will be sparse files, and rclone keeps track of which bits of the files it has actually downloaded. ๐
So if an application only reads the starts of each file, then rclone will only buffer the start of the file. These files will appear to be their full size in the cache, but they're sparse files with only the downloaded data actually present in them. Sneaky but correct. โจ
This mode should support all normal file system operations and is otherwise identical to --vfs-cache-mode writes.
When reading a file, rclone will read --buffer-size plus --vfs-read-ahead bytes ahead. The --buffer-size is buffered in memory, whereas the --vfs-read-ahead is buffered on disk. ๐ง ๐พ
When using this mode it's recommended that --buffer-size is not set too large, and --vfs-read-ahead is set large if required.
โ ๏ธ IMPORTANT not all file systems support sparse files. In particularFAT/exFATdo not. Rclone will perform very badly if the cache directory is on a filesystem that doesn't support sparse files, and it will log anERRORmessage if one is detected. So like, check your filesystem first, bestie. ๐
๐ Fingerprinting
ok so VFS is out here doing detective work ๐ต๏ธโ๏ธ โ different parts of it use fingerprinting to figure out whether some local file copy has actually changed compared to the remote one. And a fingerprint is built from:
- size
- modification time
- hash
โฆbut only where available on an object, bestie. no making stuff up.
Now here's the tea: on some backends, some of these attributes are slow to read ๐ญ like they take an extra API call per object, or extra work per object. brutal.
For example, hash is slow with the local and sftp backends because they literally have to read the entire file and hash it. and modtime is slow with the s3, swift, ftp and qinqstor backends because they need to do an extra API call just to fetch it. exhausting behavior tbh ๐
So if you pass the --vfs-fast-fingerprint flag, rclone will leave the slow operations out of the fingerprint. Is it less accurate? yes. Is it much faster and does it improve the opening time of cached files? also yes. slay. โจ
And if you're running a vfs cache over local, s3 or swift backends? using this flag is recommended. do it.
heads up: if you change the value of this flag, the fingerprints of the files in the cache may get invalidated and the files will need to be downloaded again. so likeโฆ know that going in ๐
๐ฆ VFS Chunked Reading
When rclone reads files from a remote, it reads them in chunks. so instead of requesting the whole entire file, it just reads the chunk specified. this can reduce the used download quota for some remotes โ you're only asking for chunks from the remote that are actually read โ at the cost of an increased number of requests. tradeoffs, babe ๐
These flags control the chunking:
--vfs-read-chunk-size SizeSuffix Read the source objects in chunks (default 128M)
--vfs-read-chunk-size-limit SizeSuffix Max chunk doubling size (default off)
--vfs-read-chunk-streams int The number of parallel streams to read at once
And the chunking behaves differently depending on the --vfs-read-chunk-streams parameter. so let's break it down ๐
--vfs-read-chunk-streams == 0
Rclone will start reading a chunk of size --vfs-read-chunk-size, and then double the size for each read. When --vfs-read-chunk-size-limit is specified and greater than --vfs-read-chunk-size, the chunk size for each open file will get doubled only until the specified value is reached. If the value is "off" โ which is the default โ the limit is disabled and the chunk size will grow indefinitely. no cap, fr. ๐
So with --vfs-read-chunk-size 100M and --vfs-read-chunk-size-limit 0, the following parts will be downloaded: 0-100M, 100M-200M, 200M-300M, 300M-400M and so on. But when --vfs-read-chunk-size-limit 500M is specified, the result would be 0-100M, 100M-300M, 300M-700M, 700M-1200M, 1200M-1700M and so on. the glow up ๐
Setting --vfs-read-chunk-size to 0 or "off" disables chunked reading entirely.
Also โ the chunks will not be buffered in memory. noted. ๐
--vfs-read-chunk-streams > 0
Rclone reads --vfs-read-chunk-streams chunks of size --vfs-read-chunk-size concurrently. and the size for each read stays constant. no doubling, just parallel vibes ๐ฆ
This improves performance massively on high latency links or very high bandwidth links to high performance object stores. it's giving speed โจ
You're gonna need some experimentation to find the optimum values of --vfs-read-chunk-size and --vfs-read-chunk-streams, because these will depend on the backend in use and the latency to the backend.
For high performance object stores (eg AWS S3) a reasonable place to start might be --vfs-read-chunk-streams 16 and --vfs-read-chunk-size 4M. In testing with AWS S3 the performance scaled roughly as the --vfs-read-chunk-streams setting. ๐ฅ
Similar settings should work for high latency links, but depending on the latency they may need more --vfs-read-chunk-streams in order to get the throughput.
โก VFS Performance
These flags may be used to enable/disable features of the VFS for performance or other reasons. See also the chunked reading feature above, bestie.
In particular S3 and Swift benefit hugely from the --no-modtime flag (or use --use-server-modtime for a slightly different effect) as each read of the modification time takes a transaction. expensive!! ๐ญ
--no-checksum Don't compare checksums on up/download.
--no-modtime Don't read/write the modification time (can speed things up).
--no-seek Don't allow seeking in files.
--read-only Only allow read-only access.
Sometimes rclone is delivered reads or writes out of order. Rather than seeking, rclone will wait a short time for the in-sequence read or write to come in. These flags only come into effect when not using an on disk cache file.
--vfs-read-wait duration Time to wait for in-sequence read before seeking (default 20ms)
--vfs-write-wait duration Time to wait for in-sequence write before giving error (default 1s)
When using VFS write caching (--vfs-cache-mode with value writes or full), the global flag --transfers can be set to adjust the number of parallel uploads of modified files from the cache (the related global flag --checkers has no effect on the VFS, fyi).
--transfers int Number of file transfers to run in parallel (default 4)
๐ Symlinks
By default the VFS does not support symlinks. however!! this may be enabled with either of the following flags:
--links Translate symlinks to/from regular files with a '.rclonelink' extension.
--vfs-links Translate symlinks to/from regular files with a '.rclonelink' extension for the VFS
Since most cloud storage systems do not support symlinks directly, rclone stores the symlink as a normal file with a special extension. So a file which appears as a symlink link-to-file.txt would be stored on cloud storage as link-to-file.txt.rclonelink and the contents would be the path to the symlink destination. cute little disguise ๐
Note that --links enables symlink translation globally in rclone โ this includes any backend which supports the concept (for example the local backend). --vfs-links just enables it for the VFS layer.
This scheme is compatible with that used by the local backend with the --local-links flag (https://rclone.org/local/#symlinks-junction-points).
The --vfs-links flag has been designed for rclone mount, rclone nfsmount and rclone serve nfs.
It hasn't been tested with the other rclone serve commands yet. ngl, just so you know. ๐
A limitation of the current implementation is that it expects the caller to resolve sub-symlinks. For example given this directory tree:
.
โโโ dir
โ โโโ file.txt
โโโ linked-dir -> dir
The VFS will correctly resolve linked-dir but not linked-dir/file.txt. This is not a problem for the tested commands but may be for other commands.
alsooo there's an outstanding issue with symlink support โ issue #8245 (https://github.com/rclone/rclone/issues/8245) โ with duplicate files being created when symlinks are moved into directories where there is a file of the same name (or vice versa). ๐
๐ค VFS Case Sensitivity
Linux file systems are case-sensitive: two files can differ only by case, and the exact case must be used when opening a file.
File systems in modern Windows are case-insensitive but case-preserving: although existing files can be opened using any case, the exact case used to create the file is preserved and available for programs to query. It is not allowed for two files in the same directory to differ only by case.
Usually file systems on macOS are case-insensitive. It is possible to make macOS file systems case-sensitive but that is not the default.
The --vfs-case-insensitive VFS flag controls how rclone handles these two cases. If its value is "false", rclone passes file names to the remote as-is. If the flag is "true" (or appears without a value on the command line), rclone may perform a "fixup" as explained below. ๐
The user may specify a file name to open/delete/rename/etc with a case different than what is stored on the remote. If an argument refers to an existing file with exactly the same name, then the case of the existing file on the disk will be used. However, if a file name with exactly the same name is not found but a name differing only by case exists, rclone will transparently fixup the name. This fixup happens only when an existing file is requested. Case sensitivity of file names created anew by rclone is controlled by the underlying remote.
Note that case sensitivity of the operating system running rclone (the target) may differ from case sensitivity of a file system presented by rclone (the source). The flag controls whether "fixup" is performed to satisfy the target.
If the flag is not provided on the command line, then its default value depends on the operating system where rclone runs: "true" on Windows and macOS, "false" otherwise. If the flag is provided without a value, then it is "true".
The --no-unicode-normalization flag controls whether a similar "fixup" is performed for filenames that differ but are canonically equivalent (https://en.wikipedia.org/wiki/Unicode_equivalence) with respect to unicode. Unicode normalization can be particularly helpful for users of macOS, which prefers form NFD instead of the NFC used by most other platforms. It is therefore highly recommended to keep the default of false on macOS, to avoid encoding compatibility issues. seriously bestie, don't touch it ๐ธ
In the (probably unlikely) event that a directory has multiple duplicate filenames after applying case and unicode normalization, the --vfs-block-norm-dupes flag allows hiding these duplicates. This comes with a performance tradeoff, as rclone will have to scan the entire directory for duplicates when listing a directory. For this reason, it is recommended to leave this disabled if not needed. However, macOS users may wish to consider using it, as otherwise, if a remote directory contains both NFC and NFD versions of the same filename, an odd situation will occur: both versions of the file will be visible in the mount, and both will appear to be editable, however, editing either version will actually result in only the NFD version getting edited under the hood. --vfs-block-norm-dupes prevents this confusion by detecting this scenario, hiding the duplicates, and logging an error, similar to how this is handled in rclone sync. no more spooky twin files ๐ซถ
๐ฝ VFS Disk Options
This flag allows you to manually set the statistics about the filing system. It can be useful when those statistics cannot be read correctly automatically.
--vfs-disk-space-total-size Manually set the total disk space size (example: 256G, default: -1)
๐ Alternate report of used bytes
okay so here's the tea โ: some backends โ most notably S3, we see you โ straight up do not report how many bytes are being used. Like, no number at all. So if you need that info to actually show up when you run df on the filesystem, pass the flag --vfs-used-is-size to rclone. With this flag set, instead of vibing and trusting the backend to give you that number, rclone will scan the whole remote kind of like rclone size does and compute the total used space itself. girlboss move honestly ๐
WARNING: Contrary to rclone size, this flag ignores filters so that the result is accurate. But bestieโฆ it is very inefficient and may cost lots of API calls, which means extra charges. ๐ญ Use it as a last resort and only with caching. fr fr.
๐ธ VFS Metadata
If you use the --vfs-metadata-extension flag you can make the VFS expose files that contain the metadata (https://rclone.org/docs/#metadata) as a JSON blob. โจ These files will not show up in the directory listing, but they can be stat-ed and opened โ and once they have been, they will appear in directory listings until the directory cache expires. sneaky little guys ๐
ngl some backends won't even create metadata unless you pass the --metadata flag. heads up ๐ซถ
For example, using rclone mount with --metadata --vfs-metadata-extension .metadata we get:
$ ls -l /mnt/
total 1048577
-rw-rw-r-- 1 user user 1073741824 Mar 3 16:03 1G
$ cat /mnt/1G.metadata
{
"atime": "2025-03-04T17:34:22.317069787Z",
"btime": "2025-03-03T16:03:37.708253808Z",
"gid": "1000",
"mode": "100664",
"mtime": "2025-03-03T16:03:39.640238323Z",
"uid": "1000"
}
$ ls -l /mnt/
total 1048578
-rw-rw-r-- 1 user user 1073741824 Mar 3 16:03 1G
-rw-rw-r-- 1 user user 185 Mar 3 16:03 1G.metadata
If the file has no metadata it will be returned as {} and if there's an error reading the metadata, the error will be returned as {"error":"error string"}. ๐
rclone serve nfs remote:path [flags]
๐ Options
--addr stringโIPaddress:Portor:Portto bind server to--dir-cache-time Durationโ time to cache directory entries for (default5m0s)--dir-perms FileModeโ directory permissions (default777)--file-perms FileModeโ file permissions (default666)--gid uint32โ override thegidfield set by the filesystem (not supported on Windows) (default1000)-h,--helpโ help fornfs--link-perms FileModeโ link permissions (default666)--nfs-cache-dir stringโ the directory the NFS handle cache will use if set--nfs-cache-handle-limit intโ max file handles cached simultaneously (min5) (default1000000)--nfs-cache-type memory|disk|symlinkโ type of NFS handle cache to use (defaultmemory)--no-checksumโ don't compare checksums on up/download--no-modtimeโ don't read/write the modification time (can speed things up)--no-seekโ don't allow seeking in files--poll-interval Durationโ time to wait between polling for changes, must be smaller thandir-cache-timeand only on supported remotes (set0to disable) (default1m0s)--read-onlyโ only allow read-only access--uid uint32โ override theuidfield set by the filesystem (not supported on Windows) (default1000)--umask FileModeโ override the permission bits set by the filesystem (not supported on Windows) (default002)--vfs-block-norm-dupesโ if duplicate filenames exist in the same directory (after normalization), log an error and hide the duplicates (may have a performance cost)--vfs-cache-max-age Durationโ max time since last access of objects in the cache (default1h0m0s)--vfs-cache-max-size SizeSuffixโ max total size of objects in the cache (defaultoff)--vfs-cache-min-free-space SizeSuffixโ target minimum free space on the disk containing the cache (defaultoff)--vfs-cache-mode CacheModeโ cache modeoff|minimal|writes|full(defaultoff)--vfs-cache-poll-interval Durationโ interval to poll the cache for stale objects (default1m0s)--vfs-case-insensitiveโ if a file name isn't found, find a case insensitive match--vfs-disk-space-total-size SizeSuffixโ specify the total space of disk (defaultoff)--vfs-fast-fingerprintโ use fast (less accurate) fingerprints for change detection--vfs-handle-caching Durationโ time to keep file handle and downloaders alive after last close (default5s)--vfs-linksโ translate symlinks to/from regular files with a.rclonelinkextension for the VFS--vfs-metadata-extension stringโ set the extension to read metadata from--vfs-read-ahead SizeSuffixโ extra read ahead over--buffer-sizewhen using cache-mode full--vfs-read-chunk-size SizeSuffixโ read the source objects in chunks (default128Mi)--vfs-read-chunk-size-limit SizeSuffixโ if greater than--vfs-read-chunk-size, double the chunk size after each chunk read, until the limit is reached ('off'is unlimited) (defaultoff)--vfs-read-chunk-streams intโ the number of parallel streams to read at once--vfs-read-wait Durationโ time to wait for in-sequence read before seeking (default20ms)--vfs-refreshโ refreshes the directory cache recursively in the background on start--vfs-used-is-size rclone sizeโ use therclone sizealgorithm for Used size--vfs-write-back Durationโ time to writeback files after last use when using cache (default5s)--vfs-write-wait Durationโ time to wait for in-sequence write before giving error (default1s)
Options shared with other commands are described next. See the global flags page (https://rclone.org/flags/) for global options not listed here. ๐ฆ
๐ง Filter Options
Flags for filtering directory listings ๐
--delete-excludedโ delete files on dest excluded from sync--exclude stringArrayโ exclude files matching pattern--exclude-from stringArrayโ read file exclude patterns from file (use-to read from stdin)--exclude-if-present stringArrayโ exclude directories if filename is present--files-from stringArrayโ read list of source-file names from file (use-to read from stdin)--files-from-raw stringArrayโ read list of source-file names from file without any processing of lines (use-to read from stdin)--files-from0 stringArrayโ read list of source-file names from file using NUL as separator (use-to read from stdin)-f,--filter stringArrayโ add a file filtering rule--filter-from stringArrayโ read file filtering patterns from a file (use-to read from stdin)--hash-filter stringโ partition filenames by hashk/nor randomly@/n--ignore-caseโ ignore case in filters (case insensitive)--include stringArrayโ include files matching pattern--include-from stringArrayโ read file include patterns from file (use-to read from stdin)--max-age Durationโ only transfer files younger than this in s or suffixms|s|m|h|d|w|M|y(defaultoff)--max-depth intโ if set limits the recursion depth to this (default-1)--max-size SizeSuffixโ only transfer files smaller than this in KiB or suffixB|K|M|G|T|P(defaultoff)--metadata-exclude stringArrayโ exclude metadatas matching pattern--metadata-exclude-from stringArrayโ read metadata exclude patterns from file (use-to read from stdin)--metadata-filter stringArrayโ add a metadata filtering rule--metadata-filter-from stringArrayโ read metadata filtering patterns from a file (use-to read from stdin)--metadata-include stringArrayโ include metadatas matching pattern--metadata-include-from stringArrayโ read metadata include patterns from file (use-to read from stdin)--min-age Durationโ only transfer files older than this in s or suffixms|s|m|h|d|w|M|y(defaultoff)--min-size SizeSuffixโ only transfer files bigger than this in KiB or suffixB|K|M|G|T|P(defaultoff)
๐ See Also
- rclone serve (
https://rclone.org/commands/rclone_serve/) โ serve a remote over a protocol. ๐
๐ธ rclone serve restic
okay bestie, this one is the restic server. Serve the remote for restic's REST API. ๐
โจ Synopsis
Run a basic web server to serve a remote over restic's REST backend API over HTTP. The way this works is it lets restic use rclone as a data storage mechanism for cloud providers that restic does not support directly. iconic behavior fr fr ๐
Restic (<https://restic.net/>) is a command-line program for doing backups.
The server will log errors. Use -v to see access logs.
--bwlimit will be respected for file transfers. Use --stats to control the stats printing.
๐ Setting up rclone for use by restic
First set up a remote for your chosen cloud provider (<https://rclone.org/docs/#configure>).
Once you have set up the remote, check it is working with, for example rclone lsd remote:. You may have called the remote something other than remote: โ just substitute whatever you called it in the following instructions, no biggie.
Now start the rclone restic server
rclone serve restic -v remote:backup
Where you can replace "backup" in the above by whatever path in the remote you wish to use.
By default this will serve on "localhost:8080" you can change this with use of the --addr flag.
You might wish to start this server on boot. ๐
Adding --cache-objects=false will cause rclone to stop caching objects returned from the List call. Caching is normally desirable as it speeds up downloading objects, saves transactions and uses very little memory. lowkey genius ngl ๐ง
๐ฆ Setting up restic to use rclone
Now you can follow the restic instructions (<http://restic.readthedocs.io/en/latest/030_preparing_a_new_repo.html#rest-server>) on setting up restic.
Note that you will need restic 0.8.2 or later to interoperate with rclone. bestie don't be on ancient versions, it's giving 2016 ๐ญ
For the example above you will want to use "http://localhost:8080/" as the URL for the REST server.
For example:
$ export RESTIC_REPOSITORY=rest:http://localhost:8080/
$ export RESTIC_PASSWORD=yourpassword
$ restic init
created restic backend 8b1a4b56ae at rest:http://localhost:8080/
Please note that knowledge of your password is required to access
the repository. Losing your password means that your data is
irrecoverably lost.
$ restic backup /path/to/files/to/backup
scan [/path/to/files/to/backup]
scanned 189 directories, 312 files in 0:00
[0:00] 100.00% 38.128 MiB / 38.128 MiB 501 / 501 items 0 errors ETA 0:00
duration: 0:00
snapshot 45c8fdd8 saved
๐ Multiple repositories
Note that you can use the endpoint to host multiple repositories. Do this by adding a directory name or path after the URL. Note that these must end with /. Eg
$ export RESTIC_REPOSITORY=rest:http://localhost:8080/user1repo/
# backup user1 stuff
$ export RESTIC_REPOSITORY=rest:http://localhost:8080/user2repo/
# backup user2 stuff
๐ Private repositories
The --private-repos flag can be used to limit users to repositories starting with a path of /<username>/.
โญ Server options
Use --addr to specify which IP address and port the server should listen on, eg --addr 1.2.3.4:8000 or --addr :8080 to listen to all IPs. By default it only listens on localhost. You can use port :0 to let the OS choose an available port.
If you set --addr to listen on a public or LAN accessible IP address then using Authentication is advised โ see the next section for info. ๐
You can use a unix socket by setting the url to unix:///path/to/socket or just by using an absolute path name.
--addr may be repeated to listen on multiple IPs/ports/sockets. Socket activation, described further below, can also be used to accomplish the same.
--server-read-timeout and --server-write-timeout can be used to control the timeouts on the server. Note that this is the total time for a transfer.
--max-header-bytes controls the maximum number of bytes the server will accept in the HTTP header.
--response-header can be used to set an HTTP header for all responses, will overriding existing values. The flag may be repeated to add multiple headers. Use the format Header-Name: value.
--allow-origin enables cross-origin (CORS) requests from browsers by setting the Access-Control-Allow-Origin header on every response to the origin given, e.g. --allow-origin https://app.example.com. Browser CORS preflight OPTIONS requests are answered by rclone without needing authentication as browsers never send credentials with them. Setting this to * allows any origin which is a security risk on an authenticated server. ๐
--baseurl controls the URL prefix that rclone serves from. By default rclone will serve from the root. If you used --baseurl "/rclone" then rclone would serve from a URL starting with "/rclone/". This is useful if you wish to proxy rclone serve. Rclone automatically inserts leading and trailing "/" on --baseurl, so --baseurl "rclone", --baseurl "/rclone" and --baseurl "/rclone/" are all treated identically.
--disable-zip may be set to disable the zipping download option.
๐ธ Protocol
The server supports HTTP/1.1 and HTTP/2. HTTP/2 is used automatically for TLS connections. For non-TLS connections, HTTP/2 cleartext (h2c) is supported, allowing HTTP/2 without encryption. slay โจ
๐ฅ TLS (SSL)
By default this will serve over http. If you want you can serve over https. You will need to supply the --cert and --key flags. If you wish to do client side certificate validation then you will need to supply --client-ca also.
When TLS is configured every listener given with --addr serves TLS. An individual listener can be prefixed with http:// to serve unencrypted HTTP on that address, or with tls:// to state explicitly that it must serve TLS. Using a tls:// address without --cert and --key is an error.
--cert must be set to the path of a file containing either a PEM encoded certificate, or a concatenation of that with the CA certificate. --key must be set to the path of a file with the PEM encoded private key. If setting --client-ca, it should be set to the path of a file with PEM encoded client certificate authority certificates.
--min-tls-version is minimum TLS version that is acceptable. Valid values are "tls1.0", "tls1.1", "tls1.2" and "tls1.3" (default "tls1.0").
๐ Socket activation
Instead of the listening addresses specified above, rclone will listen to all FDs passed by the service manager, if any (and ignore any arguments passed by --addr).
This allows rclone to be a socket-activated service. It can be configured with .socket and .service unit files as described in <https://www.freedesktop.org/software/systemd/man/latest/systemd.socket.html>.
Socket activation can be tested ad-hoc with the systemd-socket-activate command
systemd-socket-activate -l 8000 -- rclone serve
This will socket-activate rclone on the first connection to port 8000 over TCP.
๐ซถ Authentication
By default this will serve files without needing a login.
You can either use an htpasswd file which can take lots of users, or set a single username and password with the --user and --pass flags.
Alternatively, you can have the reverse proxy manage authentication and use the username provided in the configured header with --user-from-header (e.g., --user-from-header=x-remote-user). Ensure the proxy is trusted and headers cannot be spoofed, as misconfiguration may lead to unauthorized access. โ ๏ธ
If either of the above authentication methods is not configured and client certificates are required by the --client-ca flag passed to the server, the client certificate common name will be considered as the username.
Use --htpasswd /path/to/htpasswd to provide an htpasswd file. This is in standard apache format and supports MD5, SHA1 and BCrypt for basic authentication. Bcrypt is recommended.
To create an htpasswd file:
touch htpasswd
htpasswd -B htpasswd user
htpasswd -B htpasswd anotherUser
The password file can be updated while rclone is running.
When authentication is enabled every request must be authenticated, including HTTP OPTIONS requests, as the answer to an OPTIONS request can reveal whether a path exists. Health checks or monitoring which use unauthenticated OPTIONS requests will need to send credentials. The exception is browser CORS preflight requests when --allow-origin is set, which are answered without authentication as browsers never send credentials with them.
Use --realm to set the authentication realm.
Use --salt to change the password hashing salt from the default.
rclone serve restic remote:path [flags]
โจ Options
--addr stringArrayโIPaddress:Portor:Portto bind server to (default127.0.0.1:8080)--allow-origin stringโ Origin which cross-domain request (CORS) can be executed from--append-onlyโ Disallow deletion of repository data--baseurl stringโ Prefix for URLs - leave blank for root--cache-objectsโ Cache listed objects (default true)--cert stringโ TLS PEM key (concatenation of certificate and CA certificate)--client-ca stringโ Client certificate authority to verify clients with-h,--helpโ help for restic--htpasswd stringโ A htpasswd file - if not provided no authentication is done--key stringโ TLS PEM Private key--max-header-bytes intโ Maximum size of request header (default4096)--min-tls-version stringโ Minimum TLS version that is acceptable (default"tls1.0")--pass stringโ Password for authentication--private-reposโ Users can only access their private repo--realm stringโ Realm for authentication--response-header stringArrayโ Set HTTP header for all responses, overriding existing values--salt stringโ Password hashing salt (default"dlPL2MqE")--server-read-timeout Durationโ Timeout for server reading data (default1h0m0s)--server-write-timeout Durationโ Timeout for server writing data (default1h0m0s)--stdioโ Run an HTTP2 server on stdin/stdout--user stringโ User name for authentication--user-from-header stringโ User name from a defined HTTP header
See the global flags page (<https://rclone.org/flags/>) for global options not listed here.
๐ See Also
rclone serve(<https://rclone.org/commands/rclone_serve/>) - Serve a remote over a protocol.
๐ฆ rclone serve s3
Serve that remote:path over s3, bestie. Let's GO.
โจ Synopsis โจ
serve s3 ships a basic s3 server that serves a remote via s3. You can point an s3 client at it, or (iconic behaviour tbh) you can make an s3 type remote (https://rclone.org/s3/) and read + write to it with rclone itself.
๐ซถ Heads up: serve s3 is considered Experimental so use with care, okay?
The S3 server supports Signature Version 4 authentication. Just use --auth-key accessKey,secretKey and set the Authorization header correctly in the request. (See the AWS docs: https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html.)
--auth-key can be repeated for multiple auth pairs. If --auth-key isn't provided, then serve s3 will let in anonymous access ๐ณ.
Alternatively --auth-proxy can be used to look up the secret for each access key ID and choose the backend it maps to (see Auth Proxy below). When an auth proxy is in use --auth-key is ignored and every request must be signed with the secret the proxy returns for its access key ID. Each access key ID is a separate user, whose multipart uploads and object metadata are private to it, even if the proxy maps several access key IDs to the same backend. (very demure, very private ๐
)
As on AWS, every x-amz-* header in an authenticated request must be in its signed headers list; a request with an unsigned x-amz-* header is refused with AccessDenied. S3 clients sign these headers as a matter of course, but a header added after signing (for example by a proxy in front of the server, or x-amz-meta-* headers sent with a presigned URL which only signs the host) is refused. not me getting rejected at the door ๐
Like all rclone flags --auth-key can be set via environment variables, in this case RCLONE_AUTH_KEY. Since this flag can be repeated, the input to RCLONE_AUTH_KEY is CSV encoded. Because the accessKey,secretKey has a comma in, this means it needs to be in quotes.
export RCLONE_AUTH_KEY='"user,pass"'
rclone serve s3 ...
Or to supply multiple identities:
export RCLONE_AUTH_KEY='"user1,pass1","user2,pass2"'
rclone serve s3 ...
Setting this variable without quotes will produce an error. ๐
Please note that some clients may require HTTPS endpoints. See the SSL docs for more information.
This command uses the VFS directory cache. All the functionality will work with --vfs-cache-mode off. Using --vfs-cache-mode full (or writes) can be used to cache objects locally to improve performance. โก
Use --force-path-style=false if you want to use the bucket name as a part of the hostname (such as mybucket.local)
Use --etag-hash if you want to change the hash uses for the ETag. Note that using anything other than MD5 (the default) is likely to cause problems for S3 clients which rely on the Etag being the MD5. Use --etag-hash auto to use the best hash the backend supports โ with --auth-proxy that of each user's backend.
๐ Quickstart ๐
For a simple set up, to serve remote:path over s3, run the server like this:
rclone serve s3 --auth-key ACCESS_KEY_ID,SECRET_ACCESS_KEY remote:path
For example, to use a simple folder in the filesystem, run the server with a command like this:
rclone serve s3 --auth-key ACCESS_KEY_ID,SECRET_ACCESS_KEY local:/path/to/folder
The rclone.conf for the server could look like this:
[local]
type = local
The local configuration is optional though. If you run the server with a remote:path like /path/to/folder (without the local: prefix and without an rclone.conf file), rclone will fall back to a default configuration, which will be visible as a warning in the logs ๐. But it will run nonetheless. slay.
This will be compatible with an rclone (client) remote configuration which is defined like this:
[serves3]
type = s3
provider = Rclone
endpoint = http://127.0.0.1:8080/
access_key_id = ACCESS_KEY_ID
secret_access_key = SECRET_ACCESS_KEY
๐ธ Object uploads (PUT) ๐ธ
A PutObject upload only ever changes the object at its key atomically โ on success, a failed or interrupted PUT neither removes nor overwrites the object already stored at the key, and never leaves a partial object visible at it. periodt. โจ
Remotes that upload atomically (e.g. object stores such as s3) are streamed straight to the destination. On remotes where a partial upload would otherwise be visible (e.g. local), and whenever --vfs-cache-mode is writes or above, the upload is written to a temporary object that is renamed into place on success; these remotes need to support a server-side move or copy for this (nearly all do โ without move or copy the upload is written directly and a failed PUT may leave a partial object at the key ๐ญ). If serve s3 is killed part-way through an upload the temporary object (named with a leading .rclone_temp_put_) may be left behind; it is hidden from S3 listings but must be removed manually.
๐ Multipart uploads ๐
Multipart uploads are written, in part-number order, to a temporary object which is renamed into place, server-side, on completion, so the upload is atomic. The object at the key only ever changes on a successful completion. A failed or aborted upload never affects any object already stored under that name and a partly-uploaded object never becomes visible under it. chef's kiss ๐
With the default --vfs-cache-mode off serve s3 streams each multipart upload, in part-number order, into a single streaming upload to the underlying remote, so the whole file is never buffered in memory โ only parts which arrive out of order are buffered, within the limits described below. The remote then performs its own internal upload (for example its own multipart upload, still with bounded memory). Remotes that don't support streaming uploads (those that must know the file size before the upload starts, such as onedrive, pcloud, jottacloud, mailru, opendrive, putio, protondrive and zoho) have the parts spooled to a temporary file on local disk instead, and uploaded with the size then known on completion, so they need local disk space for the largest objects in flight rather than memory.
With --vfs-cache-mode writes (or full) the parts are written to a temporary file in the VFS cache and uploaded by the VFS write-back โ see Multipart uploads and the VFS cache below.
The rename into place needs the remote to support a server-side move or copy, which nearly all do. It is a cheap rename on most remotes, but on object stores without a real rename (such as s3 itself) the move is performed as a server-side copy and delete of the whole object, which can take time and API calls for large objects. Concurrent multipart uploads of the same key (which S3 permits) are safe. Each writes its own temporary object and the last to complete wins. ๐
On the few remotes that support neither server side move nor copy, the parts are written straight to the destination object instead and never buffered in memory. This is at some cost in atomicity โ the incomplete object is visible under its final name while the upload is in flight, as it also is for a plain object PUT on such remotes, and concurrent multipart uploads of the same key write to the same object and can interleave. A failed or aborted upload still leaves any pre-existing object untouched provided the remote uploads atomically and the VFS cache is off; on a remote where partial uploads are visible it may leave partial data at the key (like a plain PUT there), and with --vfs-cache-mode writes (or full) a write to the cache cannot be abandoned, so an aborted upload's partial data is written back to the remote as if it had completed. ๐ not ideal bestie
โญ Features โญ
- The whole object is never buffered in memory; only parts arriving out of order are, within fixed limits, whatever the upload size.
- Parts can be any size. Clients that don't produce uniform-sized parts work fine โ for example PostgreSQL backup tools such as
pgBarmanandpgBackRest, which flush an upload buffer once it grows past the chunk size, so each part is the chunk size plus a variable overshoot. - Works through
cryptfor any part size, since the object is encrypted as one continuous stream. ๐ - The destination object only ever changes atomically, on completion: an aborted or failed upload leaves any pre-existing object of the same name untouched, and a partly-uploaded object never becomes visible (except on the few remotes with no server-side move or copy, as above).
- Multipart uploads go through the VFS like any other upload, so they show in rclone's transfer stats and obey
--bwlimit. - Backend-agnostic โ it only needs the remote to support a server-side move or copy for the rename into place, which nearly all do; a remote without streaming upload support spools to local disk as above.
๐ Limitations ๐
- Parts must arrive in ascending, contiguous part-number order (
1,2,3, ...). The part the stream needs next is written straight through as it arrives, so it is never buffered, whatever its size. Parts the client uploads concurrently or out of order are buffered until their turn. The memory used for this buffering is capped, per upload, by--multipart-streaming-buffer-limit(default256M,0for no limit), and across all the uploads of each user (each access key) by--multipart-streaming-buffer-total(default1G,0for no limit), counting each buffered part in the whole 1 MiB memory pages it occupies: a part that would take the buffer over either limit is stalled until the stream drains (or, if it is bigger than the limits, until it is the next part), so a client that uploads faster than the remote can accept sees backpressure rather than unbounded server memory use. A stalled part holds its HTTP request open, and one stalled for more than a minute is failed with aSlowDownerror, which S3 clients retry. Clients whose upload concurrency times part size exceeds the limits will see these stalls and retries when the remote is slower than the client. Non-contiguous part numbers are rejected on completion. Configure the client to upload in part order, ideally with low concurrency, for the lowest memory use. โจ - A part uploaded again before completion โ usually a client being a lil drama queen and retrying after a timeout โ is accepted, bestie. If the earlier copy is still buffered, it just gets replaced. And if it's already been streamed, an identical re-upload is a no-op (and if that re-upload arrives while the part is being streamed, it waits for the stream to finish first, patient queen ๐
). If a part fails part way through being streamed โ say the client's connection just dipped ๐ โ the client's retry of it carries on where it stopped, as long as it has the same content. What is not possible: replacing a part that has already been streamed, in whole or in part, with different content โ that gets rejected. And a part that arrives in full but then gets rejected (for example because it doesn't match the
Content-MD5the client declared) has already been streamed, so the whole upload is failed and the client has to start it again ๐ญ. Same energy for a failure in the stream to the remote itself. (The remote's own upload still retries its internal chunks, don't worry ๐ซถ) - Parts are serialised into one stream, so ingest from the client is effectively single-threaded. When streaming, the remote's own upload runs at the same time as the parts arriving; but with the local disk spool or the VFS cache, the upload to the remote only starts on completion. No overlap, no shortcuts โจ
- If
serve s3gets killed part-way through an upload, the temporary object (named with a leading.rclone_temp_multipart_) may just... linger ๐ซ It's hidden from S3 listings, but somebody's gotta remove it manually. That somebody is you.
๐ฆ Multipart uploads and the VFS cache ๐ฆ
With --vfs-cache-mode writes (or full), multipart uploads do not stream to the remote at all. The parts get written, in part-number order, to a temporary file in the VFS cache. On completion the file is renamed into place and uploaded by the VFS write-back โ exactly like a plain object PUT. This needs no streaming upload support from the remote, which is lowkey iconic of it ๐
The rename normally happens in the cache before the upload has started, but the VFS requires the remote to support a server-side move or copy to rename files at all (and it'll use one if the temporary file has already been written back, e.g. with --vfs-write-back 0). On remotes without either, the parts are written to the cache directly under the final key instead: the upload still never touches memory, but it loses its atomicity โ the in-flight upload is visible at the key, and an aborted upload cannot be abandoned once it's in the cache, so its partial data gets written back to the remote as if it were a completed object. ๐ณ Yes, fr fr, that's the trade.
Remotes that benefit from --vfs-cache-mode writes:
- Remotes over slow or unreliable links. A failure in a streamed upload aborts the whole multipart upload and the client must start again from the first part; a failed write-back upload is retried by the VFS (see
--vfs-cache-max-ageand friends) without the client being involved. Ingest from the client also runs at local disk speed rather than being throttled to the remote's pace. Hello, speed ๐ - Workloads that read back or overwrite what they just wrote. The completed object stays in the cache, so subsequent
GET/HEADrequests are served locally, and plain PUTs and multipart uploads to the same key go through the same cache entry โ so the last write wins regardless of upload style. Periodt.
The trade-offs of the VFS cache (matching, bestie, we don't gatekeep ๐):
- The whole object lands on local disk, so the cache (
--cache-dir) needs space for the largest objects in flight;--vfs-cache-max-sizecannot evict files which are still being uploaded. Nope, no evicting the in-flight ones. - The
200 OKforCompleteMultipartUploadmeans the data is safely in the local cache, not yet on the remote โ the same durability the cache gives plain PUTs. If an acknowledgement must mean the data has reached the remote (for example WAL archiving), use the default--vfs-cache-mode off. Don't play yourself ๐ - The upload to the remote only starts on completion, rather than overlapping with the parts arriving, so the data reaches the remote later than with streaming. Patience babe ๐
- If
serve s3is killed part-way through an upload, the temporary file survives in the cache and the VFS cache recovery uploads it to the remote on restart as a temporary object (named with a leading.rclone_temp_multipart_); as with the streaming path, it is hidden from S3 listings but must be removed manually. Same mess, different day ๐
๐งน Cleaning up temporary objects ๐งน
If serve s3 is killed part-way through an upload it can leave a temporary object behind, named with a leading .rclone_temp_. This whole prefix is reserved: any object whose name (the last /-separated segment of its key) starts with .rclone_temp_ is hidden from S3 listings. So like, please don't give real objects such names ๐ โ an existing object with such a name disappears from listings (though it stays accessible directly by its key: only listings hide reserved names, GET, HEAD and DELETE of the exact key still work).
A temporary object never holds acknowledged data โ uploads whose temporary object survived were never confirmed to the client โ so old ones are safe to delete:
rclone delete --min-age 24h --include ".rclone_temp_*" remote:path
The --min-age protects uploads which are still in progress: make sure it is longer than your longest upload, especially if several serve s3 instances share the same remote. ๐
rclone v1.75 named its temporary multipart objects .rclone_multipart_upload_*; leftovers from an older server are also hidden from listings and can be cleaned up the same way. Vintage mess, still mess โจ
๐ Abandoned uploads ๐
A client which starts a multipart upload and then vanishes ๐ซ๏ธ without either completing or aborting it would otherwise hold on to its resources forever. Rude.
An incomplete multipart upload which has had no activity for --multipart-expiry (default 24h) is therefore aborted and cleaned up, exactly as if the client had called AbortMultipartUpload, and a NOTICE is logged. Bye bestie ๐ซถ
An upload with a part still being received is never expired, however slowly the part is arriving, and each completed part restarts the clock โ so the expiry only needs to outlast the client's pauses between parts, not the whole upload. Very generous of us, honestly.
Late operations on an expired upload fail with NoSuchUpload, as they do on real S3 when a lifecycle rule has aborted the upload. Set --multipart-expiry 0 to keep incomplete uploads forever โ but note that abandoned uploads are then never cleaned up and go on counting towards --multipart-max-uploads below, so enough of them will stop the user starting any new multipart upload until the server is restarted. That's the villain arc, don't do it ๐
Each multipart upload in progress holds server resources โ for example the buffers the remote's own upload uses once the first part has arrived โ so each user (each access key) can have no more than --multipart-max-uploads (default 1000, 0 for no limit) in progress at once. Starting another fails with a SlowDown error, which S3 clients retry, and a one-off NOTICE is logged. Chill for a sec, bestie ๐
๐ธ Disabling streaming ๐ธ
If you pass --disable-multipart-streaming, multipart uploads are instead buffered in memory by the underlying S3 library: every part is held in memory and the whole object is written out in one go when the upload completes. This removes the in-order/contiguous-part restriction above, so parts can be uploaded in any order โ but memory use grows with the size of the upload, so it is only suitable for small objects ๐ฌ A one-off NOTICE is logged the first time this happens.
This flag is the only thing that makes multipart uploads buffer in memory โ it is never done because of missing remote capabilities. Copy that ๐
The limits on multipart uploads above (--multipart-streaming-buffer-limit, --multipart-streaming-buffer-total and --multipart-max-uploads) do not apply to uploads buffered in memory, so don't use this flag if the server is open to clients you don't trust. Consider --vfs-cache-mode writes instead, which buffers the upload in the VFS cache on disk and takes precedence over --disable-multipart-streaming. Safer, cuter, better ๐
๐ง Memory use ๐ง
serve s3 never buffers whole objects in memory (except with --disable-multipart-streaming, above), and limits the memory each kind of request can use โ so that a client, even a hostile one ๐พ, can't make it use unbounded memory. Queen behaviour, honestly.
- Object data.
PutObjectbodies and multipart parts arriving in order are streamed straight through to the remote. Parts arriving out of order are buffered, up to--multipart-streaming-buffer-limitper upload and--multipart-streaming-buffer-totalper user. - Uploads in progress. Each user can have at most
--multipart-max-uploadsmultipart uploads in progress. An upload holds little memory until its first part arrives. After that, with--vfs-cache-mode off, it holds a--streaming-upload-cutoffsized buffer plus whatever the remote's own upload buffers โ which for many remotes is up to their chunk size times their upload concurrency (for example--s3-chunk-sizetimes--s3-upload-concurrency). PlainPutObjectuploads use the same while they are in progress. - Metadata. The metadata of at most
--metadata-max-objectsobjects of each user is kept, each limited to2 KB. - Request bodies. The XML bodies of requests such as
CompleteMultipartUploadandDeleteObjectsare limited to10 MiB, andDeleteObjectsto1000 keys. A browser form (POST) upload holds at most1 MiBin memory, spooling the rest to a temporary file, and is limited to5 GB. - Listings. Each page of a
ListObjectslisting reads only the directories needed to fill it, and returns at most1000 keys. Directory listings are cached by the VFS directory cache.
The largest of these is usually the remote's upload buffers, which can be up to --multipart-max-uploads times the buffers of one upload for each user if clients start many uploads and send part of each ๐ณ The limits apply to each user separately, so that one user can't stop others uploading โ which means the memory use grows with the number of users. To limit it, lower --multipart-max-uploads, the remote's chunk size or upload concurrency, or set --max-buffer-memory to limit the memory used by the buffers of all uploads to remotes which use rclone's buffer pool (including s3, azureblob and b2). Buffered multipart parts come from the same pool, so if you set --max-buffer-memory make it comfortably bigger than --multipart-streaming-buffer-total times the number of users uploading at once โ otherwise buffered parts can use up all the memory the remote needs to upload the parts which would free them. Circular, bestie. Naur ๐ญ
The number of connections is not limited, so if the server is open to clients you don't trust, use --auth-key or --auth-proxy and consider putting it behind a reverse proxy which limits connections. Protect the vibes ๐ก๏ธ๐
๐ Bugs (yes bestie, we're starting with the messy part)
Multipart server side copies do not work โ like, they just don't. See #7454 (https://github.com/rclone/rclone/issues/7454). These take a very long time and then eventually fail, which is giving "finishing a 10 page essay at 3am and the wifi dies". The default threshold for multipart server side copies is 5G which is the maximum it can be, so files above this size will fail to be server side copied. ๐ซ
For a current list of serve s3 bugs, go check the serve s3 (https://github.com/rclone/rclone/labels/serve%20s3) bug category on GitHub. Live updates, as the girlies say.
๐ง Limitations
serve s3will treat all directories in the root as buckets and ignore all files in the root. It's giving "if you're not a folder, you're not real to me" ๐- You can use
CreateBucketto create folders under the root, but you can't create empty folders under other folders not in the root. So nested empty vibes? No. None. Never. - When using
PutObjectorDeleteObject, rclone will automatically create or clean up empty folders. If you don't want to clean up empty folders automatically, use--no-cleanup. Tidy queen behaviour, but optional. - When using
ListObjects, rclone treats any delimiter as/. Without a delimiter the listing is recursive: rclone walks the directory tree below the prefix, reading only as many directories as it needs to fill each page. Efficient girlie โจ - Versioning is not currently supported. That's it. No versioning era yet. ๐
- Metadata will only be saved in memory other than the rclone mtime metadata which will be set as the modification time of the file. The metadata of at most
--metadata-max-objectsobjects (default100000,0for no limit) of each user (each access key) is kept; after that the metadata of the user's least recently used object is forgotten. The metadata of an object is ignored once the object has been changed some other way, for example by another--auth-proxyuser or directly on the backend. LRU eviction, my beloved.
๐ท๏ธ Object names
serve s3 stores objects as files in the backend, so object keys are mapped to file paths rather than treated as the opaque strings AWS S3 allows. Real filesystem energy, not abstract string energy.
Keys must be in canonical path form: keys that contain .. or . path segments, repeated slashes (//), or a leading or trailing slash are rejected with a 400 Bad Request (InvalidArgument) instead of being normalised, since normalising them could alias two distinct keys to the same file or resolve a key outside its bucket. This matches the behaviour of other S3 servers such as MinIO. And honestly thank god, because that would be a whole security situation.
โ Supported operations
serve s3 currently supports the following operations. Periodt.
- Bucket
ListBucketsCreateBucketDeleteBucket
- Object
HeadObjectListObjectsGetObjectPutObjectDeleteObjectDeleteObjectsCreateMultipartUploadCompleteMultipartUploadAbortMultipartUploadCopyObjectUploadPart
Other operations will return error Unimplemented. ๐ญ "Not now, babe" but in HTTP.
๐ Authentication
By default this will serve files without needing a login. Open door policy, bestie. Bold choice!
You can either use an htpasswd file which can take lots of users, or set a single username and password with the --user and --pass flags.
Alternatively, you can have the reverse proxy manage authentication and use the username provided in the configured header with --user-from-header (e.g., --user-from-header=x-remote-user). Ensure the proxy is trusted and headers cannot be spoofed, as misconfiguration may lead to unauthorized access. Like, do NOT skip this part.
If either of the above authentication methods is not configured and client certificates are required by the --client-ca flag passed to the server, the client certificate common name will be considered as the username. ๐
Use --htpasswd /path/to/htpasswd to provide an htpasswd file. This is in standard apache format and supports MD5, SHA1 and BCrypt for basic authentication. Bcrypt is recommended. (Bcrypt girlies, we stay winning.)
To create an htpasswd file:
touch htpasswd
htpasswd -B htpasswd user
htpasswd -B htpasswd anotherUser
The password file can be updated while rclone is running. Hot-swap those users, no restart needed. ๐ฅ
When authentication is enabled every request must be authenticated, including HTTP OPTIONS requests, as the answer to an OPTIONS request can reveal whether a path exists. Health checks or monitoring which use unauthenticated OPTIONS requests will need to send credentials. The exception is browser CORS preflight requests when --allow-origin is set, which are answered without authentication as browsers never send credentials with them. Snitching via OPTIONS? Not on our watch.
Use --realm to set the authentication realm.
Use --salt to change the password hashing salt from the default.
๐ Server options
Use --addr to specify which IP address and port the server should listen on, eg --addr 1.2.3.4:8000 or --addr :8080 to listen to all IPs. By default it only listens on localhost. You can use port :0 to let the OS choose an available port. Let the OS pick, she has taste.
If you set --addr to listen on a public or LAN accessible IP address then using Authentication is advised - see the next section for info. โ ๏ธ
You can use a unix socket by setting the url to unix:///path/to/socket or just by using an absolute path name.
--addr may be repeated to listen on multiple IPs/ports/sockets. Socket activation, described further below, can also be used to accomplish the same.
--server-read-timeout and --server-write-timeout can be used to control the timeouts on the server. Note that this is the total time for a transfer.
--max-header-bytes controls the maximum number of bytes the server will accept in the HTTP header.
--response-header can be used to set an HTTP header for all responses, will overriding existing values. The flag may be repeated to add multiple headers. Use the format Header-Name: value.
--allow-origin enables cross-origin (CORS) requests from browsers by setting the Access-Control-Allow-Origin header on every response to the origin given, e.g. --allow-origin https://app.example.com. Browser CORS preflight OPTIONS requests are answered by rclone without needing authentication as browsers never send credentials with them. Setting this to * allows any origin which is a security risk on an authenticated server.
--baseurl controls the URL prefix that rclone serves from. By default rclone will serve from the root. If you used --baseurl "/rclone" then rclone would serve from a URL starting with "/rclone/". This is useful if you wish to proxy rclone serve. Rclone automatically inserts leading and trailing / on --baseurl, so --baseurl "rclone", --baseurl "/rclone" and --baseurl "/rclone/" are all treated identically. Slash-count agnostic, as she should be.
--disable-zip may be set to disable the zipping download option. ๐ฆ๐ซ
๐ก Protocol
The server supports HTTP/1.1 and HTTP/2. HTTP/2 is used automatically for TLS connections. For non-TLS connections, HTTP/2 cleartext (h2c) is supported, allowing HTTP/2 without encryption. Modern protocol behaviour, no notes.
๐ TLS (SSL)
By default this will serve over http. If you want you can serve over https. You will need to supply the --cert and --key flags. If you wish to do client side certificate validation then you will need to supply --client-ca also.
When TLS is configured every listener given with --addr serves TLS. An individual listener can be prefixed with http:// to serve unencrypted HTTP on that address, or with tls:// to state explicitly that it must serve TLS. Using a tls:// address without --cert and --key is an error.
--cert must be set to the path of a file containing either a PEM encoded certificate, or a concatenation of that with the CA certificate. --key must be set to the path of a file with the PEM encoded private key. If setting --client-ca, it should be set to the path of a file with PEM encoded client certificate authority certificates.
--min-tls-version is minimum TLS version that is acceptable. Valid values are "tls1.0", "tls1.1", "tls1.2" and "tls1.3" (default "tls1.0"). And yes bestie, tls1.0 is the default. Version check accordingly.
๐ Socket activation
Instead of the listening addresses specified above, rclone will listen to all FDs passed by the service manager, if any (and ignore any arguments passed by --addr).
This allows rclone to be a socket-activated service. It can be configured with .socket and .service unit files as described in <https://www.freedesktop.org/software/systemd/man/latest/systemd.socket.html>.
Socket activation can be tested ad-hoc with the systemd-socket-activate command
systemd-socket-activate -l 8000 -- rclone serve
This will socket-activate rclone on the first connection to port 8000 over TCP. Lazy-loading but for a whole server. Iconic.
๐๏ธ VFS - Virtual File System
This command uses the VFS layer. This adapts the cloud storage objects that rclone uses into something which looks much more like a disk filing system. <sparkle>Glow-up: cloud object โก๏ธ actual file vibes.</sparkle>
Cloud storage objects have lots of properties which aren't like disk files - you can't extend them or write to the middle of them, so the VFS layer has to deal with that. Because there is no one right way of doing this there are various options explained below.
The VFS layer also implements a directory cache - this caches info about files and directories (but not the data) in memory. ๐ง
๐๏ธ VFS Directory Cache
Using the --dir-cache-time flag, you can control how long a directory should be considered up to date and not refreshed from the backend. Changes made through the VFS will appear immediately or invalidate the cache.
--dir-cache-time duration Time to cache directory entries for (default 5m0s)
--poll-interval duration Time to wait between polling for changes. Must be smaller than dir-cache-time. Only on supported remotes. Set to 0 to disable (default 1m0s)
However, changes made directly on the cloud storage by the web interface or a different copy of rclone will only be picked up once the directory cache expires if the backend configured does not support polling for changes. If the backend supports polling, changes will be picked up within the polling interval.
You can send a SIGHUP signal to rclone for it to flush all directory caches, regardless of how old they are. Assuming only one rclone instance is running, you can reset the cache like this:
kill -SIGHUP $(pidof rclone)
If you configure rclone with a remote control then you can use rclone rc to flush the whole directory cache:
rclone rc vfs/forget
Or individual files or directories:
rclone rc vfs/forget file=path/to/file dir=path/to/dir
Selective memory loss, but make it a feature. ๐
๐งบ VFS File Buffering
The --buffer-size flag determines the amount of memory, that will be used to buffer data in advance.
Each open file will try to keep the specified amount of data in memory at all times. The buffered data is bound to one open file and won't be shared. No sharing. Personal buffer. Boundaries, bestie.
This flag is a upper limit for the used memory per open file. The buffer will only use memory for data that is downloaded but not yet read. If the buffer is empty, only a small amount of memory will be used.
The maximum memory used by rclone for buffering can be up to --buffer-size * open files. ๐งฎ Do the math before you crank that number, fr fr.
๐พ VFS File Caching ๐พ
okay bestie, buckle up, because this is the part where rclone's virtual filesystem stops pretending and starts actually keeping stuff on your disk. File caching is what makes the VFS layer act like an actual normal filesystem, and yeah you can turn it off, but you pay for that in compatibility. ๐
Like, for example, you wanna read and write to the same file at the same time? Yeah, that needs VFS caching enabled. More on that below. ๐
Heads up bestie: the VFS cache is a whole separate creature from the cache backend. You might be out here needing one of them, or the other, or honestly both. No cap.
--cache-dirstring โ the directory rclone will use for caching.--vfs-cache-modeCacheMode โ cache modeoff|minimal|writes|full(defaultoff).--vfs-cache-max-ageduration โ max time since last access of objects in the cache (default1h0m0s).--vfs-cache-max-sizeSizeSuffix โ max total size of objects in the cache (defaultoff).--vfs-cache-min-free-spaceSizeSuffix โ target minimum free space on the disk containing the cache (defaultoff).--vfs-cache-poll-intervalduration โ interval to poll the cache for stale objects (default1m0s).--vfs-write-backduration โ time to writeback files after last use when using cache (default5s).
If you run with -vv, rclone will literally print out where your file cache is chilling. Those files live in the user cache file area โ which is OS dependent, but you can control it with --cache-dir, or by setting the appropriate environment variable. โจ
The cache has 4 different modes and you pick one with --vfs-cache-mode. The higher the cache mode, the more compatible rclone gets โ and the more disk space it eats. That's the trade, bestie. ๐
Also important: files only get written back to the remote when they're closed and they haven't been touched for --vfs-write-back seconds. And if rclone gets quit or just straight up dies while holding files that haven't been uploaded yet? Don't panic โ those get uploaded next time you run rclone with the same flags. ๐ซถ
If you're using --vfs-cache-max-size or --vfs-cache-min-free-space, note that the cache can absolutely exceed those quotas for two reasons. One: it's only checked every --vfs-cache-poll-interval. Two: open files cannot be evicted from the cache. When --vfs-cache-max-size or --vfs-cache-min-free-space is exceeded, rclone tries to evict the least accessed files first โ starting with the ones that haven't been accessed for the longest. This flushing strategy is efficient and more relevant files are likely to stay cached. Iconic behavior honestly. ๐
The --vfs-cache-max-age will evict files from the cache once the set time since last access has passed โ it's based on access time, not on when the file was first added to the cache. The default 1 hour means it starts evicting stuff that hasn't been accessed for 1 hour. But the moment a cached file gets accessed, that 1 hour timer resets to 0 and waits another whole hour before evicting. Specify the time with standard notation: s, m, h, d, w. โฐ
๐ Do NOT run two copies of rclone using the same VFS cache with the same or overlapping remotes if you're using--vfs-cache-mode>off. This can potentially cause data corruption if you do. You can work around it by giving each rclone its own cache hierarchy with--cache-dir. If the remotes in use don't overlap, you're totally fine, no worries.
๐ --vfs-cache-mode off ๐
This is the default mode, and in it the cache reads directly from the remote and writes directly to the remote โ nothing gets cached on disk at all. Very demure. Very minimal. ๐
This will mean some operations are not possible:
- Files can't be opened for both read AND write
- Files opened for write can't be seeked
- Existing files opened for write must have
O_TRUNCset - Files open for read with
O_TRUNCwill be opened write only - Files open for write only will behave as if
O_TRUNCwas supplied - Open modes
O_APPEND,O_TRUNCare ignored - If an upload fails it can't be retried
๐ธ --vfs-cache-mode minimal ๐ธ
This one is very similar to off, except that files opened for read AND write will be buffered to disk. So files opened for write become a lot more compatible, while using the absolute minimum of disk space. โจ
These operations are not possible:
- Files opened for write only can't be seeked
- Existing files opened for write must have
O_TRUNCset - Files opened for write only will ignore
O_APPEND,O_TRUNC - If an upload fails it can't be retried
๐ --vfs-cache-mode writes ๐
In this mode, files opened for read only are still read directly from the remote โ but write only and read/write files get buffered to disk first. ๐ฆ
This mode should support all normal file system operations. Slay.
And if an upload fails, it gets retried at exponentially increasing intervals up to 1 minute. It's giving persistence. ๐ฅ
๐ --vfs-cache-mode full ๐
In this mode, all reads and writes are buffered to and from disk. When data is read from the remote, that gets buffered to disk as well. Every single bit. ๐
In this mode the files in the cache will be sparse files, and rclone keeps track of which bits of the files it has actually downloaded.
So if an application only ever reads the starts of each file, then rclone only buffers the start of the file. These files will appear to be their full size in the cache, but they're sparse files with only the data that's been downloaded actually present in them. Sneaky! ๐ง
This mode should support all normal file system operations and is otherwise identical to --vfs-cache-mode writes.
When reading a file, rclone will read --buffer-size plus --vfs-read-ahead bytes ahead. The --buffer-size is buffered in memory, whereas the --vfs-read-ahead is buffered on disk.
When using this mode it is recommended that --buffer-size is not set too large, and that --vfs-read-ahead is set large if required.
โ ๏ธ IMPORTANT: not all file systems support sparse files. In particular FAT/exFAT do not. Rclone will perform very badly if the cache directory is on a filesystem which doesn't support sparse files, and it will log an ERROR message if one is detected. You've been warned bestie. ๐ญ
๐ Fingerprinting ๐
Various parts of the VFS use fingerprinting to see if a local file copy has changed relative to a remote file. Fingerprints are made from:
size- modification time
hash
...where available on an object. โญ
On some backends some of these attributes are slow to read โ they take an extra API call per object, or extra work per object. Annoying, but that's the tea. โ
For example, hash is slow with the local and sftp backends because they have to read the entire file and hash it. And modtime is slow with the s3, swift, ftp and qinqstor backends because they need to do an extra API call to fetch it.
If you use the --vfs-fast-fingerprint flag, then rclone will not include the slow operations in the fingerprint. This makes the fingerprinting less accurate but much faster, and it'll improve the opening time of cached files. ๐๏ธ
If you're running a vfs cache over local, s3 or swift backends, then using this flag is recommended.
Note that if you change the value of this flag, the fingerprints of the files in the cache may be invalidated and the files will need to be downloaded again. ๐ญ
๐ฆ VFS Chunked Reading ๐ฆ
When rclone reads files from a remote it reads them in chunks. Which means that rather than requesting the whole entire file, rclone reads the chunk you specified. For some remotes this reduces the used download quota, because it only requests the chunks from the remote that are actually read โ at the cost of an increased number of requests. Trade-offs, bestie. ๐
These flags control the chunking:
--vfs-read-chunk-sizeSizeSuffix โ read the source objects in chunks (default128M).--vfs-read-chunk-size-limitSizeSuffix โ max chunk doubling size (defaultoff).--vfs-read-chunk-streamsint โ the number of parallel streams to read at once.
The chunking behaves differently depending on the --vfs-read-chunk-streams parameter. ๐
๐ --vfs-read-chunk-streams == 0 ๐
Rclone will start reading a chunk of size --vfs-read-chunk-size, and then double the size for each read. When --vfs-read-chunk-size-limit is specified, and greater than --vfs-read-chunk-size, the chunk size for each open file will get doubled only until the specified value is reached. If the value is off โ which is the default โ the limit is disabled and the chunk size will grow indefinitely. It's giving exponential. ๐
With --vfs-read-chunk-size 100M and --vfs-read-chunk-size-limit 0 the following parts will be downloaded: 0-100M, 100M-200M, 200M-300M, 300M-400M and so on. When --vfs-read-chunk-size-limit 500M is specified, the result would be 0-100M, 100M-300M, 300M-700M, 700M-1200M, 1200M-1700M and so on.
Setting --vfs-read-chunk-size to 0 or "off" disables chunked reading entirely.
The chunks will not be buffered in memory. โจ
๐ --vfs-read-chunk-streams > 0 ๐
Rclone reads --vfs-read-chunk-streams chunks of size --vfs-read-chunk-size concurrently. The size for each read will stay constant. No doubling here, we're just parallel now. ๐โโ๏ธ
This improves performance massively on high latency links or very high bandwidth links to high performance object stores.
Some experimentation will be needed to find the optimum values of --vfs-read-chunk-size and --vfs-read-chunk-streams, since these will depend on the backend in use and the latency to the backend.
For high performance object stores (eg AWS S3) a reasonable place to start might be --vfs-read-chunk-streams 16 and --vfs-read-chunk-size 4M. In testing with AWS S3 the performance scaled roughly as the --vfs-read-chunk-streams setting.
Similar settings should work for high latency links, but depending on the latency they may need more --vfs-read-chunk-streams in order to get the throughput. ๐ซก
โก VFS Performance โก
These flags may be used to enable/disable features of the VFS for performance or other reasons. See also the chunked reading feature above, bestie. ๐
In particular S3 and Swift benefit hugely from the --no-modtime flag (or use --use-server-modtime for a slightly different effect), because each read of the modification time takes a transaction. Every. Single. Time. ๐
--no-checksumโ don't compare checksums on up/download.--no-modtimeโ don't read/write the modification time (can speed things up).--no-seekโ don't allow seeking in files.--read-onlyโ only allow read-only access.
Sometimes rclone is delivered reads or writes out of order. Rather than seeking, rclone will wait a short time for the in-sequence read or write to come in. These flags only come into effect when not using an on disk cache file:
--vfs-read-waitduration โ time to wait for in-sequence read before seeking (default20ms).--vfs-write-waitduration โ time to wait for in-sequence write before giving error (default1s).
When using VFS write caching (--vfs-cache-mode with value writes or full), the global flag --transfers can be set to adjust the number of parallel uploads of modified files from the cache. The related global flag --checkers has no effect on the VFS. Sorry bestie, them's the rules. ๐
--transfers intโ how many file transfers are allowed to run in parallel at the same time (default4). A lil squad of four, working the room. ๐
๐ฆ Symlinks ๐ฆ
Okay so by default the VFS is like, not symlink-friendly at all. Zero symlink energy. But you can absolutely switch it on with either of these two flags:
--linksโ translate symlinks to/from regular files using a.rclonelinkextension.--vfs-linksโ same translation, same.rclonelinkextension, but scoped to the VFS.
Here's the tea ๐: most cloud storage systems do not support symlinks directly, like at all. So rclone just... stores the symlink as a totally normal file with a special extension. So a file that shows up as a symlink called link-to-file.txt is actually sitting on your cloud storage as link-to-file.txt.rclonelink, and the contents of that file are the path to wherever the symlink points. Iconic workaround, no notes.
Important distinction bestie: --links turns symlink translation on globally inside rclone โ that includes every backend that even knows what the concept is (the local backend, for example ๐). --vfs-links is the chill one: it only does it for the VFS layer.
This scheme is compatible with the one the local backend uses with the --local-links flag (https://rclone.org/local/#symlinks-junction-points).
The --vfs-links flag was designed for rclone mount, rclone nfsmount and rclone serve nfs.
It hasn't been tested with the other rclone serve commands yet ๐.
A limitation of the current implementation is that it expects the caller to resolve sub-symlinks. Like, look at this directory tree:
.
โโโ dir
โ โโโ file.txt
โโโ linked-dir -> dir
The VFS will correctly resolve linked-dir but not linked-dir/file.txt. This is not a problem for the tested commands, but it may be for other commands.
Also, there's an outstanding issue with symlink support, issue #8245 (https://github.com/rclone/rclone/issues/8245), where duplicate files get created when symlinks are moved into directories where there's already a file of the same name (or the other way around). So like... be aware. ๐
๐ VFS Case Sensitivity ๐
Linux file systems are case-sensitive: two files can differ only by case, and the exact case must be used when opening a file. No shortcuts, no lowercase chaos.
File systems on modern Windows are case-insensitive but case-preserving: existing files can be opened using any case, but the exact case that was used to create the file is preserved and available for programs to query. What is not allowed is two files in the same directory differing only by case.
Usually, file systems on macOS are case-insensitive. It is possible to make macOS file systems case-sensitive, but that is not the default.
The --vfs-case-insensitive VFS flag controls how rclone handles these two cases. If its value is "false", rclone passes file names to the remote as-is. If the flag is "true" (or if it appears without a value on the command line), rclone may perform a "fixup" โ and here's what that means, bestie:
You may specify a file name to open/delete/rename/etc with a case different from what's stored on the remote. If an argument refers to an existing file with exactly the same name, then the case of the existing file on disk is used. However, if a file name with exactly the same name is not found but a name differing only by case does exist, rclone will transparently fixup the name. This fixup happens only when an existing file is requested. Case sensitivity of file names created anew by rclone is controlled by the underlying remote.
Note that case sensitivity of the operating system running rclone (the target) may differ from case sensitivity of a file system presented by rclone (the source). The flag controls whether "fixup" is performed to satisfy the target.
If the flag is not provided on the command line, then its default value depends on the operating system where rclone runs: "true" on Windows and macOS, "false" otherwise. If the flag is provided without a value, then it is "true". ๐
The --no-unicode-normalization flag controls whether a similar "fixup" is performed for filenames that differ but are canonically equivalent (https://en.wikipedia.org/wiki/Unicode_equivalence) with respect to unicode. Unicode normalization can be particularly helpful for users of macOS, which prefers form NFD instead of the NFC used by most other platforms. It is therefore highly recommended to keep the default of false on macOS, to avoid encoding compatibility issues.
In the (probably unlikely) event that a directory has multiple duplicate filenames after applying case and unicode normalization, the --vfs-block-norm-dupes flag lets you hide those duplicates. Now, this comes with a performance tradeoff, because rclone will have to scan the entire directory for duplicates when listing a directory. For that reason, it's recommended to leave this disabled if you don't need it. But macOS users may want to consider using it, because otherwise, if a remote directory contains both NFC and NFD versions of the same filename, an odd situation occurs: both versions of the file will be visible in the mount, and both will appear to be editable โ however, editing either version will actually result in only the NFD version getting edited under the hood. Sneaky. ๐ญ --vfs-block-norm-dupes prevents this confusion by detecting the scenario, hiding the duplicates, and logging an error, similar to how this is handled in rclone sync.
โจ VFS Disk Options โจ
This flag lets you manually set the statistics about the filing system. It's useful when those statistics just can't be read correctly automatically.
--vfs-disk-space-total-sizeโ manually set the total disk space size (example:256G, default:-1).
๐ Alternate report of used bytes ๐
Some backends โ most notably S3 โ do not report the amount of bytes used. So if you need that info available when you run df on the filesystem, pass the flag --vfs-used-is-size to rclone. With that flag set, instead of relying on the backend to report this information, rclone will scan the whole remote, similar to rclone size, and compute the total used space itself. DIY, but make it storage. ๐ซถ
WARNING: Contrary to rclone size, this flag ignores filters so that the result is accurate. However, this is very inefficient and may cost lots of API calls resulting in extra charges. Use it as a last resort and only with caching.
๐ธ VFS Metadata ๐ธ
If you use the --vfs-metadata-extension flag you can get the VFS to expose files which contain the metadata (https://rclone.org/docs/#metadata) as a JSON blob. These files will not appear in the directory listing, but they can be stat-ed and opened โ and once they have been, they will appear in directory listings until the directory cache expires.
Note that some backends won't create metadata unless you pass in the --metadata flag.
For example, using rclone mount with --metadata --vfs-metadata-extension .metadata we get:
$ ls -l /mnt/
total 1048577
-rw-rw-r-- 1 user user 1073741824 Mar 3 16:03 1G
$ cat /mnt/1G.metadata
{
"atime": "2025-03-04T17:34:22.317069787Z",
"btime": "2025-03-03T16:03:37.708253808Z",
"gid": "1000",
"mode": "100664",
"mtime": "2025-03-03T16:03:39.640238323Z",
"uid": "1000"
}
$ ls -l /mnt/
total 1048578
-rw-rw-r-- 1 user user 1073741824 Mar 3 16:03 1G
-rw-rw-r-- 1 user user 185 Mar 3 16:03 1G.metadata
If the file has no metadata it will be returned as {} and if there is an error reading the metadata the error will be returned as {"error":"error string"}.
๐ Auth Proxy ๐
If you supply the parameter --auth-proxy /path/to/program then rclone will use that program to generate backends on the fly, which then get used to authenticate incoming requests. It uses a simple JSON based protocol, with input on STDIN and output on STDOUT. Very demure, very standard-streams.
PLEASE NOTE:--auth-proxyand--authorized-keyscannot be used together. If--auth-proxyis set, the authorized keys option will be ignored.
There's an example program bin/test_proxy.py (https://github.com/rclone/rclone/blob/master/bin/test_proxy.py) in the rclone source code.
The program's job is to take a user and pass on the input and turn those into the config for a backend on STDOUT in JSON format. This config will have any default parameters for the backend added, but it won't use configuration from environment variables or command line options โ it is the job of the proxy program to make a complete config.
This generated config must have this extra parameter:
_rootโ root to use for the backend
And it may have these parameters:
_obscureโ comma separated strings for parameters to obscure_secret_access_keyโ the secret for S3 access key auth (see below)
If password authentication was used by the client, input to the proxy process (on STDIN) would look similar to this:
{
"user": "me",
"pass": "mypassword",
"client_ip": "192.168.1.1"
}
If public-key authentication was used by the client, input to the proxy process (on STDIN) would look similar to this:
{
"user": "me",
"public_key": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDuwESFdAe14hVS6omeyX7edc...JQdf",
"client_ip": "192.168.1.1"
}
If the client authenticated with an S3 access key (rclone serve s3), the client never sends its secret, only a signature made with it, so the input contains just the access key ID as the user, with no pass or public_key:
{
"user": "AKIAIOSFODNN7EXAMPLE",
"client_ip": "192.168.1.1"
}
In this case the program must look up the secret access key for that access key ID and return it in the _secret_access_key field of the output. Rclone then uses that secret to verify the signature on the request, refusing the request if it does not match. What this means is that the proxy program is the source of truth for both the credentials and the backend they map to. If the program does not return _secret_access_key, or returns it empty, the request is refused. Bye. ๐ซ
The program's answer for an access key ID is cached (see below), but is checked with the program again after 5 minutes even if the access key ID is in constant use, so revoking an access key ID in the program takes effect within 5 minutes. A rotated secret takes effect on the first request signed with it. โญ
The client_ip key holds the IP address the client connected from, without a port number. It can be used to restrict logins to certain networks, or to log authentication attempts centrally. It is omitted if the client has no IP address โ for example when connecting over a unix socket. Note that if rclone is behind a reverse proxy, this will be the address of the reverse proxy and not the original client. iykyk.
And as an example return this on STDOUT
{
"type": "sftp",
"_root": "",
"_obscure": "pass",
"user": "me",
"pass": "mypassword",
"host": "sftp.example.com"
}
okay bestie so this is the vibe: an SFTP backend gets created on the fly for whatever user and pass/public_key came back in the output, pointed at the host you handed over. ๐ and fr fr, notice _obscure is set to pass โ that means rclone will obscure the pass parameter before it builds the backend, and that is required for sftp backends. not optional, not a suggestion, it's the rules. โจ
and the program can do literally anything it wants with the user it was given. want to proxy out to a whole swarm of different sftp backends? make the user be user@example.com, then in your output set host to example.com and user to user. slay. ๐ though for security you'd probably want to restrict host to a limited list. lowkey important. ๐
there's an internal cache of backends and it's keyed on the user, a hash of the pass or public_key, and the client_ip. so if a user's password or public-key changes, or the client connects from a new IP address, or the proxy returns different config parameters (like a rotated api_key) โ a fresh backend gets created on the next request instead of the cached one being reused. no stale vibes allowed. ๐
and the whole point of this: you can use it to build general purpose proxies to any kind of backend that rclone supports. main character energy, honestly. ๐
rclone serve s3 remote:path [flags]
โจ Options โจ
--addr stringArrayโ IPaddress:Port or :Port to bind server to (default127.0.0.1:8080)--allow-origin stringโ Origin which cross-domain request (CORS) can be executed from--auth-key stringArrayโ Set key pair for v4 authorization: access_key_id,secret_access_key--auth-proxy stringโ A program to use to create the backend from the auth--baseurl stringโ Prefix for URLs - leave blank for root--cert stringโ TLS PEM key (concatenation of certificate and CA certificate)--client-ca stringโ Client certificate authority to verify clients with--dir-cache-time Durationโ Time to cache directory entries for (default5m0s)--dir-perms FileModeโ Directory permissions (default777)--disable-multipart-streamingโ Buffer multipart uploads in memory instead of streaming them to the backend--etag-hash stringโ Which hash to use for the ETag, orautoor blank for off (default"MD5")--file-perms FileModeโ File permissions (default666)--force-path-styleโ If true use path style access if false use virtual hosted style (defaulttrue)--gid uint32โ Override the gid field set by the filesystem (not supported on Windows) (default1000)-h,--helpโ help for s3--htpasswd stringโ A htpasswd file - if not provided no authentication is done--key stringโ TLS PEM Private key--link-perms FileModeโ Link permissions (default666)--max-header-bytes intโ Maximum size of request header (default4096)--metadata-max-objects intโ Maximum number of objects of a user whose metadata is kept in memory,0for unlimited (default100000)--min-tls-version stringโ Minimum TLS version that is acceptable (default"tls1.0")--multipart-expiry Durationโ Abort incomplete multipart uploads idle for longer than this,0to keep forever (default1d)--multipart-max-uploads intโ Maximum number of streamed multipart uploads a user can have in progress at once,0for unlimited (default1000)--multipart-streaming-buffer-limit SizeSuffixโ Maximum memory buffered per streamed multipart upload for parts arriving out of order,0for unlimited (default256Mi)--multipart-streaming-buffer-total SizeSuffixโ Maximum memory buffered by all the streamed multipart uploads of a user for parts arriving out of order,0for unlimited (default1Gi)--no-checksumโ Don't compare checksums on up/download--no-cleanupโ Not to cleanup empty folder after object is deleted--no-modtimeโ Don't read/write the modification time (can speed things up)--no-seekโ Don't allow seeking in files--pass stringโ Password for authentication--poll-interval Durationโ Time to wait between polling for changes, must be smaller thandir-cache-timeand only on supported remotes (set0to disable) (default1m0s)--read-onlyโ Only allow read-only access--realm stringโ Realm for authentication--response-header stringArrayโ Set HTTP header for all responses, overriding existing values--salt stringโ Password hashing salt (default"dlPL2MqE")--server-read-timeout Durationโ Timeout for server reading data (default1h0m0s)--server-write-timeout Durationโ Timeout for server writing data (default1h0m0s)--uid uint32โ Override the uid field set by the filesystem (not supported on Windows) (default1000)--umask FileModeโ Override the permission bits set by the filesystem (not supported on Windows) (default002)--user stringโ User name for authentication--user-from-header stringโ User name from a defined HTTP header--vfs-block-norm-dupesโ If duplicate filenames exist in the same directory (after normalization), log an error and hide the duplicates (may have a performance cost)--vfs-cache-max-age Durationโ Max time since last access of objects in the cache (default1h0m0s)--vfs-cache-max-size SizeSuffixโ Max total size of objects in the cache (defaultoff)--vfs-cache-min-free-space SizeSuffixโ Target minimum free space on the disk containing the cache (defaultoff)--vfs-cache-mode CacheModeโ Cache modeoff|minimal|writes|full(defaultoff)--vfs-cache-poll-interval Durationโ Interval to poll the cache for stale objects (default1m0s)--vfs-case-insensitiveโ If a file name not found, find a case insensitive match--vfs-disk-space-total-size SizeSuffixโ Specify the total space of disk (defaultoff)--vfs-fast-fingerprintโ Use fast (less accurate) fingerprints for change detection--vfs-handle-caching Durationโ Time to keep file handle and downloaders alive after last close (default5s)--vfs-linksโ Translate symlinks to/from regular files with a.rclonelinkextension for the VFS--vfs-metadata-extension stringโ Set the extension to read metadata from--vfs-read-ahead SizeSuffixโ Extra read ahead over--buffer-sizewhen using cache-mode full--vfs-read-chunk-size SizeSuffixโ Read the source objects in chunks (default128Mi)--vfs-read-chunk-size-limit SizeSuffixโ If greater than--vfs-read-chunk-size, double the chunk size after each chunk read, until the limit is reached ('off'is unlimited) (defaultoff)--vfs-read-chunk-streams intโ The number of parallel streams to read at once--vfs-read-wait Durationโ Time to wait for in-sequence read before seeking (default20ms)--vfs-refreshโ Refreshes the directory cache recursively in the background on start--vfs-used-is-size rclone sizeโ Use therclone sizealgorithm for Used size--vfs-write-back Durationโ Time to writeback files after last use when using cache (default5s)--vfs-write-wait Durationโ Time to wait for in-sequence write before giving error (default1s)
Options shared with other commands are described next. See the global flags page (https://rclone.org/flags/) for global options not listed here.
๐ Filter Options ๐
Flags for filtering directory listings
--delete-excludedโ delete files on dest that got excluded from the sync ๐ like, gone gone, no takebacks.--excludestringArray โ exclude files matching this pattern ๐ โโ๏ธ--exclude-fromstringArray โ read your file exclude patterns from a file instead (use-to read from stdin) ๐--exclude-if-presentstringArray โ if a filename like this is present, exclude the whole directory ๐ซ--files-fromstringArray โ read the list of source-file names from a file (use-to read from stdin)--files-from-rawstringArray โ same thing but with literally zero processing of the lines, raw as it gets (use-to read from stdin)--files-from0stringArray โ read the list of source-file names from a file using NUL as the separator (use-to read from stdin)-f,--filterstringArray โ add a file filtering rule โจ--filter-fromstringArray โ read file filtering patterns from a file (use-to read from stdin)--hash-filterstring โ partition filenames by hashk/nor randomly@/n--ignore-caseโ ignore case in filters, it's giving case insensitive ๐--includestringArray โ include files matching this pattern--include-fromstringArray โ read file include patterns from a file (use-to read from stdin)--max-ageDuration โ only transfer files younger than this, insor suffixms|s|m|h|d|w|M|y(defaultoff)--max-depthint โ if set, it limits the recursion depth to this (default-1)--max-sizeSizeSuffix โ only transfer files smaller than this, in KiB or suffixB|K|M|G|T|P(defaultoff)--metadata-excludestringArray โ exclude metadatas matching this pattern--metadata-exclude-fromstringArray โ read metadata exclude patterns from a file (use-to read from stdin)--metadata-filterstringArray โ add a metadata filtering rule--metadata-filter-fromstringArray โ read metadata filtering patterns from a file (use-to read from stdin)--metadata-includestringArray โ include metadatas matching this pattern--metadata-include-fromstringArray โ read metadata include patterns from a file (use-to read from stdin)--min-ageDuration โ only transfer files older than this, insor suffixms|s|m|h|d|w|M|y(defaultoff)--min-sizeSizeSuffix โ only transfer files bigger than this, in KiB or suffixB|K|M|G|T|P(defaultoff)
โจ See Also
rclone serve(https://rclone.org/commands/rclone_serve/) โ Serve a remote over a protocol.
๐ฆ rclone serve sftp ๐
Serve the remote over SFTP.
๐ช Synopsis
Run an SFTP server to serve a remote over SFTP. Bestie, you can hook it up to an SFTP client, or you can just make a remote of type sftp and use it with that. Both are iconic, pick your fighter ๐
You can use the filter flags (e.g. --include, --exclude) to control what is served.
The server will respond to a small number of shell commands, mainly md5sum, sha1sum and df, which enable it to provide support for checksums and the about feature when accessed from an sftp remote. Like, it's not a whole shell, it's just those lil guys ๐ฃ
Note that this server uses standard 32 KiB packet payload size, which means you must not configure the client to expect anything else, e.g. with the chunk_size (https://rclone.org/sftp/#sftp-chunk-size) option on an sftp remote. Don't do it, it will not slay ๐
The server will log errors. Use -v to see access logs.
--bwlimit will be respected for file transfers. Use --stats to control the stats printing.
You must provide some means of authentication, either with --user/--pass, an authorized keys file (specify location with --authorized-keys โ the default is the same as ssh), an --auth-proxy, or set the --no-auth flag for no authentication when logging in.
If you don't supply a host --key then rclone will generate rsa, ecdsa and ed25519 variants, and cache them for later use in rclone's cache directory (see rclone help flags cache-dir) in the "serve-sftp" directory. So cute, it remembers ๐
By default the server binds to localhost:2022 โ if you want it to be reachable externally then supply --addr :2022 for example.
This also supports being run with socket activation, in which case it will listen on the first passed FD. It can be configured with .socket and .service unit files as described in <https://www.freedesktop.org/software/systemd/man/latest/systemd.socket.html>.
Socket activation can be tested ad-hoc with the systemd-socket-activate command:
systemd-socket-activate -l 2222 -- rclone serve sftp :local:vfs/
This will socket-activate rclone on the first connection to port 2222 over TCP. Vibe check passed โจ
Note that the default of --vfs-cache-mode off is fine for the rclone sftp backend, but it may not be with other SFTP clients.
If --stdio is specified, rclone will serve SFTP over stdio, which can be used with sshd via ~/.ssh/authorized_keys, for example:
restrict,command="rclone serve sftp --stdio ./photos" ssh-rsa ...
On the client you need to set --transfers 1 when using --stdio. Otherwise multiple instances of the rclone server are started by OpenSSH which can lead to "corrupted on transfer" errors. This is the case because the client chooses indiscriminately which server to send commands to while the servers all have different views of the state of the filing system. It's chaos, honestly ๐
The "restrict" in authorized_keys prevents SHA1SUMs and MD5SUMs from being used. Omitting "restrict" and using --sftp-path-override to enable checksumming is possible but less secure and you could use the SFTP server provided by OpenSSH in this case. Choose wisely, bestie ๐ซถ
๐๏ธ VFS - Virtual File System
This command uses the VFS layer. This adapts the cloud storage objects that rclone uses into something which looks much more like a disk filing system.
Cloud storage objects have lots of properties which aren't like disk files โ you can't extend them or write to the middle of them, so the VFS layer has to deal with that. Because there is no one right way of doing this there are various options explained below.
The VFS layer also implements a directory cache โ this caches info about files and directories (but not the data) in memory.
๐ VFS Directory Cache
Using the --dir-cache-time flag, you can control how long a directory should be considered up to date and not refreshed from the backend. Changes made through the VFS will appear immediately or invalidate the cache.
--dir-cache-time durationโ Time to cache directory entries for (default5m0s)--poll-interval durationโ Time to wait between polling for changes. Must be smaller thandir-cache-time. Only on supported remotes. Set to0to disable (default1m0s)
However, changes made directly on the cloud storage by the web interface or a different copy of rclone will only be picked up once the directory cache expires if the backend configured does not support polling for changes. If the backend supports polling, changes will be picked up within the polling interval.
You can send a SIGHUP signal to rclone for it to flush all directory caches, regardless of how old they are. Assuming only one rclone instance is running, you can reset the cache like this:
kill -SIGHUP $(pidof rclone)
If you configure rclone with a remote control then you can use rclone rc to flush the whole directory cache:
rclone rc vfs/forget
Or individual files or directories:
rclone rc vfs/forget file=path/to/file dir=path/to/dir
๐งบ VFS File Buffering
The --buffer-size flag determines the amount of memory, that will be used to buffer data in advance.
Each open file will try to keep the specified amount of data in memory at all times. The buffered data is bound to one open file and won't be shared. Every file keeps its own lil stash ๐
This flag is a upper limit for the used memory per open file. The buffer will only use memory for data that is downloaded but not yet read. If the buffer is empty, only a small amount of memory will be used.
The maximum memory used by rclone for buffering can be up to --buffer-size * open files. Math time โจ
๐พ VFS File Caching
These flags control the VFS file caching options. File caching is necessary to make the VFS layer appear compatible with a normal file system. It can be disabled at the cost of some compatibility.
For example you'll need to enable VFS caching if you want to read and write simultaneously to a file. See below for more details.
Note that the VFS cache is separate from the cache backend and you may find that you need one or the other or both. They're different girlies, don't mix them up ๐
--cache-dir stringโ Directory rclone will use for caching.--vfs-cache-mode CacheModeโ Cache modeoff|minimal|writes|full(defaultoff)--vfs-cache-max-age durationโ Max time since last access of objects in the cache (default1h0m0s)--vfs-cache-max-size SizeSuffixโ Max total size of objects in the cache (defaultoff)--vfs-cache-min-free-space SizeSuffixโ Target minimum free space on the disk containing the cache (defaultoff)--vfs-cache-poll-interval durationโ Interval to poll the cache for stale objects (default1m0s)--vfs-write-back durationโ Time to writeback files after last use when using cache (default5s)
If run with -vv rclone will print the location of the file cache. The files are stored in the user cache file area which is OS dependent but can be controlled with --cache-dir or setting the appropriate environment variable.
The cache has 4 different modes selected by --vfs-cache-mode. The higher the cache mode the more compatible rclone becomes at the cost of using disk space. Trade-offs, bestie, always trade-offs ๐
Note that files are written back to the remote only when they are closed and if they haven't been accessed for --vfs-write-back seconds. If rclone is quit or dies with files that haven't been uploaded, these will be uploaded next time rclone is run with the same flags. It literally remembers for you ๐ซถ
If using --vfs-cache-max-size or --vfs-cache-min-free-space note that the cache may exceed these quotas for two reasons. Firstly because it is only checked every --vfs-cache-poll-interval. Secondly because open files cannot be evicted from the cache. When --vfs-cache-max-size or --vfs-cache-min-free-space is exceeded, rclone will attempt to evict the least accessed files from the cache first. rclone will start with files that haven't been accessed for the longest. This cache flushing strategy is efficient and more relevant files are likely to remain cached ๐
The <code>--vfs-cache-max-age</code> evicts files from the cache once the set time has passed since last access โ bestie, it's judging by access time, not by when the file first got added to the cache, ok? The default is 1 hour, so anything you haven't touched in an hour starts getting yeeted out of the cache. Touch a cached file and that 1 hour timer resets to 0 and waits another whole hour before it evicts again โจ. Write the duration in standard notation: s, m, h, d, w ๐
.
๐จ GIRL. LISTEN. Do not run two copies of rclone using the same VFS cache with the same remotes โ or even overlapping ones โ if you're running--vfs-cache-mode > off. That can literally corrupt your data, and not in a cute way ๐ญ. The workaround: give each rclone its own cache hierarchy with--cache-dir. If the remotes in play don't overlap, you don't have to worry about any of this ๐ซถ.
--vfs-cache-mode off
This is the default, and honestly it's giving no thoughts, head empty. The cache reads straight from the remote and writes straight to the remote โ nothing gets cached on disk at all. ๐
Which means some operations are just... not possible:
- Files can't be opened for both read AND write ๐ญ
- Files opened for write can't be seeked
- Existing files opened for write must have
O_TRUNCset - Files open for read with
O_TRUNCwill be opened write only - Files open for write only will behave as if
O_TRUNCwas supplied - Open modes
O_APPEND,O_TRUNCare ignored - If an upload fails it can't be retried ๐
--vfs-cache-mode minimal
Basically off's cousin, same vibe, tiny difference: files opened for read AND write get buffered to disk. So files opened for write are a lot more compatible, and it uses the absolute bare minimum of disk space โจ.
These operations are still not possible:
- Files opened for write only can't be seeked
- Existing files opened for write must have
O_TRUNCset - Files opened for write only will ignore
O_APPEND,O_TRUNC - If an upload fails it can't be retried ๐ญ
--vfs-cache-mode writes
Now we're cooking ๐. Files opened read-only still read directly from the remote, but write-only and read/write files get buffered to disk first.
This mode should support all normal file system operations, periodt ๐ .
And if an upload fails? It gets retried at exponentially increasing intervals, up to 1 minute. Growth mindset fr fr ๐ฅ.
--vfs-cache-mode full
The main character of cache modes ๐. Here all reads and writes are buffered to and from disk โ and when data is read from the remote, that gets buffered to disk too.
In this mode the files in the cache are sparse files, and rclone keeps track of exactly which bits of each file it's downloaded ๐ง .
So if an app only reads the starts of each file, rclone only buffers the start of the file. Those files will look full-size in the cache, but bestie they're sparse โ only the data that's actually been downloaded is literally present in them โจ.
This mode should support all normal file system operations, and it's otherwise identical to --vfs-cache-mode writes.
When reading a file, rclone will read --buffer-size plus --vfs-read-ahead bytes ahead. The --buffer-size gets buffered in memory, whereas the --vfs-read-ahead gets buffered on disk.
When you're using this mode, the move is: don't set --buffer-size too large, and set --vfs-read-ahead large if you need it ๐ซถ.
โ ๏ธ IMPORTANT: not all file systems support sparse files. In particular, FAT/exFAT do not. Rclone will perform very badly if the cache directory lives on a filesystem that doesn't support sparse files, and it will log an ERROR message if it detects one. So check before you commit, babe ๐ญ.
Fingerprinting
Various parts of the VFS use fingerprinting to figure out whether a local file copy has changed relative to a remote file ๐ธ. Fingerprints are made from:
- size
- modification time
- hash
...where those are available on an object ๐.
On some backends, some of these attributes are slow to read โ they take an extra API call per object, or extra work per object. Like, the audacity.
For example, hash is slow with the local and sftp backends because they have to read the entire file and hash it ๐ฅฒ. And modtime is slow with the s3, swift, ftp and qinqstor backends because they need to do an extra API call to fetch it.
So if you use the --vfs-fast-fingerprint flag, rclone won't include those slow operations in the fingerprint. It makes the fingerprinting less accurate but much faster, and it improves the opening time of cached files ๐ฅ.
If you're running a vfs cache over local, s3 or swift backends, using this flag is recommended. No cap ๐
.
๐ Heads up: if you change the value of this flag, the fingerprints of the files in the cache may be invalidated, and those files will need to be downloaded again. So like... pick a lane.
VFS Chunked Reading
When rclone reads files from a remote, it reads them in chunks ๐. So instead of requesting the whole entire file, rclone reads the chunk it specified. This can reduce the used download quota on some remotes by only requesting the chunks that are actually read from the remote โ at the cost of an increased number of requests. Trade-offs, bestie โจ.
These flags control the chunking:
--vfs-read-chunk-size SizeSuffix Read the source objects in chunks (default 128M)
--vfs-read-chunk-size-limit SizeSuffix Max chunk doubling size (default off)
--vfs-read-chunk-streams int The number of parallel streams to read at once
The chunking behaves differently depending on the --vfs-read-chunk-streams parameter. Let's get into it ๐
.
--vfs-read-chunk-streams == 0
Rclone starts by reading a chunk of size --vfs-read-chunk-size, and then doubles the size for each read ๐. When --vfs-read-chunk-size-limit is specified and is greater than --vfs-read-chunk-size, the chunk size for each open file gets doubled only until it reaches that specified value. If the value is "off" โ which is the default โ the limit is disabled and the chunk size will grow indefinitely. Iconic, honestly.
With --vfs-read-chunk-size 100M and --vfs-read-chunk-size-limit 0, the following parts will be downloaded: 0-100M, 100M-200M, 200M-300M, 300M-400M and so on โจ. When --vfs-read-chunk-size-limit 500M is specified, the result would be 0-100M, 100M-300M, 300M-700M, 700M-1200M, 1200M-1700M and so on ๐.
Setting --vfs-read-chunk-size to 0 or "off" disables chunked reading entirely.
The chunks will not be buffered in memory. ๐ซถ
--vfs-read-chunk-streams > 0
Rclone reads --vfs-read-chunk-streams chunks of size --vfs-read-chunk-size concurrently ๐ฅ. The size for each read stays constant.
This improves performance massively on high latency links, or very high bandwidth links to high performance object stores ๐ฅ๐ฅ.
Some experimentation will be needed to find the optimum values of --vfs-read-chunk-size and --vfs-read-chunk-streams, because these depend on the backend in use and the latency to that backend. Science, babe ๐งช.
For high performance object stores (eg AWS S3), a reasonable place to start might be --vfs-read-chunk-streams 16 and --vfs-read-chunk-size 4M โญ. In testing with AWS S3, the performance scaled roughly as the --vfs-read-chunk-streams setting.
Similar settings should work for high latency links, but depending on the latency they may need more --vfs-read-chunk-streams in order to get the throughput ๐
VFS Performance
These flags may be used to enable/disable features of the VFS for performance or other reasons โจ. See also the chunked reading feature above.
In particular, S3 and Swift benefit hugely from the --no-modtime flag (or --use-server-modtime for a slightly different effect) โ because every single read of the modification time takes a whole transaction ๐.
--no-checksum Don't compare checksums on up/download.
--no-modtime Don't read/write the modification time (can speed things up).
--no-seek Don't allow seeking in files.
--read-only Only allow read-only access.
Sometimes rclone gets delivered reads or writes out of order ๐. Rather than seeking, rclone will wait a short time for the in-sequence read or write to come in. These flags only come into effect when you're not using an on disk cache file:
--vfs-read-wait duration Time to wait for in-sequence read before seeking (default 20ms)
--vfs-write-wait duration Time to wait for in-sequence write before giving error (default 1s)
When you're using VFS write caching (--vfs-cache-mode with a value of writes or full), the global flag --transfers can be set to adjust the number of parallel uploads of modified files from the cache ๐. (The related global flag --checkers has no effect on the VFS, so don't bother, bestie.)
--transfers int Number of file transfers to run in parallel (default 4)
Symlinks
By default, the VFS does not support symlinks ๐ฅฒ. But it can be enabled with either of these flags:
--links Translate symlinks to/from regular files with a '.rclonelink' extension.
--vfs-links Translate symlinks to/from regular files with a '.rclonelink' extension for the VFS
Since most cloud storage systems don't support symlinks directly, rclone stores the symlink as a normal file with a special extension ๐ฆ. So a file that appears as a symlink link-to-file.txt would be stored on cloud storage as link-to-file.txt.rclonelink, and the contents would be the path to the symlink destination. Sneaky but effective ๐
.
Note that --links enables symlink translation globally in rclone โ that includes any backend which supports the concept (for example the local backend). --vfs-links just enables it for the VFS layer โจ.
This scheme is compatible with the one used by the local backend with the --local-links flag: https://rclone.org/local/#symlinks-junction-points.
The --vfs-links flag has been designed for rclone mount, rclone nfsmount and rclone serve nfs ๐.
It hasn't been tested with the other rclone serve commands yet ๐.
โ ๏ธ A limitation of the current implementation is that it expects the caller to resolve sub-symlinks. For example, given this directory tree:
.
โโโ dir
โ โโโ file.txt
โโโ linked-dir -> dir
The VFS will correctly resolve linked-dir but not linked-dir/file.txt ๐ญ. This is not a problem for the tested commands, but it may be for other commands.
๐ Also note there's an outstanding issue with symlink support โ issue #8245 (https://github.com/rclone/rclone/issues/8245) โ with duplicate files being created when symlinks are moved into directories where there's a file of the same name (or vice versa).
VFS Case Sensitivity
Linux file systems are case-sensitive: two files can differ only by case, and the exact case must be used when opening a file. No shortcuts, bestie ๐ .
File systems in modern Windows are case-insensitive but case-preserving: although existing files can be opened using any case, the exact case used to create the file is preserved and available for programs to query ๐. And it is not allowed for two files in the same directory to differ only by case. The vibes are strict but fair ๐.
So like, usually file systems on macOS are case-insensitive. You can make them case-sensitive, but bestie, that is not the default, okay?
The --vfs-case-insensitive VFS flag is what controls how rclone handles these two situations. If its value is "false", rclone just passes file names to the remote as-is, like a good little messenger. If the flag is "true" (or shows up without a value on the command line), rclone may do a "fixup", which we're about to explain ๐
So picture this: you ask to open/delete/rename/etc. a file name whose case doesn't match what's actually stored on the remote. If some argument points at an existing file with exactly the same name, then the case of the existing file on the disk is what gets used. But โ plot twist โ if a name that's exactly the same isn't found, and instead there's a name differing only by case, rclone will transparently "fixup" the name for you. This fixup only happens when you request an existing file. And the case sensitivity of file names that rclone creates brand new? That's controlled by the underlying remote, not by this flag, periodt.
Heads up: the case sensitivity of the OS rclone is running on (the target) can totally differ from the case sensitivity of the file system rclone is presenting (the source). The flag is what decides whether that "fixup" gets performed so the target gets what it wants.
If the flag isn't on the command line at all, its default depends on the OS rclone runs on: "true" on Windows and macOS, "false" everywhere else. And if you provide the flag with no value? Then it's "true". Simple as ๐
The --no-unicode-normalization flag controls whether a similar "fixup" happens for filenames that differ but are canonically equivalent (https://en.wikipedia.org/wiki/Unicode_equivalence) as far as unicode is concerned. Unicode normalization is lowkey a lifesaver for macOS users, since macOS prefers form NFD instead of the NFC that basically everyone else uses. So it is highly recommended to keep the default of false on macOS, to dodge encoding compatibility issues entirely ๐
In the (probably unlikely, ngl) event that a directory ends up with multiple duplicate filenames after applying case and unicode normalization, the --vfs-block-norm-dupes flag lets you hide those duplicates. The tradeoff? Performance, bestie โ rclone now has to scan the entire directory hunting for duplicates every single time it lists that directory. So yeah, it's recommended to leave this disabled unless you actually need it. However, macOS users might wanna consider it, because otherwise: if a remote directory contains both the NFC and the NFD version of the same filename, a genuinely odd situation occurs. Both versions of the file will be visible in the mount, and both will appear editable, but editing either version actually results in only the NFD version getting edited under the hood ๐ญ --vfs-block-norm-dupes prevents this whole confusing mess by detecting the scenario, hiding the duplicates, and logging an error, kinda like how rclone sync handles it. Iconic behavior, honestly.
๐ง VFS Disk Options ๐ง
This flag lets you manually set the statistics all about the filing system. Super useful when those stats just can't be read correctly automatically โ which happens, and it's not your fault.
--vfs-disk-space-total-size Manually set the total disk space size (example: 256G, default: -1)
๐ Alternate report of used bytes ๐
Some backends โ most famously S3 โ straight up don't report the amount of bytes used. If you need that info available when running df on the filesystem, pass the flag --vfs-used-is-size to rclone. With that flag set, instead of relying on the backend to tell you, rclone scans the whole remote kinda like rclone size does and computes the total used space itself โจ
WARNING: unlike rclone size, this flag ignores filters so the result is accurate. But it is very inefficient and may cost you lots of API calls, which means extra charges ๐ Treat it as a last resort and only use it with caching.
๐ท๏ธ VFS Metadata ๐ท๏ธ
If you use the --vfs-metadata-extension flag, you can get the VFS to expose files containing the metadata (https://rclone.org/docs/#metadata) as a JSON blob. These files will not show up in the directory listing, but they can be stat-ed and opened โ and once they have been, they'll appear in directory listings until the directory cache expires. Sneaky little things ๐ฆ
Note that some backends won't create metadata at all unless you pass in the --metadata flag.
For example, using rclone mount with --metadata --vfs-metadata-extension .metadata we get:
$ ls -l /mnt/
total 1048577
-rw-rw-r-- 1 user user 1073741824 Mar 3 16:03 1G
$ cat /mnt/1G.metadata
{
"atime": "2025-03-04T17:34:22.317069787Z",
"btime": "2025-03-03T16:03:37.708253808Z",
"gid": "1000",
"mode": "100664",
"mtime": "2025-03-03T16:03:39.640238323Z",
"uid": "1000"
}
$ ls -l /mnt/
total 1048578
-rw-rw-r-- 1 user user 1073741824 Mar 3 16:03 1G
-rw-rw-r-- 1 user user 185 Mar 3 16:03 1G.metadata
If the file has no metadata it will be returned as {}, and if there's an error reading the metadata, the error gets returned as {"error":"error string"}. No cap.
๐ Auth Proxy ๐
If you supply the parameter --auth-proxy /path/to/program then rclone will use that program to generate backends on the fly, which are then used to authenticate incoming requests. It runs on a simple JSON based protocol with input on STDIN and output on STDOUT. Very demure, very protocol.
PLEASE NOTE:--auth-proxyand--authorized-keyscannot be used together. If--auth-proxyis set, the authorized keys option will be ignored. Choose one, bestie.
There's an example program bin/test_proxy.py (https://github.com/rclone/rclone/blob/master/bin/test_proxy.py) sitting in the rclone source code if you wanna peek ๐ธ
The program's job is to take a user and pass on the input and turn those into the config for a backend on STDOUT in JSON format. This config will have any default parameters for the backend added, but it won't use configuration from environment variables or command line options โ making a complete config is the proxy program's job, not rclone's.
This config generated must have this extra parameter:
_root- root to use for the backend
And it may have these parameters:
_obscure- comma separated strings for parameters to obscure_secret_access_key- the secret for S3 access key auth (see below)
If password authentication was used by the client, input to the proxy process (on STDIN) would look similar to this:
{
"user": "me",
"pass": "mypassword",
"client_ip": "192.168.1.1"
}
If public-key authentication was used by the client, input to the proxy process (on STDIN) would look similar to this:
{
"user": "me",
"public_key": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDuwESFdAe14hVS6omeyX7edc...JQdf",
"client_ip": "192.168.1.1"
}
If the client authenticated with an S3 access key (rclone serve s3), the client never sends its secret โ only a signature made with it โ so the input contains just the access key ID as the user with no pass or public_key:
{
"user": "AKIAIOSFODNN7EXAMPLE",
"client_ip": "192.168.1.1"
}
In this case the program must look up the secret access key for that access key ID and return it in the _secret_access_key field of the output. Rclone then uses that secret to verify the signature on the request, and refuses the request if it doesn't match. This means the proxy program is the source of truth for both the credentials and the backend they map to. If the program doesn't return _secret_access_key, or returns it empty, the request is refused. Period.
The program's answer for an access key ID is cached (see below) but gets checked with the program again after 5 minutes even if the access key ID is in constant use โ so revoking an access key ID in the program takes effect within 5 minutes. A rotated secret takes effect on the first request signed with it ๐ฅ
The client_ip key holds the IP address the client connected from, without a port number. It can be used to restrict logins to certain networks, or to log authentication attempts centrally. It's omitted if the client has no IP address โ for example when connecting over a unix socket. Note that if rclone is behind a reverse proxy, this will be the address of the reverse proxy and not the original client. Just so you know ๐
And as an example, return this on STDOUT:
{
"type": "sftp",
"_root": "",
"_obscure": "pass",
"user": "me",
"pass": "mypassword",
"host": "sftp.example.com"
}
This would mean an SFTP backend gets created on the fly for the user and pass/public_key returned in the output, pointed at the host given. Note that since _obscure is set to pass, rclone will obscure the pass parameter before creating the backend (which is required for sftp backends, iykyk).
The program can manipulate the supplied user in any way it wants โ for example, to make a proxy to many different sftp backends, you could make the user be user@example.com and then set the host to example.com in the output and the user to user. For security you'd probably wanna restrict the host to a limited list. Do that. Please ๐ซถ
An internal cache of backends is keyed on the user, a hash of the pass or public_key, and the client_ip. This means that if a user's password or public-key changes, the client connects from a new IP address, or the proxy returns different config parameters (eg a rotated api_key), a fresh backend gets created on the next request rather than the cached one being reused. Slay, cache invalidation. โจ
This can be used to build general purpose proxies to any kind of backend that rclone supports ๐
rclone serve sftp remote:path [flags]
--addr stringโ the IPaddress:Port (or just :Port) the server binds to (default"localhost:2022").--auth-proxy stringโ a program you hand the auth to, and it builds the backend for you.--authorized-keys stringโ the authorized keys file (default"~/.ssh/authorized_keys").--dir-cache-time Durationโ how long directory entries get cached (default5m0s).--dir-perms FileModeโ permissions for directories (default777).--file-perms FileModeโ permissions for files (default666).--gid uint32โ overrides the gid field the filesystem sets (windows said no, not supported there) (default1000).-h,--helpโ help forsftp, bestie, it's right there.--key stringArrayโ SSH private host key file, and yes it can be multi-valued; leave it blank and rclone just auto generates one for you โจ--link-perms FileModeโ link permissions (default666).--no-authโ if you set this, connections with literally no authentication are allowed ๐ซฃ--no-checksumโ don't compare checksums on up/download.--no-modtimeโ don't read or write the modification time (can speed things up, lowkey).--no-seekโ don't allow seeking in files.--pass stringโ the password for authentication.--poll-interval Durationโ how long to wait between polling for changes; must be smaller than--dir-cache-timeand only works on supported remotes (set0to disable) (default1m0s).--read-onlyโ read-only access only, no writing, periodt.--stdioโ run an sftp server on stdin/stdout.--uid uint32โ overrides the uid field the filesystem sets (not supported on Windows) (default1000).--umask FileModeโ overrides the permission bits the filesystem sets (not supported on Windows) (default002).--user stringโ the user name for authentication.--vfs-block-norm-dupesโ if duplicate filenames end up in the same directory (after normalization), log an error and hide the duplicates (heads up: this may have a performance cost).--vfs-cache-max-age Durationโ max time since last access for objects sitting in the cache (default1h0m0s).--vfs-cache-max-size SizeSuffixโ max total size of objects in the cache (defaultoff).--vfs-cache-min-free-space SizeSuffixโ target minimum free space on the disk that holds the cache (defaultoff).--vfs-cache-mode CacheModeโ the cache mode, one ofoff|minimal|writes|full(defaultoff).--vfs-cache-poll-interval Durationโ how often to poll the cache for stale objects (default1m0s).--vfs-case-insensitiveโ if a filename isn't found, go find a case-insensitive match instead.--vfs-disk-space-total-size SizeSuffixโ specify the total space of disk (defaultoff).--vfs-fast-fingerprintโ use fast (less accurate) fingerprints for change detection.--vfs-handle-caching Durationโ how long to keep the file handle and downloaders alive after the last close (default5s).--vfs-linksโ translate symlinks to/from regular files with a.rclonelinkextension, for the VFS.--vfs-metadata-extension stringโ set the extension to read metadata from.--vfs-read-ahead SizeSuffixโ extra read ahead over--buffer-sizewhen using cache-mode full.--vfs-read-chunk-size SizeSuffixโ read the source objects in chunks (default128Mi).--vfs-read-chunk-size-limit SizeSuffixโ if this is greater than--vfs-read-chunk-size, the chunk size doubles after each chunk read until the limit is hit ('off'means unlimited) (defaultoff).--vfs-read-chunk-streams intโ how many parallel streams to read at once.--vfs-read-wait Durationโ how long to wait for an in-sequence read before seeking (default20ms).--vfs-refreshโ refreshes the directory cache recursively in the background on start ๐--vfs-used-is-size rclone sizeโ use therclone sizealgorithm for the Used size.--vfs-write-back Durationโ how long to write back files after last use when using cache (default5s).--vfs-write-wait Durationโ how long to wait for an in-sequence write before throwing an error (default1s).
The options shared with other commands are described right up next. And if you want the global options that aren't listed here, go peek at the global flags page (<https://rclone.org/flags/>).
๐ธ Filter Options ๐ธ
Flags for filtering your directory listings, aka the "no thank you, not that file" toolkit:
--delete-excludedโ delete files on dest that were excluded from sync.--exclude stringArrayโ exclude files matching a pattern.--exclude-from stringArrayโ read exclude patterns from a file (use-to read from stdin).--exclude-if-present stringArrayโ exclude directories if this filename is present.--files-from stringArrayโ read a list of source-file names from a file (use-to read from stdin).--files-from-raw stringArrayโ read a list of source-file names from a file without any processing of the lines (use-to read from stdin).--files-from0 stringArrayโ read a list of source-file names from a file using NUL as the separator (use-to read from stdin).-f,--filter stringArrayโ add a file filtering rule.--filter-from stringArrayโ read file filtering patterns from a file (use-to read from stdin).--hash-filter stringโ partition filenames by hashk/nor randomly@/n.--ignore-caseโ ignore case in filters (case insensitive, obviously ๐ ).--include stringArrayโ include files matching a pattern.--include-from stringArrayโ read include patterns from a file (use-to read from stdin).--max-age Durationโ only transfer files younger than this, insor with a suffixms|s|m|h|d|w|M|y(defaultoff).--max-depth intโ if set, limits the recursion depth to this (default-1).--max-size SizeSuffixโ only transfer files smaller than this, in KiB or with a suffixB|K|M|G|T|P(defaultoff).--metadata-exclude stringArrayโ exclude metadatas matching a pattern.--metadata-exclude-from stringArrayโ read metadata exclude patterns from a file (use-to read from stdin).--metadata-filter stringArrayโ add a metadata filtering rule.--metadata-filter-from stringArrayโ read metadata filtering patterns from a file (use-to read from stdin).--metadata-include stringArrayโ include metadatas matching a pattern.--metadata-include-from stringArrayโ read metadata include patterns from a file (use-to read from stdin).--min-age Durationโ only transfer files older than this, insor with a suffixms|s|m|h|d|w|M|y(defaultoff).--min-size SizeSuffixโ only transfer files bigger than this, in KiB or with a suffixB|K|M|G|T|P(defaultoff).
๐ See Also ๐
rclone serve(<https://rclone.org/commands/rclone_serve/>) โ Serve a remote over a protocol.
๐ rclone serve webdav ๐
Serve remote:path over WebDAV. Yes bestie, WebDAV, it's giving ancient-but-iconic and we love her for it.
โจ Synopsis โจ
Run a basic WebDAV server to serve a remote over HTTP via the WebDAV protocol. You can view it with a WebDAV client, through a web browser, or you can make a remote of type WebDAV to read and write it.
๐ WebDAV options ๐
--etag-hash
This controls the ETag header. Without this flag, the ETag is based on the ModTime and Size of the object.
If you set this flag to "auto" then rclone picks the first supported hash on the backend, or you can use a named hash like "MD5" or "SHA-1". Run the hashsum command (<https://rclone.org/commands/rclone_hashsum/>) to see the whole list. Go off.
Gzip compression
The server will compress certain response bodies (text and XML, including WebDAV PROPFIND responses) using gzip whenever the client advertises gzip support via the Accept-Encoding: gzip request header. Fewer bytes over the wire, everybody wins ๐
Access WebDAV on Windows
A WebDAV shared folder can be mapped as a drive on Windows, but the default settings are actively working against you, bestie. Windows will fail to connect to the server using insecure Basic authentication. It won't even show you a login dialog. Windows requires an SSL / HTTPS connection to be used with Basic. If you try to connect via the Add Network Location Wizard you'll get this error: "The folder you entered does not appear to be valid. Please choose another". That's not a vibe.
But plot twist โ you can still connect if you set the following registry key on the client machine: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WebClient\Parameters\BasicAuthLevel to 2.
The BasicAuthLevel can be set to the following values:
0 - Basic authentication disabled
1 - Basic authentication enabled for SSL connections only
2 - Basic authentication enabled for SSL connections and for non-SSL connections
If you need to, increase the FileSizeLimitInBytes to a higher value too. Then navigate to the Services interface, and restart the WebClient service. That's the whole ritual. ๐ฏ๏ธ
Access Office applications on WebDAV
Navigate to the following registry: HKEY_CURRENT_USER\Software\Microsoft\Office\[14.0/15.0/16.0]\Common\Internet. Create a new DWORD BasicAuthLevel with value 2.
0 - Basic authentication disabled
1 - Basic authentication enabled for SSL connections only
2 - Basic authentication enabled for SSL and for non-SSL connections
<https://learn.microsoft.com/en-us/office/troubleshoot/powerpoint/office-opens-blank-from-sharepoint>
Serving over a unix socket
You can serve the webdav on a unix socket like this:
rclone serve webdav --addr unix:///tmp/my.socket remote:path
and connect to it like this using rclone and the webdav backend:
rclone --webdav-unix-socket /tmp/my.socket --webdav-url http://localhost lsf :webdav:
Note that there is no authentication on http protocol โ that's expected to be handled by the permissions on the socket. iykyk ๐
Symlinks / Junction points
The webdav protocol does not support symlinks or junction points, and by default rclone will skip them completely.
You can use -L to get rclone to follow symlinks, or you can use --local-links to make rclone show .rclonelink files in place of the symlinks.
NB Do not use--links, because as of v1.69 it applies to the VFS layer too. Use--local-links, which only applies to the local backend. No cap, save yourself the confusion. ๐
Server options
Okay bestie, this is where you decide exactly how your server shows up to the world ๐
--addrโ tells rclone which IP address and port to listen on. Like--addr 1.2.3.4:8000, or--addr :8080if you wanna listen on all the IPs. Default behaviour? It only listens on localhost, so it's โจcozyโจ by default. You can use port:0to let the OS pick whatever port is free โ it's giving "you choose, I trust you".
If you set --addr to listen on a public or LAN accessible IP address then using Authentication is advised โ peep the next section for the deets, okay? ๐ซถ
You can use a unix socket by setting the url to unix:///path/to/socket, or just by using an absolute path name.
--addr may be repeated to listen on multiple IPs/ports/sockets. Socket activation (more on that below) can also be used to accomplish the same thing. Versatile queen ๐
--server-read-timeoutand--server-write-timeoutโ control the timeouts on the server. Heads up tho: this is the total time for a transfer, not per-chunk. Clock starts, clock ends, no takebacks โณ--max-header-bytesโ controls the maximum number of bytes the server will accept in the HTTP header.--response-headerโ sets an HTTP header for all responses, will overriding existing values. The flag may be repeated to add multiple headers. Use the formatHeader-Name: value.--allow-originโ enables cross-origin (CORS) requests from browsers by setting theAccess-Control-Allow-Originheader on every response to the origin given, e.g.--allow-origin https://app.example.com. Browser CORS preflightOPTIONSrequests are answered by rclone without needing authentication as browsers never send credentials with them. Setting this to*allows any origin which is a security risk on an authenticated server. โ ๏ธ
Real talk: * on an authenticated server is a security risk. Not me warning you twice, but also not me not warning you twice.
--baseurlโ controls the URL prefix that rclone serves from. By default rclone will serve from the root. If you used--baseurl "/rclone"then rclone would serve from a URL starting with"/rclone/". This is useful if you wish to proxy rclone serve. Rclone automatically inserts leading and trailing"/"on--baseurl, so--baseurl "rclone",--baseurl "/rclone"and--baseurl "/rclone/"are all treated identically. Same energy, three fits ๐--disable-zipโ may be set to disable the zipping download option.
Protocol
The server supports HTTP/1.1 and HTTP/2. HTTP/2 is used automatically for TLS connections. For non-TLS connections, HTTP/2 cleartext (h2c) is supported, allowing HTTP/2 without encryption. No TLS, still fancy. We love a flexible icon ๐
TLS (SSL)
By default this will serve over http. If you want you can serve over https โ you'll need to supply the --cert and --key flags. If you wish to do client side certificate validation then you will need to supply --client-ca also.
When TLS is configured every listener given with --addr serves TLS. An individual listener can be prefixed with http:// to serve unencrypted HTTP on that address, or with tls:// to state explicitly that it must serve TLS. Using a tls:// address without --cert and --key is an error. ๐จ
--certโ must be set to the path of a file containing either a PEM encoded certificate, or a concatenation of that with the CA certificate.--keyโ must be set to the path of a file with the PEM encoded private key.--client-caโ if setting it, it should be set to the path of a file with PEM encoded client certificate authority certificates.--min-tls-versionโ is the minimum TLS version that is acceptable. Valid values are"tls1.0","tls1.1","tls1.2"and"tls1.3"(default"tls1.0").
Socket activation
Instead of the listening addresses specified above, rclone will listen to all FDs passed by the service manager, if any (and ignore any arguments passed by --addr). Yeah, it just hands the whole address conversation to the service manager. Not me showing up to a party and letting someone else pick the playlist ๐ง
This allows rclone to be a socket-activated service. It can be configured with .socket and .service unit files as described in <https://www.freedesktop.org/software/systemd/man/latest/systemd.socket.html>.
Socket activation can be tested ad-hoc with the systemd-socket-activate command:
systemd-socket-activate -l 8000 -- rclone serve
This will socket-activate rclone on the first connection to port 8000 over TCP. Literally it just waits for someone to knock and then โจmaterializesโจ.
Template
--template allows a user to specify a custom markup template for HTTP and WebDAV serve functions. The server exports the following markup to be used within the template to server pages:
.Nameโ The full path of a file/directory..Titleโ Directory listing of.Name..Sortโ The current sort used. This is changeable via'?sort='parameter. Possible values:namedirfirst,name,size,time(defaultnamedirfirst)..Orderโ The current ordering used. This is changeable via'?order='parameter. Possible values:asc,desc(defaultasc)..Queryโ Currently unused..Breadcrumbโ Allows for creating a relative navigation..Linkโ The link of the Text relative to the root..Textโ The Name of the directory.
.Entriesโ Information about a specific file/directory..URLโ The url of an entry..Leafโ Currently same as.URLbut intended to be just the name..IsDirโ Boolean for if an entry is a directory or not..Sizeโ Size in bytes of the entry..ModTimeโ The UTC timestamp of an entry.
The server also makes the following functions available so that they can be used within the template. These functions help extend the options for dynamic rendering of HTML. They can be used to render HTML based on specific conditions.
afterEpochโ Returns the time since the epoch for the given time.containsโ Checks whether a given substring is present or not in a given string.hasPrefixโ Checks whether the given string begins with the specified prefix.hasSuffixโ Checks whether the given string end with the specified suffix.
Authentication
By default this will serve files without needing a login. Chill! But maybe too chill depending on where you're serving ๐
You can either use an htpasswd file which can take lots of users, or set a single username and password with the --user and --pass flags.
Alternatively, you can have the reverse proxy manage authentication and use the username provided in the configured header with --user-from-header (e.g., --user-from-header=x-remote-user). Ensure the proxy is trusted and headers cannot be spoofed, as misconfiguration may lead to unauthorized access. Do not skip the trusted-proxy part, bestie, I'm begging.
If either of the above authentication methods is not configured and client certificates are required by the --client-ca flag passed to the server, the client certificate common name will be considered as the username.
Use --htpasswd /path/to/htpasswd to provide an htpasswd file. This is in standard apache format and supports MD5, SHA1 and BCrypt for basic authentication. Bcrypt is recommended. ๐
To create an htpasswd file:
touch htpasswd
htpasswd -B htpasswd user
htpasswd -B htpasswd anotherUser
The password file can be updated while rclone is running. Live updates, no restart, so slay โจ
When authentication is enabled every request must be authenticated, including HTTP OPTIONS requests, as the answer to an OPTIONS request can reveal whether a path exists. Health checks or monitoring which use unauthenticated OPTIONS requests will need to send credentials. The exception is browser CORS preflight requests when --allow-origin is set, which are answered without authentication as browsers never send credentials with them.
--realmโ use it to set the authentication realm.--saltโ use it to change the password hashing salt from the default.
VFS - Virtual File System
This command uses the VFS layer. This adapts the cloud storage objects that rclone uses into something which looks much more like a disk filing system. It's giving โจillusionโจ, but a useful one.
Cloud storage objects have lots of properties which aren't like disk files โ you can't extend them or write to the middle of them, so the VFS layer has to deal with that. Because there is no one right way of doing this there are various options explained below.
The VFS layer also implements a directory cache โ this caches info about files and directories (but not the data) in memory. Metadata only, no data hoarding ๐
VFS Directory Cache
Using the --dir-cache-time flag, you can control how long a directory should be considered up to date and not refreshed from the backend. Changes made through the VFS will appear immediately or invalidate the cache. So either it shows up instantly or it nukes the cache and starts over โ either way you're not staring at stale listings, periodt ๐
--dir-cache-time duration Time to cache directory entries for (default 5m0s)
--poll-interval duration Time to wait between polling for changes. Must be smaller than dir-cache-time. Only on supported remotes. Set to 0 to disable (default 1m0s)
okay so lowkey the sad part: if you go change stuff directly on the cloud (like through the web UI, or from a whole different rclone copy ๐), your rclone won't even notice until the directory cache expires โ unless your backend does polling, in which case it catches the vibe within the polling interval. iykyk.
But bestie, here's the cheat code: send a SIGHUP signal to rclone and it flushes all the directory caches, no matter how stale they are. Assuming you've only got one rclone running (main character behavior, we love that), reset the cache like:
kill -SIGHUP $(pidof rclone)
And if you've got rclone set up with a remote control, you can use rclone rc to nuke the whole directory cache:
rclone rc vfs/forget
Or, if you're being surgical about it, individual files or directories:
rclone rc vfs/forget file=path/to/file dir=path/to/dir
โจ VFS File Buffering โจ
The --buffer-size flag is the amount of memory rclone uses to buffer data in advance. ๐ง
Every open file will try to keep that amount of data in memory at all times. The buffered data is bound to one open file โ it does not get shared, so no stealing from your bestie's buffer. ๐ โโ๏ธ
This flag is an upper limit for how much memory each open file can use. The buffer only actually eats memory for data that's been downloaded but not read yet. If the buffer is empty, it barely uses anything. slay.
But watch out: the maximum memory rclone can burn on buffering can be up to --buffer-size * open files. yes, multiply it. do the math. ๐ฅ
โจ VFS File Caching โจ
These flags control all the VFS file caching options. File caching is what makes the VFS layer act like a normal file system โ it's giving real-filesystem energy. It can be disabled, but that costs you some compatibility.
Like, for example, you'll need VFS caching enabled if you want to read and write to a file at the same time. See below for the deets. ๐
small PSA: the VFS cache is totally separate from the cache backend. you might need one, the other, or literally both. no cap.
--cache-dirstring โ Directory rclone will use for caching.--vfs-cache-modeCacheMode โ Cache modeoff|minimal|writes|full(defaultoff)--vfs-cache-max-ageduration โ Max time since last access of objects in the cache (default1h0m0s)--vfs-cache-max-sizeSizeSuffix โ Max total size of objects in the cache (defaultoff)--vfs-cache-min-free-spaceSizeSuffix โ Target minimum free space on the disk containing the cache (defaultoff)--vfs-cache-poll-intervalduration โ Interval to poll the cache for stale objects (default1m0s)--vfs-write-backduration โ Time to writeback files after last use when using cache (default5s)
If you run with -vv, rclone will print where the file cache lives. ๐ The files are stored in the user cache file area โ which is OS dependent โ but you can control it with --cache-dir or by setting the appropriate environment variable.
The cache has 4 different modes, picked by --vfs-cache-mode. The higher the cache mode, the more compatible rclone becomesโฆ at the cost of your disk space. tradeoffs, bestie. ๐
Also important: files are only written back to the remote when they're closed and if they haven't been accessed for --vfs-write-back seconds. If rclone quits or straight-up dies with files that haven't uploaded yet ๐ญ, those will get uploaded the next time rclone runs with the same flags. it remembers. iconic.
If you're using --vfs-cache-max-size or --vfs-cache-min-free-space, heads up โ the cache can actually exceed those quotas, for two reasons:
- Because it's only checked every
--vfs-cache-poll-interval. - Because open files cannot be evicted from the cache. (they're busy!!)
When --vfs-cache-max-size or --vfs-cache-min-free-space is exceeded, rclone tries to evict the least accessed files first. It starts with the files that haven't been accessed for the longest. This flushing strategy is efficient, and it means the more relevant files are likely to stay cached. โจ
The --vfs-cache-max-age will evict files from the cache after the set time since last access has passed. key detail: it's based on access time, not on when the file was first added to the cache. The default value of 1 hour starts evicting files that haven't been accessed for 1 hour. And when a cached file gets accessed, that 1 hour timer resets to 0 and waits another full hour before evicting. โฐ Specify the time with standard notation: s, m, h, d, w.
๐ do NOT run two copies of rclone using the same VFS cache with the same or overlapping remotes if you're using--vfs-cache-mode > off. This can potentially cause data corruption. for real. You can work around it by giving each rclone its own cache hierarchy with--cache-dir. You don't gotta worry about any of this if your remotes don't overlap.
--vfs-cache-mode off
In this mode (the default) the cache reads directly from the remote and writes directly to the remote, caching absolutely nothing on disk. ๐ซฅ
This means some operations are justโฆ not possible:
- Files can't be opened for both read AND write
- Files opened for write can't be seeked
- Existing files opened for write must have
O_TRUNCset - Files open for read with
O_TRUNCwill be opened write only - Files open for write only will behave as if
O_TRUNCwas supplied - Open modes
O_APPEND,O_TRUNCare ignored - If an upload fails it can't be retried
--vfs-cache-mode minimal
This is very similar to off, except that files opened for read AND write will be buffered to disk. That means files opened for write are way more compatible, but it uses the minimal amount of disk space. ๐ธ
These operations are not possible:
- Files opened for write only can't be seeked
- Existing files opened for write must have
O_TRUNCset - Files opened for write only will ignore
O_APPEND,O_TRUNC - If an upload fails it can't be retried
--vfs-cache-mode writes
In this mode, files opened for read only are still read directly from the remote, but write only and read/write files get buffered to disk first. ๐
This mode should support all normal file system operations. periodt.
If an upload fails, it will be retried at exponentially increasing intervals up to 1 minute. we love a resilient queen.
--vfs-cache-mode full
In this mode, all reads and writes are buffered to and from disk. And when data is read from the remote, that gets buffered to disk too. the full package. ๐
In this mode the files in the cache will be sparse files, and rclone keeps track of which bits of the files it has downloaded. ๐
So if an application only reads the starts of each file, rclone will only buffer the start of the file. These files will appear to be their full size in the cache, but they're sparse files with only the downloaded data actually present in them. the illusion. โจ
This mode should support all normal file system operations and is otherwise identical to --vfs-cache-mode writes.
When reading a file, rclone will read --buffer-size plus --vfs-read-ahead bytes ahead. The --buffer-size is buffered in memory, whereas the --vfs-read-ahead is buffered on disk.
When using this mode it's recommended that --buffer-size is not set too large, and --vfs-read-ahead is set large if required.
โ ๏ธ IMPORTANT: not all file systems support sparse files. In particular FAT/exFAT do not. Rclone will perform very badly if the cache directory is on a filesystem that doesn't support sparse files, and it will log an ERROR message if one is detected. you've been warned bestie.
โจ Fingerprinting โจ
Various parts of the VFS use fingerprinting to see if a local file copy has changed relative to a remote file. Fingerprints are made from:
- size
- modification time
- hash
โฆwhere available on an object. ๐
On some backends, some of these attributes are slow to read (they take an extra API call per object, or extra work per object). ๐
For example, hash is slow with the local and sftp backends because they have to read the entire file and hash it, and modtime is slow with the s3, swift, ftp and qinqstor backends because they need to do an extra API call to fetch it.
If you use the --vfs-fast-fingerprint flag, then rclone will not include those slow operations in the fingerprint. This makes fingerprinting less accurate but much faster, and it'll improve the opening time of cached files. speed. ๐๏ธ
If you're running a vfs cache over local, s3 or swift backends, then using this flag is recommended. ๐
note: if you change the value of this flag, the fingerprints of the files in the cache may be invalidated and the files will need to be downloaded again. it's giving "start over". ๐ญ
โจ VFS Chunked Reading โจ
When rclone reads files from a remote, it reads them in chunks. That means instead of requesting the whole file, rclone reads the specified chunk. This can reduce your used download quota for some remotes, because it only requests the chunks that are actually read โ at the cost of an increased number of requests. worth it? depends. ๐ฆ
These flags control the chunking:
--vfs-read-chunk-sizeSizeSuffix โ Read the source objects in chunks (default128M)--vfs-read-chunk-size-limitSizeSuffix โ Max chunk doubling size (defaultoff)--vfs-read-chunk-streamsint โ The number of parallel streams to read at once
The chunking behaves differently depending on the --vfs-read-chunk-streams parameter.
--vfs-read-chunk-streams == 0
Rclone will start reading a chunk of size --vfs-read-chunk-size, and then double the size for each read. When --vfs-read-chunk-size-limit is specified, and is greater than --vfs-read-chunk-size, the chunk size for each open file gets doubled only until the specified value is reached. If the value is "off" (which is the default), the limit is disabled and the chunk size will grow indefinitely. ๐
With --vfs-read-chunk-size 100M and --vfs-read-chunk-size-limit 0, the following parts will be downloaded: 0-100M, 100M-200M, 200M-300M, 300M-400M and so on. When --vfs-read-chunk-size-limit 500M is specified, the result would be 0-100M, 100M-300M, 300M-700M, 700M-1200M, 1200M-1700M and so on. the math is mathing. ๐ฅ
Setting --vfs-read-chunk-size to 0 or "off" disables chunked reading.
The chunks will not be buffered in memory. nope, not even a little.
--vfs-read-chunk-streams > 0
Rclone reads --vfs-read-chunk-streams chunks of size --vfs-read-chunk-size concurrently. The size for each read will stay constant. ๐
This improves performance massively on high latency links or very high bandwidth links to high performance object stores. it's giving main character energy. ๐
Some experimentation will be needed to find the optimum values of --vfs-read-chunk-size and --vfs-read-chunk-streams, as these will depend on the backend in use and the latency to the backend. tune it, bestie. ๐
okay so for high-performance object stores (think AWS S3, the girlies with real speed) a lowkey reasonable place to start is --vfs-read-chunk-streams 16 and --vfs-read-chunk-size 4M. and ngl, in testing with AWS S3 the performance scaled roughly as the --vfs-read-chunk-streams setting went. it's giving linear, bestie. ๐
similar settings should work for high latency links too, but depending on the latency they may need more --vfs-read-chunk-streams in order to get the throughput. high latency = more streams, iykyk.
โจ VFS Performance โจ
these flags are here to enable/disable features of the VFS for performance reasons or just... other reasons ๐ see also the chunked reading feature.
in particular S3 and Swift benefit hugely from the --no-modtime flag (or use --use-server-modtime for a slightly different effect) because every single read of the modification time takes a transaction. literally every one. that's so many transactions bestie ๐ญ
--no-checksumโ don't compare checksums on up/download.--no-modtimeโ don't read/write the modification time (can speed things up โจ).--no-seekโ don't allow seeking in files.--read-onlyโ only allow read-only access.
sometimes rclone gets delivered reads or writes out of order ๐ and instead of seeking, rclone will wait a short time for the in-sequence read or write to come in. these flags only come into effect when you're not using an on disk cache file, so no cap:
--vfs-read-wait durationโ time to wait for in-sequence read before seeking (default20ms)--vfs-write-wait durationโ time to wait for in-sequence write before giving error (default1s)
when using VFS write caching (that's --vfs-cache-mode with the value writes or full), the global flag --transfers can be set to adjust the number of parallel uploads of modified files from the cache. and fyi the related global flag --checkers has no effect on the VFS, so don't even try it ๐ซถ
--transfers intโ number of file transfers to run in parallel (default4)
๐ฆ Symlinks ๐ฆ
by default the VFS does not support symlinks. that's just the vibe. BUT you can turn it on with either of these flags:
--linksโ translate symlinks to/from regular files with a.rclonelinkextension.--vfs-linksโ translate symlinks to/from regular files with a.rclonelinkextension for the VFS
since most cloud storage systems do not support symlinks directly (rude of them honestly), rclone stores the symlink as a normal file with a special extension. so a file that appears as a symlink link-to-file.txt would be stored on cloud storage as link-to-file.txt.rclonelink, and the contents would be the path to the symlink destination. sneaky but iconic ๐
note that--linksenables symlink translation globally in rclone โ that includes any backend which supports the concept (for example the local backend).--vfs-linksjust enables it for the VFS layer.
this scheme is compatible with the one used by the local backend with the --local-links flag (https://rclone.org/local/#symlinks-junction-points).
the --vfs-links flag has been designed for rclone mount, rclone nfsmount and rclone serve nfs.
it hasn't been tested with the other rclone serve commands yet. so like... proceed with caution bestie ๐
a limitation of the current implementation is that it expects the caller to resolve sub-symlinks. for example, given this directory tree:
.
โโโ dir
โ โโโ file.txt
โโโ linked-dir -> dir
the VFS will correctly resolve linked-dir but not linked-dir/file.txt. this is not a problem for the tested commands but it may be for other commands. ๐
note that there is an outstanding issue with symlink support โ issue #8245 (https://github.com/rclone/rclone/issues/8245) โ with duplicate files being created when symlinks are moved into directories where there is a file of the same name (or vice versa). ๐
๐ธ VFS Case Sensitivity ๐ธ
Linux file systems are case-sensitive: two files can differ only by case, and the exact case must be used when opening a file. strict. no notes.
file systems in modern Windows are case-insensitive but case-preserving: although existing files can be opened using any case, the exact case used to create the file is preserved and available for programs to query. but it is not allowed for two files in the same directory to differ only by case. okay so basically windows remembers your capitalization but doesn't care about it when you're searching ๐
usually file systems on macOS are case-insensitive. it is possible to make macOS file systems case-sensitive but that is not the default.
the --vfs-case-insensitive VFS flag controls how rclone handles these two cases. if its value is "false", rclone passes file names to the remote as-is. if the flag is "true" (or appears without a value on the command line), rclone may perform a "fixup" as explained below. โจ
the user may specify a file name to open/delete/rename/etc with a case different than what is stored on the remote. if an argument refers to an existing file with exactly the same name, then the case of the existing file on the disk will be used. however, if a file name with exactly the same name is not found but a name differing only by case exists, rclone will transparently fixup the name. this fixup happens only when an existing file is requested. case sensitivity of file names created anew by rclone is controlled by the underlying remote.
note that case sensitivity of the operating system running rclone (the target) may differ from case sensitivity of a file system presented by rclone (the source). the flag controls whether "fixup" is performed to satisfy the target.
if the flag is not provided on the command line, then its default value depends on the operating system where rclone runs: "true" on Windows and macOS, "false" otherwise. if the flag is provided without a value, then it is "true".
the --no-unicode-normalization flag controls whether a similar "fixup" is performed for filenames that differ but are canonically equivalent (https://en.wikipedia.org/wiki/Unicode_equivalence) with respect to unicode. unicode normalization can be particularly helpful for users of macOS, which prefers form NFD instead of the NFC used by most other platforms. it is therefore highly recommended to keep the default of false on macOS, to avoid encoding compatibility issues. bestie just leave it alone on mac fr fr ๐
in the (probably unlikely) event that a directory has multiple duplicate filenames after applying case and unicode normalization, the --vfs-block-norm-dupes flag allows hiding these duplicates. this comes with a performance tradeoff, as rclone will have to scan the entire directory for duplicates when listing a directory. for this reason, it is recommended to leave this disabled if not needed. however, macOS users may wish to consider using it, as otherwise, if a remote directory contains both NFC and NFD versions of the same filename, an odd situation will occur: both versions of the file will be visible in the mount, and both will appear to be editable, however, editing either version will actually result in only the NFD version getting edited under the hood. --vfs-block-norm-dupes prevents this confusion by detecting this scenario, hiding the duplicates, and logging an error, similar to how this is handled in rclone sync. ๐ so yeah, mac girlies, maybe turn it on.
๐ VFS Disk Options ๐
this flag allows you to manually set the statistics about the filing system. it can be useful when those statistics cannot be read correctly automatically. manual mode activated ๐
--vfs-disk-space-total-sizeโ manually set the total disk space size (example:256G, default:-1)
โญ Alternate report of used bytes โญ
some backends, most notably S3, do not report the amount of bytes used. rude. if you need this information to be available when running df on the filesystem, then pass the flag --vfs-used-is-size to rclone. with this flag set, instead of relying on the backend to report this information, rclone will scan the whole remote similar to rclone size and compute the total used space itself. it's doing the math, bestie ๐งฎ
WARNING: contrary to rclone size, this flag ignores filters so that the result is accurate. however, this is very inefficient and may cost lots of API calls resulting in extra charges. ๐ธ use it as a last resort and only with caching.
๐ VFS Metadata ๐
if you use the --vfs-metadata-extension flag you can get the VFS to expose files which contain the metadata (https://rclone.org/docs/#metadata) as a JSON blob. these files will not appear in the directory listing, but can be stat-ed and opened and once they have been they will appear in directory listings until the directory cache expires. sneaky metadata files, living their little double life ๐ง
note that some backends won't create metadata unless you pass in the --metadata flag.
for example, using rclone mount with --metadata --vfs-metadata-extension .metadata we get:
$ ls -l /mnt/
total 1048577
-rw-rw-r-- 1 user user 1073741824 Mar 3 16:03 1G
$ cat /mnt/1G.metadata
{
"atime": "2025-03-04T17:34:22.317069787Z",
"btime": "2025-03-03T16:03:37.708253808Z",
"gid": "1000",
"mode": "100664",
"mtime": "2025-03-03T16:03:39.640238323Z",
"uid": "1000"
}
$ ls -l /mnt/
total 1048578
-rw-rw-r-- 1 user user 1073741824 Mar 3 16:03 1G
-rw-rw-r-- 1 user user 185 Mar 3 16:03 1G.metadata
if the file has no metadata it will be returned as {} and if there is an error reading the metadata the error will be returned as {"error":"error string"}.
๐ฅ Auth Proxy ๐ฅ
if you supply the parameter --auth-proxy /path/to/program then rclone will use that program to generate backends on the fly which then are used to authenticate incoming requests. main character energy, honestly. this uses a simple JSON based protocol with input on STDIN and output on STDOUT.
PLEASE NOTE:--auth-proxyand--authorized-keyscannot be used together, if--auth-proxyis set the authorized keys option will be ignored. ๐ค
there is an example program bin/test_proxy.py (https://github.com/rclone/rclone/blob/master/bin/test_proxy.py) in the rclone source code.
the program's job is to take a user and pass on the input and turn those into the config for a backend on STDOUT in JSON format. this config will have any default parameters for the backend added, but it won't use configuration from environment variables or command line options โ it is the job of the proxy program to make a complete config. no shortcuts, bestie ๐ซถ
this config generated must have this extra parameter
_root- root to use for the backend
and it may have these parameters
_obscure- comma separated strings for parameters to obscure_secret_access_key- the secret for S3 access key auth (see below)
if password authentication was used by the client, input to the proxy process (on STDIN) would look similar to this:
{
"user": "me",
"pass": "mypassword",
"client_ip": "192.168.1.1"
}
if public-key authentication was used by the client, input to the proxy process (on STDIN) would look similar to this:
...and it's giving very specific bestie. Let's get into what the auth-proxy actually spits back at rclone, because this part is all about the shape of that JSON. ๐
When the client authenticates with an SSH key, the JSON rclone feeds to your proxy program looks like this:
{
"user": "me",
"public_key": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDuwESFdAe14hVS6omeyX7edc...JQdf",
"client_ip": "192.168.1.1"
}
Now listen, if the client authenticated with an S3 access key (that's the rclone serve s3 vibe), the client never sends its secret โ it only sends a signature made with it. So the input you get is just the access key ID chilling in the user field, no pass or public_key in sight:
{
"user": "AKIAIOSFODNN7EXAMPLE",
"client_ip": "192.168.1.1"
}
When that happens, your program has to go look up the secret access key for that access key ID and hand it back in the _secret_access_key field of the output. Then rclone uses that secret to verify the signature on the request, and if it doesn't match, bestie, that request is refused. ๐
So basically your proxy program is the source of truth for both the credentials and the backend they map to. No cap. And if your program doesn't return _secret_access_key, or returns it empty? Request refused. Periodt.
Your program's answer for an access key ID gets cached (more on that lower down ๐), but rclone still checks back with the program after 5 minutes even if that access key ID is in constant use. So if you revoke an access key ID in your program, it takes effect within 5 minutes. A rotated secret takes effect on the first request signed with it. โจ
The client_ip key holds the IP address the client connected from, with no port number. You can use it to gate logins to certain networks, or to log authentication attempts all centrally. It gets omitted if the client has no IP address โ like when connecting over a unix socket, for example. And heads up: if rclone is sitting behind a reverse proxy, this will be the address of the reverse proxy, not the original client. ๐
And as an example, return this on STDOUT:
{
"type": "sftp",
"_root": "",
"_obscure": "pass",
"user": "me",
"pass": "mypassword",
"host": "sftp.example.com"
}
What this means: an SFTP backend gets created on the fly, for the user and pass/public_key returned in the output, pointing at the host you gave. And note โ since _obscure is set to pass, rclone will obscure the pass parameter before creating the backend (which is required for sftp backends, don't @ me).
Your program can manipulate the supplied user in any way it wants. Like, to proxy to a bunch of different sftp backends, you could make the user be user@example.com and then set the host to example.com in the output and the user to just user. For security you'd probably want to restrict the host to a limited list though. ๐
There's an internal cache of backends that's keyed on the user, a hash of the pass or public_key, and the client_ip. So if a user's password or public-key changes, the client connects from a new IP address, or the proxy returns different config parameters (like a rotated api_key), a fresh backend gets created on the next request instead of the cached one being reused. Slay. ๐
This whole thing can be used to build general purpose proxies to any kind of backend that rclone supports. Iconic, honestly.
rclone serve webdav remote:path [flags]
๐ Options ๐
--addr stringArrayโ IPaddress:Port or :Port to bind server to (default127.0.0.1:8080)--allow-origin stringโ Origin which cross-domain request (CORS) can be executed from--auth-proxy stringโ A program to use to create the backend from the auth--baseurl stringโ Prefix for URLs - leave blank for root--cert stringโ TLS PEM key (concatenation of certificate and CA certificate)--client-ca stringโ Client certificate authority to verify clients with--dir-cache-time Durationโ Time to cache directory entries for (default5m0s)--dir-perms FileModeโ Directory permissions (default777)--disable-dir-listโ Disable HTML directory list on GET request for a directory--disable-zipโ Disable zip download of directories--etag-hash stringโ Which hash to use for the ETag, orautoor blank for off--file-perms FileModeโ File permissions (default666)--gid uint32โ Override the gid field set by the filesystem (not supported on Windows) (default1000)-h,--helpโ help for webdav--htpasswd stringโ A htpasswd file - if not provided no authentication is done--key stringโ TLS PEM Private key--link-perms FileModeโ Link permissions (default666)--max-header-bytes intโ Maximum size of request header (default4096)--min-tls-version stringโ Minimum TLS version that is acceptable (default"tls1.0")--no-checksumโ Don't compare checksums on up/download--no-modtimeโ Don't read/write the modification time (can speed things up)--no-seekโ Don't allow seeking in files--pass stringโ Password for authentication--poll-interval Durationโ Time to wait between polling for changes, must be smaller thandir-cache-timeand only on supported remotes (set0to disable) (default1m0s)--read-onlyโ Only allow read-only access--realm stringโ Realm for authentication--response-header stringArrayโ Set HTTP header for all responses, overriding existing values--salt stringโ Password hashing salt (default"dlPL2MqE")--server-read-timeout Durationโ Timeout for server reading data (default1h0m0s)--server-write-timeout Durationโ Timeout for server writing data (default1h0m0s)--template stringโ User-specified template--uid uint32โ Override the uid field set by the filesystem (not supported on Windows) (default1000)--umask FileModeโ Override the permission bits set by the filesystem (not supported on Windows) (default002)--user stringโ User name for authentication--user-from-header stringโ User name from a defined HTTP header--vfs-block-norm-dupesโ If duplicate filenames exist in the same directory (after normalization), log an error and hide the duplicates (may have a performance cost)--vfs-cache-max-age Durationโ Max time since last access of objects in the cache (default1h0m0s)--vfs-cache-max-size SizeSuffixโ Max total size of objects in the cache (defaultoff)--vfs-cache-min-free-space SizeSuffixโ Target minimum free space on the disk containing the cache (defaultoff)--vfs-cache-mode CacheModeโ Cache modeoff|minimal|writes|full(defaultoff)--vfs-cache-poll-interval Durationโ Interval to poll the cache for stale objects (default1m0s)--vfs-case-insensitiveโ If a file name not found, find a case insensitive match--vfs-disk-space-total-size SizeSuffixโ Specify the total space of disk (defaultoff)--vfs-fast-fingerprintโ Use fast (less accurate) fingerprints for change detection--vfs-handle-caching Durationโ Time to keep file handle and downloaders alive after last close (default5s)--vfs-linksโ Translate symlinks to/from regular files with a'.rclonelink'extension for the VFS--vfs-metadata-extension stringโ Set the extension to read metadata from--vfs-read-ahead SizeSuffixโ Extra read ahead over--buffer-sizewhen using cache-mode full--vfs-read-chunk-size SizeSuffixโ Read the source objects in chunks (default128Mi)--vfs-read-chunk-size-limit SizeSuffixโ If greater than--vfs-read-chunk-size, double the chunk size after each chunk read, until the limit is reached ('off'is unlimited) (defaultoff)--vfs-read-chunk-streams intโ The number of parallel streams to read at once--vfs-read-wait Durationโ Time to wait for in-sequence read before seeking (default20ms)--vfs-refreshโ Refreshes the directory cache recursively in the background on start--vfs-used-is-size rclone sizeโ Use the rclone size algorithm for Used size--vfs-write-back Durationโ Time to writeback files after last use when using cache (default5s)--vfs-write-wait Durationโ Time to wait for in-sequence write before giving error (default1s)
Options shared with other commands are described next. See the global flags page (<https://rclone.org/flags/>) for global options not listed here. ๐ซถ
๐ Filter Options ๐
Flags for filtering directory listings
--delete-excludedโ deletes stuff on the destination that got excluded from the sync. yes it's as spicy as it sounds ๐--exclude stringArrayโ exclude files matching a pattern--exclude-from stringArrayโ read file exclude patterns from a file (pass-to read from stdin)--exclude-if-present stringArrayโ nuke whole directories if that filename is present in them--files-from stringArrayโ read list of source-file names from file (use-to read from stdin)--files-from-raw stringArrayโ read list of source-file names from file with zero processing of the lines (use-to read from stdin)--files-from0 stringArrayโ read list of source-file names from file using NUL as the separator (use-to read from stdin)-f,--filter stringArrayโ add a file filtering rule โจ--filter-from stringArrayโ read file filtering patterns from a file (use-to read from stdin)--hash-filter stringโ partition filenames by hash,k/n, or randomly with@/n--ignore-caseโ ignore case in filters (case insensitive bestie)--include stringArrayโ include files matching pattern--include-from stringArrayโ read file include patterns from file (use-to read from stdin)--max-age Durationโ only transfer files younger than this, insor with a suffix ofms|s|m|h|d|w|M|y(defaultoff)--max-depth intโ if set, limits the recursion depth to this (default-1)--max-size SizeSuffixโ only transfer files smaller than this, in KiB or with a suffix ofB|K|M|G|T|P(defaultoff)--metadata-exclude stringArrayโ exclude metadatas matching pattern--metadata-exclude-from stringArrayโ read metadata exclude patterns from file (use-to read from stdin)--metadata-filter stringArrayโ add a metadata filtering rule--metadata-filter-from stringArrayโ read metadata filtering patterns from a file (use-to read from stdin)--metadata-include stringArrayโ include metadatas matching pattern--metadata-include-from stringArrayโ read metadata include patterns from file (use-to read from stdin)--min-age Durationโ only transfer files older than this, insor with a suffix ofms|s|m|h|d|w|M|y(defaultoff)--min-size SizeSuffixโ only transfer files bigger than this, in KiB or with a suffix ofB|K|M|G|T|P(defaultoff)
๐ See Also {#see-also}
rclone serveโ Serve a remote over a protocol. (https://rclone.org/commands/rclone_serve/)
๐ rclone settier
Changes storage class/tier of objects in remote. it's giving glow up for your files fr fr ๐
๐ Synopsis
Changes the storage tier or class at the remote if the backend even supports that. A few cloud storage services offer different storage classes on objects โ think AWS S3 and Glacier, Azure Blob storage with its Hot, Cool and Archive, Google Cloud Storage, Regional Storage, Nearline, Coldline, etc.
Lowkey important: certain tier changes make objects not available to access immediately. For example, tiering to archive in azure blob storage makes objects in frozen state, and the user can restore by setting tier to Hot/Cool. Similarly S3 to Glacier makes object inaccessible.true ๐ญ
You can use it to tier a single object:
rclone settier Cool remote:path/file
Or use rclone filters to set the tier on only specific files:
rclone --include "*.txt" settier Hot remote:path/dir
Or just hand it a remote directory and every file in that directory gets tiered:
rclone settier tier remote:path/dir
rclone settier tier remote:path [flags]
โ๏ธ Options
-h,--helpโ help for settier
See the global flags page (https://rclone.org/flags/) for global options not listed here.
๐ See Also
rcloneโ Show help for rclone commands, flags and backends. (https://rclone.org/commands/rclone/)
๐งช rclone test
Run a test command. we're in the lab now besties ๐ฌโจ
๐ Synopsis
Rclone test is used to run test commands.
Pick which test command you want with the subcommand, e.g.
rclone test memory remote:
Each subcommand has its own options which you can see in their help.
NB: be careful running these commands, they may do strange things, so reading their documentation first is recommended. not a drill bestie ๐
โ๏ธ Options
-h,--helpโ help for test
See the global flags page (https://rclone.org/flags/) for global options not listed here.
๐ See Also
rcloneโ Show help for rclone commands, flags and backends. (https://rclone.org/commands/rclone/)rclone test changenotifyโ Log any change notify requests for the remote passed in. (https://rclone.org/commands/rclone_test_changenotify/)rclone test histogramโ Makes a histogram of file name characters. (https://rclone.org/commands/rclone_test_histogram/)rclone test infoโ Discovers file name or other limitations for paths. (https://rclone.org/commands/rclone_test_info/)rclone test makefileโ Make files with random contents of the size given (https://rclone.org/commands/rclone_test_makefile/)rclone test makefilesโ Make a random file hierarchy in a directory (https://rclone.org/commands/rclone_test_makefiles/)rclone test memoryโ Load all the objects atremote:pathinto memory and report memory stats. (https://rclone.org/commands/rclone_test_memory/)rclone test speedโ Run a speed test to the remote (https://rclone.org/commands/rclone_test_speed/)
๐ก rclone test changenotify
Log any change notify requests for the remote passed in. it's literally just vibing and eavesdropping on your remote ๐๐
rclone test changenotify remote: [flags]
โ๏ธ Options
-h,--helpโ help for changenotify--poll-interval Durationโ Time to wait between polling for changes (default10s)
See the global flags page (https://rclone.org/flags/) for global options not listed here.
๐ See Also
rclone testโ Run a test command (https://rclone.org/commands/rclone_test/)
๐ rclone test histogram
Makes a histogram of file name characters. charlie xcx would approve ๐
๐ Synopsis
This command outputs JSON which shows the histogram of characters used in filenames in the remote:path specified.
The data doesn't contain any identifying information but is useful for the rclone developers when developing filename compression. so you're basically doing charity work for the devs, iconic of you ๐ซถ
rclone test histogram [remote:path] [flags]
โ๏ธ Options
-h,--helpโ help for histogram
See the global flags page (https://rclone.org/flags/) for global options not listed here.
๐ See Also
rclone testโ Run a test command (https://rclone.org/commands/rclone_test/)
๐ rclone test info
Discovers file name or other limitations for paths. detective mode activated ๐ต๏ธโโ๏ธ
๐ Synopsis
Discovers what filenames and upload methods are possible to write to the paths passed in, and how long they can be. It can take some time. It will write test files into the remote:path passed in. It outputs a bit of go code for each one.
NB this can create undeletable files and other hazards โ use with care! not me creating immortal files ๐ญ๐
rclone test info [remote:path]+ [flags]
โ๏ธ Options
--allโ Run all tests--check-base32768โ Check can store all possible base32768 characters--check-controlโ Check control characters--check-lengthโ Check max filename length--check-normalizationโ Check UTF-8 Normalization--check-streamingโ Check uploads with indeterminate file size-h,--helpโ help for info--keep-test-filesโ Keep test files after execution--upload-wait Durationโ Wait after writing a file (default0s)--write-json stringโ Write results to file
See the global flags page (https://rclone.org/flags/) for global options not listed here.
๐ See Also
rclone testโ Run a test command (https://rclone.org/commands/rclone_test/)
๐ rclone test makefile
Make files with random contents of the size given. arts and crafts era ๐โจ
rclone test makefile <size> [<file>]+ [flags]
โ๏ธ Options
--asciiโ Fill files with random ASCII printable bytes only--chargenโ Fill files with a ASCII chargen pattern-h,--helpโ help for makefile--patternโ Fill files with a periodic pattern--seed intโ Seed for the random number generator (0for random) (default1)--sparseโ Make the files sparse (appear to be filled with ASCII0x00)--zeroโ Fill files with ASCII0x00
See the global flags page (https://rclone.org/flags/) for global options not listed here.
๐ See Also
rclone testโ Run a test command (https://rclone.org/commands/rclone_test/)
๐๏ธ rclone test makefiles
Make a random file hierarchy in a directory. building a whole little world fr fr ๐ฆ
rclone test makefiles <dir> [flags]
โ๏ธ Options
--asciiโ Fill files with random ASCII printable bytes only--chargenโ Fill files with a ASCII chargen pattern--files intโ Number of files to create (default1000)--files-per-directory intโ Average number of files per directory (default10)--flatโ If set create all files in the root directory-h,--helpโ help for makefiles--max-depth intโ Maximum depth of directory hierarchy (default10)--max-file-size SizeSuffixโ Maximum size of files to create (default100)--max-name-length intโ Maximum size of file names (default12)--min-file-size SizeSuffixโ Minimum size of file to create--min-name-length intโ Minimum size of file names (default4)--patternโ Fill files with a periodic pattern--seed intโ Seed for the random number generator (0for random) (default1)--sparseโ Make the files sparse (appear to be filled with ASCII0x00)--zeroโ Fill files with ASCII0x00
See the global flags page (https://rclone.org/flags/) for global options not listed here.
๐ See Also
rclone testโ Run a test command (https://rclone.org/commands/rclone_test/)
๐ง rclone test memory
Load all the objects at remote:path into memory and report memory stats. RAM girlies rise ๐ซถ๐
rclone test memory remote:path [flags]
โ๏ธ Options
-h,--helpโ help for memory
See the global flags page (https://rclone.org/flags/) for global options not listed here.
๐ See Also
rclone testโ Run a test command (https://rclone.org/commands/rclone_test/)
rclone test speed ๐จ
Run a speed test to the remote.
โจ Synopsis โจ
Run a speed test to the remote.
This command runs a series of uploads and downloads to the remote, measuring and printing the speed of each test using varying file sizes and numbers of files.
Test time can be inaccurate with small file caps and large files. As it uses the results of an initial test to determine how many files to use in each subsequent test.
It is recommended to use the -q flag for a simpler output. e.g.:
rclone test speed remote: -q
NB This command will create and delete files on the remote in a randomly named directory which will be automatically removed on a clean exit. ๐
You can use the --json flag to only print the results in JSON format.
rclone test speed <remote> [flags]
๐ Options ๐
--asciiโ Fill files with random ASCII printable bytes only--chargenโ Fill files with a ASCII chargen pattern--file-capint โ Maximum number of files to use in each test (default100)-h,--helpโ help for speed--jsonโ Output only results in JSON format--largeSizeSuffix โ Size of large files (default1Gi)--mediumSizeSuffix โ Size of medium files (default10Mi)--patternโ Fill files with a periodic pattern--seedint โ Seed for the random number generator (0for random) (default1)--smallSizeSuffix โ Size of small files (default1Ki)--sparseโ Make the files sparse (appear to be filled with ASCII0x00)--test-timeDuration โ Length for each test to run (default15s)--zeroโ Fill files with ASCII0x00
See the global flags page (https://rclone.org/flags/) for global options not listed here.
๐ฆ See Also ๐ฆ
rclone testโ Run a test command (https://rclone.org/commands/rclone_test/)
rclone touch ๐โจ
Create new file or change file modification time.
โจ Synopsis โจ
Set the modification time on file(s) as specified by remote:path to have the current time.
If remote:path does not exist then a zero sized file will be created, unless --no-create or --recursive is provided.
If --recursive is used then recursively sets the modification time on all existing files that is found under the path. Filters are supported, and you can test with the --dry-run or the --interactive/-i flag. This will touch --transfers files concurrently.
If --timestamp is used then sets the modification time to that time instead of the current time. Times may be specified as one of:
'YYMMDD'- e.g.17.10.30'YYYY-MM-DDTHH:MM:SS'- e.g.2006-01-02T15:04:05'YYYY-MM-DDTHH:MM:SS.SSS'- e.g.2006-01-02T15:04:05.123456789
Note that value of--timestampis in UTC. If you want local time then add the--localtimeflag. ๐ฐ๏ธ
Metadata can be added when creating a new file with --metadata-set. For example: rclone touch remote:path -M --metadata-set key=value
rclone touch remote:path [flags]
๐ Options ๐
-h,--helpโ help for touch--localtimeโ Use localtime for timestamp, not UTC-C,--no-createโ Do not create the file if it does not exist (implied with--recursive)-R,--recursiveโ Recursively touch all files-t,--timestampstring โ Use specified time instead of the current time of day
Options shared with other commands are described next. See the global flags page (https://rclone.org/flags/) for global options not listed here.
๐ Important Options ๐
Important flags useful for most commands
-n,--dry-runโ Do a trial run with no permanent changes-i,--interactiveโ Enable interactive mode-v,--verbosecount โ Print lots more stuff (repeat for more)
๐ธ Filter Options ๐ธ
Flags for filtering directory listings
--delete-excludedโ Delete files on dest excluded from sync--excludestringArray โ Exclude files matching pattern--exclude-fromstringArray โ Read file exclude patterns from file (use-to read from stdin)--exclude-if-presentstringArray โ Exclude directories if filename is present--files-fromstringArray โ Read list of source-file names from file (use-to read from stdin)--files-from-rawstringArray โ Read list of source-file names from file without any processing of lines (use-to read from stdin)--files-from0stringArray โ Read list of source-file names from file using NUL as separator (use-to read from stdin)-f,--filterstringArray โ Add a file filtering rule--filter-fromstringArray โ Read file filtering patterns from a file (use-to read from stdin)--hash-filterstring โ Partition filenames by hash k/n or randomly @/n--ignore-caseโ Ignore case in filters (case insensitive)--includestringArray โ Include files matching pattern--include-fromstringArray โ Read file include patterns from file (use-to read from stdin)--max-ageDuration โ Only transfer files younger than this in s or suffix ms|s|m|h|d|w|M|y (default off)--max-depthint โ If set limits the recursion depth to this (default-1)--max-sizeSizeSuffix โ Only transfer files smaller than this in KiB or suffix B|K|M|G|T|P (default off)--metadata-excludestringArray โ Exclude metadatas matching pattern--metadata-exclude-fromstringArray โ Read metadata exclude patterns from file (use-to read from stdin)--metadata-filterstringArray โ Add a metadata filtering rule--metadata-filter-fromstringArray โ Read metadata filtering patterns from a file (use-to read from stdin)--metadata-includestringArray โ Include metadatas matching pattern--metadata-include-fromstringArray โ Read metadata include patterns from file (use-to read from stdin)--min-ageDuration โ Only transfer files older than this in s or suffix ms|s|m|h|d|w|M|y (default off)--min-sizeSizeSuffix โ Only transfer files bigger than this in KiB or suffix B|K|M|G|T|P (default off)
๐ Listing Options ๐
Flags for listing directories
--default-timeTime โ Time to show if modtime is unknown for files and directories (default2000-01-01T00:00:00Z)--fast-listโ Use recursive list if available; uses more memory but fewer transactions
๐ฆ See Also ๐ฆ
rcloneโ Show help for rclone commands, flags and backends. (https://rclone.org/commands/rclone/)
rclone tree ๐ณ๐
List the contents of the remote in a tree like fashion.
โจ Synopsis โจ
Lists the contents of a remote in a similar way to the unix tree command.
For example
$ rclone tree remote:path
/
โโโ file1
โโโ file2
โโโ file3
โโโ subdir
โโโ file4
โโโ file5
1 directories, 5 files
You can use any of the filtering options with the tree command (e.g. --include and --exclude. You can also use --fast-list.
The tree command has many options for controlling the listing which are compatible with the tree command, for example you can include file sizes with --size. Note that not all of them have short options as they conflict with rclone's short options. ๐
For a more interactive navigation of the remote see the ncdu command (https://rclone.org/commands/rclone_ncdu/).
rclone tree remote:path [flags]
๐ Options ๐
-a,--allโ All files are listed (list.files too)-d,--dirs-onlyโ List directories only--dirsfirstโ List directories before files (-Udisables)--full-pathโ Print the full path prefix for each file-h,--helpโ help for tree--levelint โ Descend only level directories deep-D,--modtimeโ Print the date of last modification.--noindentโ Don't print indentation lines--noreportโ Turn off file/directory count at end of tree listing-o,--outputstring โ Output to file instead of stdout-p,--protectionsโ Print the protections for each file.-Q,--quoteโ Quote filenames with double quotes.-s,--sizeโ Print the size in bytes of each file.--sortstring โ Select sort: name,version,size,mtime,ctime--sort-ctimeโ Sort files by last status change time-t,--sort-modtimeโ Sort files by last modification time-r,--sort-reverseโ Reverse the order of the sort-U,--unsortedโ Leave files unsorted--versionโ Sort files alphanumerically by version
Options shared with other commands are described next. See the global flags page (https://rclone.org/flags/) for global options not listed here.
๐ธ Filter Options ๐ธ
Flags for filtering directory listings
--delete-excludedโ nukes files on the dest that got excluded from the sync ๐๏ธ--exclude stringArrayโ excludes files that match the pattern--exclude-from stringArrayโ reads your exclude patterns out of a file (drop a-in there to read from stdin)--exclude-if-present stringArrayโ if this filename is present, the whole directory gets excluded, bye ๐--files-from stringArrayโ reads a list of source-file names from a file (again,-means stdin)--files-from-raw stringArrayโ reads a list of source-file names from a file with zero processing of the lines (and yes,-= stdin)--files-from0 stringArrayโ reads a list of source-file names from a file using NUL as the separator (you guessed it,-reads from stdin)-f,--filter stringArrayโ adds a file filtering rule, the fancy one โจ--filter-from stringArrayโ reads file filtering patterns from a file (use-to read from stdin)--hash-filter stringโ partitions filenames by hashk/nor randomly@/n--ignore-caseโ ignores case in filters (case insensitive, so chill)--include stringArrayโ includes files matching the pattern--include-from stringArrayโ reads file include patterns from a file (use-to read from stdin)--max-age Durationโ only transfers files younger than this, insor with a suffixms|s|m|h|d|w|M|y(defaultoff)--max-depth intโ if you set it, it caps the recursion depth right there (default-1)--max-size SizeSuffixโ only transfers files smaller than this, in KiB or with a suffixB|K|M|G|T|P(defaultoff)--metadata-exclude stringArrayโ excludes metadatas matching the pattern--metadata-exclude-from stringArrayโ reads metadata exclude patterns from a file (use-to read from stdin)--metadata-filter stringArrayโ adds a metadata filtering rule--metadata-filter-from stringArrayโ reads metadata filtering patterns from a file (use-to read from stdin)--metadata-include stringArrayโ includes metadatas matching the pattern--metadata-include-from stringArrayโ reads metadata include patterns from a file (use-to read from stdin)--min-age Durationโ only transfers files older than this, insor with a suffixms|s|m|h|d|w|M|y(defaultoff)--min-size SizeSuffixโ only transfers files bigger than this, in KiB or with a suffixB|K|M|G|T|P(defaultoff)
๐ธ Listing Options ๐ธ
Flags for listing directories, bestie. Very demure, very mindful.
--default-time Timeโ the time it shows when the modtime is unknown for files and directories (default2000-01-01T00:00:00Z)--fast-listโ uses a recursive list if the backend has it; costs you more memory but way fewer transactions ๐
๐ See Also ๐
rcloneโ Show help for rclone commands, flags and backends. (https://rclone.org/commands/rclone/)
๐ซถ Copying single files ๐ซถ
okay so real talk: rclone normally syncs or copies whole directories. But if the source remote points at a file, rclone will just copy that one file, no drama. The destination remote has to point to a directory though โ if it doesn't, rclone hits you with this bad boy:
Failed to create file system for "remote:file": is a file not a directory
So if you've got a remote with a file in it called test.jpg, you can copy literally just that one file like this:
rclone copy remote:test.jpg /tmp/download
And test.jpg lands inside /tmp/download. Cute.
That's exactly equivalent to specifying:
rclone copy --files-from /tmp/files remote: /tmp/download
where /tmp/files contains the single line:
test.jpg
๐ก Pro tip from your girl: when you're copying individual files, usecopy, notsync. They do pretty much the same thing, butcopyuses a lot less memory. Periodt.
๐ง Syntax of remote paths ๐ง
The syntax of the paths you hand to the rclone command goes like this, bestie. Buckle up.
๐ /path/to/dir ๐
This one refers to the local file system.
On Windows you can use \ instead of /, but only in local paths โ non-local paths must use /. Peep the local filesystem docs for more on Windows-specific paths: https://rclone.org/local/#paths-on-windows.
Good news: these paths don't have to start with a leading /. If they don't, they're relative to your current directory. Slay.
๐ remote:path/to/dir ๐
This refers to a directory path/to/dir on remote:, as defined in the config file (the one you set up with rclone config).
๐ซ remote:/path/to/dir ๐ซ
On most backends this means the exact same directory as remote:path/to/dir, and honestly that format should be your default. But on a very small number of remotes (FTP, SFTP, Dropbox for business) this points to a different directory. On those, paths without a leading / refer to your "home" directory, and paths with a leading / refer to the root root. Rooty root.
๐ฆ :backend:path/to/dir ๐ฆ
This is the advanced form for creating remotes on the fly. backend should be the name or prefix of a backend (the type in the config file), and all the config for that backend should be given on the command line (or in environment variables).
Here are some examples:
rclone lsd --http-url https://pub.rclone.org :http:
To list all the directories in the root of https://pub.rclone.org/.
rclone lsf --http-url https://example.com :http:path/to/dir
To list files and directories in https://example.com/path/to/dir/.
rclone copy --http-url https://example.com :http:path/to/dir /tmp/dir
To copy files and directories in https://example.com/path/to/dir to /tmp/dir.
rclone copy --sftp-host example.com :sftp:path/to/dir /tmp/dir
To copy files and directories from example.com in the relative directory path/to/dir to /tmp/dir using sftp.
๐ Connection strings ๐
All those examples up there can also be written using a connection string syntax โ so instead of passing the args as command line parameters like --http-url https://pub.rclone.org, you tuck them right into the remote specification as a kind of connection string. Obsessed.
rclone lsd ":http,url='https://pub.rclone.org':"
rclone lsf ":http,url='https://example.com':path/to/dir"
rclone copy ":http,url='https://example.com':path/to/dir" /tmp/dir
rclone copy :sftp,host=example.com:path/to/dir /tmp/dir
These can modify existing remotes as well as create new ones with that on-the-fly syntax. This next example is equivalent to adding the --drive-shared-with-me parameter to the remote gdrive:.
rclone lsf "gdrive,shared_with_me:path/to/dir"
The major advantage of the connection string style is that it only applies to that one remote, not to all the remotes of that type on the command line. A super common confusion is this attempt to copy a file shared on google drive over to the normal drive, which does not work, because the --drive-shared-with-me flag applies to both the source and the destination:
rclone copy --drive-shared-with-me gdrive:shared-file.txt gdrive:
But using the connection string syntax? It works. Look at that:
rclone copy "gdrive,shared_with_me:shared-file.txt" gdrive:
Just know that the connection string only affects the options of the immediate backend. So if, say, gdriveCrypt is a crypt based on gdrive, this next command will not do what you want, because shared_with_me gets ignored by the crypt backend. ๐ญ
rclone copy "gdriveCrypt,shared_with_me:shared-file.txt" gdriveCrypt:
Connection strings have this syntax:
remote,parameter=value,parameter2=value2:path/to/dir
:backend,parameter=value,parameter2=value2:path/to/dir
If the parameter contains a : or a ,, it has to go inside quotes โ " or ' โ so:
remote,parameter="colon:value",parameter2="comma,value":path/to/dir
:backend,parameter='colon:value',parameter2='comma,value':path/to/dir
And if a quoted value needs to include that quote, you double it up, like:
remote,parameter="with""quote",parameter2='with''quote':path/to/dir
That makes parameter be with"quote and parameter2 be with'quote. Very demure, very mindful quoting.
If you leave off the =parameter entirely, rclone will substitute =true, which plays so nicely with flags. For example, to use s3 configured in the environment you could do:
rclone lsd :s3,env_auth:
which is equivalent to:
rclone lsd :s3,env_auth=true:
Heads up though: on the command line you might need to wrap these connection strings in " or ' so your shell doesn't go interpreting special characters inside them. Rude of it, honestly.
If you're a shell master then you already know which strings are fine and which aren't. But if you're not sure, enclose them in " and use ' as the inside quote. This syntax works on all OSes.
rclone copy ":http,url='https://example.com':path/to/dir" /tmp/dir
On Linux/macOS some characters still get interpreted inside " strings in the shell (notably \ and $ and "), so if your strings contain those, you can swap the roles of " and ' like this. (This syntax does not work on Windows. Sorry Windows girlies. ๐)
rclone copy ':http,url="https://example.com":path/to/dir' /tmp/dir
You can use rclone config string (https://rclone.org/commands/rclone_config_string/) to convert a remote into a connection string. Handy.
๐ Connection strings, config and logging ๐
If you supply extra configuration to a backend via a command line flag, an environment variable, or a connection string, then rclone will add a suffix based on the hash of the config to the name of the remote, eg
rclone -vv lsf --s3-chunk-size 20M s3:
has the log message
DEBUG : s3: detected overridden config - adding "{Srj1p}" suffix to name
This is so rclone can tell the modified remote apart from the unmodified remote when it's caching backends. It's literally just a log thing, you probably won't notice it anywhere else.
Which means on-the-fly backends such as
rclone -vv lsf :s3,env_auth:
will get their own names:
DEBUG : :s3: detected overridden config - adding "{YTu53}" suffix to name
โญ Valid remote names โญ
Remote names are case sensitive, and they must follow these rules:
- May contain number, letter,
_,-,.,+,@and space. - May not start with
-or space. - May not end with space.
Starting with rclone version 1.61, any Unicode numbers and letters are allowed โ before that it was limited to plain ASCII (0-9, A-Z, a-z). If you use the same rclone configuration from different shells, which may be configured with different character encoding, you must be cautious and only use characters that are possible to write in all of them. This is mostly a problem on Windows, where the console traditionally uses a non-Unicode character set โ defined by the so-called "code page". ๐
okay so real talk bestie: do not use single-character names on Windows ๐ it creates ambiguity with Windows drives' names, like a remote called C is literally indistinguishable from the C drive. rclone will always assume that a single letter name refers to a drive. That's just how it is, no cap.
๐ Adding global configuration to a remote ๐
So you can add global configuration to the remote configuration, and it gets applied just before the remote is created. Two ways to do it:
- the first is to use
override.var = valuein the config file or the connection string for a temporary change - the second is to use
global.var = valuein the config file or connection string for a permanent change
This is explained fully below ๐
override.var
This is used to override a global variable just for the duration of the remote creation. It won't affect other remotes even if they are created at the same time. Iconic behaviour honestly.
This is very useful for overriding networking config needed just for that remote. For example, say you have a remote which needs --no-check-certificate as it is running on test infrastructure without a proper certificate. You could supply the --no-check-certificate flag to rclone, but this will affect all the remotes. To make it just affect this remote you use an override. You could put this in the config file:
[remote]
type = XXX
...
override.no_check_certificate = true
or use it in the connection string remote,override.no_check_certificate=true: (or just remote,override.no_check_certificate:).
Note how the global flag name loses its initial -- and gets - replaced with _ and gets an override. prefix. Lowkey a glow-up for a flag name โจ
Not all global variables make sense to be overridden like this as the config is only applied during the remote creation. Here is a non exhaustive list of ones which might be useful:
bind_addrca_certclient_certclient_keyconnect_timeoutdisable_http2disable_http_keep_alivesdumpexpect_continue_timeoutheadershttp_proxylow_level_retriesmax_connectionsno_check_certificateno_gziptimeouttraffic_classuse_cookiesuse_server_modtimeuser_agent
An override.var will override all other config methods, but just for the duration of the creation of the remote. Ate and left no crumbs ๐
global.var
This is used to set a global variable for everything. The global variable is set just before the remote is created.
This is useful for parameters (eg sync parameters) which can't be set as an override. For example, say you have a remote where you would always like to use the --checksum flag. You could supply the --checksum flag to rclone on every command line, but instead you could put this in the config file:
[remote]
type = XXX
...
global.checksum = true
or use it in the connection string remote,global.checksum=true: (or just remote,global.checksum:). This is equivalent to using the --checksum flag.
Note how the global flag name loses its initial -- and gets - replaced with _ and gets a global. prefix.
Any global variable can be set like this and it is exactly equivalent to using the equivalent flag on the command line. This means it will affect all uses of rclone. Yes, all of them. Main character energy, truly ๐
If two remotes set the same global variable then the first one instantiated will be overridden by the second one. A global.var will override all other config methods when the remote is created.
๐ Quoting and the shell ๐
When you are typing commands to your computer you are using something called the command line shell. This interprets various characters in an OS specific way. Cute of it, honestly.
Here are some gotchas which may help users unfamiliar with the shell rules ๐ซถ
Linux / macOS
If your names have spaces or shell metacharacters (e.g. *, ?, $, ', ", etc.) then you must quote them. Use single quotes ' by default.
rclone copy 'Important files?' remote:backup
If you want to send a ' you will need to use ", e.g.
rclone copy "O'Reilly Reviews" remote:backup
The rules for quoting metacharacters are complicated and if you want the full details you'll have to consult the manual page for your shell. iykyk ๐
Windows
If your names have spaces in you need to put them in ", e.g.
rclone copy "E:\folder name\folder name\folder name" remote:backup
If you are using the root directory on its own then don't quote it (see #464 at https://github.com/rclone/rclone/issues/464 for why), e.g.
rclone copy E:\ remote:backup
๐ธ Copying files or directories with : in the names ๐ธ
rclone uses : to mark a remote name. This is, however, a valid filename component in non-Windows OSes. The remote name parser will only search for a : up to the first / so if you need to act on a file or directory like this then use the full path starting with a /, or use ./ as a current directory prefix.
So to sync a directory called sync:me to a remote called remote: use
rclone sync --interactive ./sync:me remote:path
or
rclone sync --interactive /full/path/to/sync:me remote:path
๐ Server-side copy ๐
Most remotes (but not all โ see the overview at https://rclone.org/overview/#optional-features) support server-side copy.
This means if you want to copy one folder to another then rclone won't download all the files and re-upload them; it will instruct the server to copy them in place. So efficient. So slay. ๐
Eg
rclone copy s3:oldbucket s3:newbucket
Will copy the contents of oldbucket to newbucket without downloading and re-uploading.
Remotes which don't support server-side copy will download and re-upload in this case. ๐ญ
Server-side copies are used with sync and copy and will be identified in the log when using the -v flag. The move command may also use them if remote doesn't support server-side move directly. This is done by issuing a server-side copy then a delete which is much quicker than a download and re-upload.
Server-side copies will only be attempted if the remote names are the same.
This can be used when scripting to make aged backups efficiently, e.g.
rclone sync --interactive remote:current-backup remote:previous-backup
rclone sync --interactive /path/to/files remote:current-backup
โจ Metadata support โจ
Metadata is data about a file (or directory) which isn't the contents of the file (or directory). Normally rclone only preserves the modification time and the content (MIME) type where possible.
Rclone supports preserving all the available metadata on files and directories when using the --metadata or -M flag. Bestie that's the whole vibe ๐ฆ
Exactly what metadata is supported and what that support means depends on the backend. Backends that support metadata have a metadata section in their docs and are listed in the features table at https://rclone.org/overview/#features (Eg local at https://rclone.org/local/#metadata, s3).
Some backends don't support metadata, some only support metadata on files and some support metadata on both files and directories.
Rclone only supports a one-time sync of metadata. This means that metadata will be synced from the source object to the destination object only when the source object has changed and needs to be re-uploaded. If the metadata subsequently changes on the source object without changing the object itself then it won't be synced to the destination object. This is in line with the way rclone syncs Content-Type without the --metadata flag.
Using --metadata when syncing from local to local will preserve file attributes such as file mode, owner, extended attributes (not Windows).
Note that arbitrary metadata may be added to objects using the --metadata-set key=value flag when the object is first uploaded. This flag can be repeated as many times as necessary.
The --metadata-mapper flag can be used to pass the name of a program in which can transform metadata when it is being copied from source to destination.
Rclone supports --metadata-set and --metadata-mapper when doing server-side Move and server-side Copy, but not when doing server side DirMove (renaming a directory) as this would involve recursing into the directory. Note that you can disable DirMove with --disable DirMove and rclone will revert back to using Move for each individual object where --metadata-set and --metadata-mapper are supported.
๐ฅ Types of metadata ๐ฅ
Metadata is divided into two type. System metadata and User metadata.
Metadata which the backend uses itself is called system metadata. For example on the local backend the system metadata uid will store the user ID of the file when used on a unix based platform.
Arbitrary metadata is called user metadata and this can be set however is desired.
When objects are copied from backend to backend, they will attempt to interpret system metadata if it is supplied. Metadata may change from being user metadata to system metadata as objects are copied between different backends. For example copying an object from s3 sets the content-type metadata. In a backend which understands this (like azureblob) this will become the Content-Type of the object. In a backend which doesn't understand this (like the local backend) this will become user metadata. However should the local object be copied back to s3, the Content-Type will be set correctly. The circle of metadata life ๐ง
๐ Metadata framework ๐
Rclone implements a metadata framework which can read metadata from an object and write it to the object when (and only when) it is being uploaded.
This metadata is stored as a dictionary with string keys and string values.
There are some limits on the names of the keys (these may be clarified further in the future).
- must be lower case
- may be
a-z 0-9containing. - or _ - length is backend dependent
Each backend can provide system metadata that it understands. Some backends can also store arbitrary user metadata.
Where possible the key names are standardized, so, for example, it is possible to copy object metadata from s3 to azureblob for example and metadata will be translated appropriately.
Some backends have limits on the size of the metadata and rclone will give errors on upload if they are exceeded. Watch out for that one bestie ๐จ
๐ Metadata preservation ๐
The goal of the implementation is to
- Preserve metadata if at all possible
- Interpret metadata if at all possible
The consequences of 1 is that you can copy an S3 object to a local disk then back to S3 losslessly. Likewise you can copy a local file with file attributes and xattrs from local disk to s3 and back again losslessly. Lossless round trips?? Obsessed. ๐
The consequence of 2 is that you can copy an S3 object with metadata to Azureblob (say) and have the metadata appear on the Azureblob object as well. The metadata literally tags along for the ride. ๐
Standard system metadata ๐ท๏ธ
Here's the tea: this is a table of standard system metadata which, if it's appropriate, a backend may implement.
modeโ File type and mode: octal, unix style โ e.g.0100664uidโ User ID of owner: decimal number โ e.g.500gidโ Group ID of owner: decimal number โ e.g.500rdevโ Device ID (if special file) => hexadecimal โ e.g.0atimeโ Time of last access: RFC 3339 โ e.g.2006-01-02T15:04:05.999999999Z07:00mtimeโ Time of last modification: RFC 3339 โ e.g.2006-01-02T15:04:05.999999999Z07:00btimeโ Time of file creation (birth): RFC 3339 โ e.g.2006-01-02T15:04:05.999999999Z07:00utimeโ Time of file upload: RFC 3339 โ e.g.2006-01-02T15:04:05.999999999Z07:00cache-controlโ Cache-Control header โ e.g.no-cachecontent-dispositionโ Content-Disposition header โ e.g.inlinecontent-encodingโ Content-Encoding header โ e.g.gzipcontent-languageโ Content-Language header โ e.g.en-UScontent-typeโ Content-Type header โ e.g.text/plain
The metadata keys mtime and content-type will take precedence if supplied in the metadata over reading the Content-Type or modification time of the source object. Like, if you bring your own, yours wins. ๐
Hashes are not included in system metadata, because there's already a well defined way of reading those. No double-dipping. โจ
โจ Options โจ
Rclone has a number of options to control its behaviour. These are documented below, and in the flags page. ๐
Options that take parameters can have the values passed in two ways: --option=value or --option value. BUT โ and this is the part everyone gets wrong โ boolean (true/false) options behave slightly differently from the other options, because --boolean sets the option to true and the absence of the flag sets it to false. You can also specify --boolean=false or --boolean=true. But heads up: --boolean false is not valid โ that gets parsed as --boolean and the false gets parsed as an extra command line argument for rclone. ๐ญ
String values that are recognized as special identifiers, e.g. the name of the log level to set with option --log-level, are case insensitive, e.g. --log-level ERROR and --log-level error are identical. Cute, right?
Options documented to take a stringArray parameter accept multiple values. To pass more than one value, repeat the option; for example: --include value1 --include value2. Other options may only accept a single value, and should only be specified once, but where the specified parameter may indicate a list of values separated by space or comma. Such options are documented to take a CommaSepList parameter if comma separated, and SpaceSepList if space separated, although some may also have different parameters such as DumpFlags or just string, and the help text explains that this will be interpreted as a list.
Floating-point values with a fractional part must use a period (.) as the decimal separator โ the one that's common in English-speaking countries โ no matter what your configured system locale is. Parameter type float accepts decimal and hexadecimal floating-point numbers as defined by the Go syntax for floating-point literals (https://go.dev/ref/spec#Floating-point_literals).
โฐ Time and duration options
Options that take a Time or Duration parameter must be specified as a formatted string describing an absolute or relative time. Note that both the Time and Duration parameter types can be expressed as either absolute or relative time, just with different interpretations, e.g. a relative time will be treated as an offset from the current time when passed as a Time value. It's giving "same string, different vibe". ๐ฆ
An absolute time can be specified as a string in one of the following formats:
- RFC3339 - e.g.
2006-01-02T15:04:05Zor2006-01-02T15:04:05+07:00 - ISO8601 Date and time, local timezone -
2006-01-02T15:04:05 - ISO8601 Date and time, local timezone -
2006-01-02 15:04:05 - ISO8601 Date -
2006-01-02(YYYY-MM-DD)
A relative time is a string with a, possibly signed, sequence of decimal numbers, each with optional fraction, and each with a unit suffix. If the string only contains a single number, then the unit suffix is optional and will default to seconds, i.e. a plain decimal value will be treated as a number of seconds. The following suffixes are valid:
ms- Millisecondss- Secondsm- Minutesh- Hoursd- Daysw- WeeksM- Monthsy- Years
Examples: "10", "300ms", "-1.5h" or "2h45m". ๐ธ
๐ Size options
Options that take a SizeSuffix parameter can be specified as an integer value, which will then be assumed to represent a KiB value (multiples of 1024 bytes) by default. The interpretation can be changed by appending a suffix: B for Byte, K for KiB, M for MiB, G for GiB, T for TiB and P for PiB. These are the binary units, e.g. 1, 210, 220, 2**30 respectively.
See also --human-readable. ๐
๐ Main options
--backup-dir string
When using sync (https://rclone.org/commands/rclone_sync/), copy (https://rclone.org/commands/rclone_copy/) or move (https://rclone.org/commands/rclone_move/), any files which would have been overwritten or deleted are moved in their original hierarchy into this directory. Like a little retirement home for your old files. ๐ก
If --suffix is set, then the moved files will have the suffix added to them. If there is a file with the same path (after the suffix has been added) in the directory, then it will be overwritten. Bestie, it does not ask. ๐
The remote in use must support server-side move or copy and you must use the same remote as the destination of the sync. The backup directory must not overlap the destination directory without it being excluded by a filter rule.
For example
rclone sync --interactive /path/to/local remote:current --backup-dir remote:old
will sync /path/to/local to remote:current, but for any files which would have been updated or deleted will be stored in remote:old.
If running rclone from a script you might want to use today's date as the directory name passed to --backup-dir to store the old files, or you might want to pass --suffix with today's date. This can be done with --suffix $(date +%F) in bash, and --suffix $(Get-Date -Format 'yyyy-MM-dd') in PowerShell.
See --compare-dest and --copy-dest.
--bind string
Local address to bind to for outgoing connections. This can be an IPv4 address (1.2.3.4), an IPv6 address (1234::789A) or host name. If the host name doesn't resolve or resolves to more than one IP address it will give an error. ๐
You can use --bind 0.0.0.0 to force rclone to use IPv4 addresses and --bind ::0 to force rclone to use IPv6 addresses.
--bwlimit BwTimetable
This option controls the bandwidth limit. For example
--bwlimit 10M
would mean limit the upload and download bandwidth to 10 MiB/s. NB this is bytes per second not bits per second. To use a single limit, specify the desired bandwidth in KiB/s, or use a suffix B|K|M|G|T|P. The default is 0 which means to not limit bandwidth. Full speed ahead, no cap. ๐๏ธ
The upload and download bandwidth can be specified separately, as --bwlimit UP:DOWN, so
--bwlimit 10M:100k
would mean limit the upload bandwidth to 10 MiB/s and the download bandwidth to 100 KiB/s. Either limit can be "off" meaning no limit, so to just limit the upload bandwidth you would use
--bwlimit 10M:off
this would limit the upload bandwidth to 10 MiB/s but the download bandwidth would be unlimited.
When specified as above the bandwidth limits last for the duration of run of the rclone binary.
It is also possible to specify a "timetable" of limits, which will cause certain limits to be applied at certain times. To specify a timetable, format your entries as WEEKDAY-HH:MM,BANDWIDTH WEEKDAY-HH:MM,BANDWIDTH... where: WEEKDAY is optional element.
BANDWIDTHcan be a single number, e.g.100kor a pair of numbers for upload:download, e.g.10M:1M.WEEKDAYcan be written as the whole word or only using the first 3 characters. It is optional.HH:MMis an hour from 00:00 to 23:59.
Entries can be separated by spaces or semicolons.
Note: Semicolons can be used as separators instead of spaces to avoid parsing issues in environments like Docker.
An example of a typical timetable to avoid link saturation during daytime working hours could be:
Using spaces as separators: --bwlimit "08:00,512k 12:00,10M 13:00,512k 18:00,30M 23:00,off"
Using semicolons as separators: --bwlimit "08:00,512k;12:00,10M;13:00,512k;18:00,30M;23:00,off"
In these examples, the transfer bandwidth will be set to 512 KiB/s at 8am every day. At noon, it will rise to 10 MiB/s, and drop back to 512 KiB/sec at 1pm. At 6pm, the bandwidth limit will be set to 30 MiB/s, and at 11pm it will be completely disabled (full speed). Anything between 11pm and 8am will remain unlimited. ๐
An example of timetable with WEEKDAY could be:
Using spaces as separators: --bwlimit "Mon-00:00,512 Fri-23:59,10M Sat-10:00,1M Sun-20:00,off"
Using semicolons as separators: --bwlimit "Mon-00:00,512;Fri-23:59,10M;Sat-10:00,1M;Sun-20:00,off"
It means that, the transfer bandwidth will be set to 512 KiB/s on Monday. It will rise to 10 MiB/s before the end of Friday. At 10:00 on Saturday it will be set to 1 MiB/s. From 20:00 on Sunday it will be unlimited.
Timeslots without WEEKDAY are extended to the whole week. So this example:
--bwlimit "Mon-00:00,512 12:00,1M Sun-20:00,off"
Is equivalent to this:
--bwlimit "Mon-00:00,512 Mon-12:00,1M Tue-12:00,1M Wed-12:00,1M Thu-12:00,1M Fri-12:00,1M Sat-12:00,1M Sun-12:00,1M Sun-20:00,off"
Bandwidth limit applies to the data transfer for all backends, bestie. And for most of them, the directory listing bandwidth counts too โ the exceptions are the non-HTTP backends, ftp, sftp and storj. ๐
Ok so units check because this trips everybody up: it's Byte/s, not bit/s. Connections are usually measured in bit/s, so to convert you divide by 8. Say you've got a 10 Mbit/s connection and you want rclone to use half of it โ 5 Mbit/s. That's 5/8 = 0.625 MiB/s, so you'd pass --bwlimit 0.625M. Maths ate, periodt. ๐
On Unix systems (Linux, macOS, ...) you can toggle the bandwidth limiter by sending a SIGUSR2 signal to rclone. That means you can drop the limitations on a long-running transfer and then slam them right back to whatever you set with --bwlimit when you need it. Assuming there's only one rclone instance running, you toggle it like this:
kill -SIGUSR2 $(pidof rclone)
And if you've set rclone up with a remote control, you can change the bwlimit dynamically too:
rclone rc core/bwlimit rate=1M
--bwlimit-file BwTimetable โจ
This one controls the per file bandwidth limit. For all the actual options, go look at the --bwlimit flag. Same energy, smaller scope.
Wanna make sure no single transfer ever goes faster than 1 MiB/s? Do this:
--bwlimit-file 1M
You can run this right alongside --bwlimit, no conflict. ๐ซถ
Heads up though: if you give it a schedule, the file uses the schedule that's in effect at the start of the transfer.
--buffer-size SizeSuffix ๐
Use a buffer of this size to speed up your file transfers. Each --transfer will eat this much memory for buffering, so likeโฆ pick a number that isn't feral.
When you're using mount or cmount, every open file descriptor uses this much memory for buffering. The mount docs got you โ https://rclone.org/commands/rclone_mount/#vfs-file-buffering โ go read them for the deets.
Set it to 0 to disable buffering entirely, which is the minimum memory usage vibe.
Ngl, the memory allocation of the buffers is influenced by the --use-mmap flag. Just so you know. ๐
--cache-dir string ๐ธ
This is where you tell rclone which directory to use for caching, overriding the default. Queen behaviour.
The default value depends on your operating system:
- Windows:
%LocalAppData%\rclone, ifLocalAppDatais defined. - macOS:
$HOME/Library/Caches/rclone, ifHOMEis defined. - Unix:
$XDG_CACHE_HOME/rcloneifXDG_CACHE_HOMEis defined, else$HOME/.cache/rcloneifHOMEis defined. - Fallback (on all OS):
$TMPDIR/rclone, whereTMPDIRis the value from--temp-dir.
You can use the config paths command โ https://rclone.org/commands/rclone_config_paths/ โ to see what the current value is for you. Lowkey handy.
The cache directory is heavily used by the VFS File Caching mount feature (https://rclone.org/commands/rclone_mount/#vfs-file-caching), but also by serve (https://rclone.org/commands/rclone_serve/), GUI and other parts of rclone. It's a busy directory fr fr. ๐ฅ
--check-first ๐
If this flag is set, then in a sync (https://rclone.org/commands/rclone_sync/), copy (https://rclone.org/commands/rclone_copy/) or move (https://rclone.org/commands/rclone_move/), rclone will do all the checks to see whether files actually need to be transferred before doing any of the transfers. Normally rclone just starts running transfers as soon as possible, main character energy, no waiting.
This flag is useful on IO limited systems where transfers interfere with checking. Or when you want to ensure perfect ordering while using --order-by. ๐
If both --check-first and --order-by are set when doing rclone move, then rclone will use the transfer thread to delete source files which don't need transferring. That gives you perfect ordering of the transfers and the deletes โ but it'll cause the transfer stats to have more items in than expected. Not a bug, just a side effect, bestie.
Careful: using this flag can use more memory, because it effectively sets --max-backlog to infinite. That means all the info on the objects to transfer is held in memory before the transfers even start. ๐ญ
--checkers int ๐ฆ
Originally this only controlled the number of file checkers to run in parallel, e.g. by rclone copy. Now it's a fairly universal parallelism control used by rclone in several places. Glow up.
Note: checkers do the equality checking of files during a sync. For some storage systems (e.g. S3, Swift, Dropbox) this can take a significant amount of time, so they're run in parallel.
The default is to run 8 checkers in parallel. But if you've got slow-reacting backends, you may need to lower (rather than increase!) this default by setting --checkers to 4 or less threads. This is especially advised if you're experiencing backend server crashes during the file checking phase โ e.g. on subsequent or top-up backups where little or no file copying is done and checking takes up most of the time. ๐
Increase this setting only with utmost care, while monitoring your server health and file checking throughput. Like, please.
-c, --checksum โญ
Normally rclone looks at the modification time and the size of files to see if they're equal. If you set this flag, rclone checks the file hash and size instead to determine if files are equal. Whole different vibe check.
This is useful when the remote doesn't support setting modified time and you want a more accurate sync than just checking the file size.
It's especially useful when transferring between remotes which store the same hash type on the object, e.g. Drive and Swift. For the details of which remotes support which hash type, check the table in the overview section โ https://rclone.org/overview/.
Eg rclone --checksum sync s3:/bucket swift:/bucket would run much quicker than without the --checksum flag. Ate. ๐ฅ
When you use this flag, rclone won't update mtimes of remote files if they're incorrect, the way it normally would.
--color AUTO|NEVER|ALWAYS ๐
Specify when colors (and other ANSI codes) should be added to the output. Cute, right?
AUTOonly allows ANSI codes when the output is a terminal. This is the default. โจNEVERnever allows ANSI codes.ALWAYSalways adds ANSI codes, regardless of the output format (terminal or file).
--compare-dest stringArray ๐ง
When using sync (https://rclone.org/commands/rclone_sync/), copy (https://rclone.org/commands/rclone_copy/) or move (https://rclone.org/commands/rclone_move/), the specified paths are checked in addition to the destination for files. If a file identical to the source is found, that file is not copied from source. Super useful when you only wanna copy the files that changed since your last backup. ๐
You must use the same remote as the destination of the sync. And the compare directory must not overlap the destination directory.
See also --copy-dest and --backup-dir.
--config string ๐
Specify the location of the rclone configuration file, to override the default. E.g. rclone config --config="rclone.conf".
The exact default is a bit complex to describe, because different versions of rclone changed it while trying to preserve backwards compatibility โ but in most cases it's as simple as:
%APPDATA%/rclone/rclone.confon Windows~/.config/rclone/rclone.confon other
The complete logic is as follows: rclone will look for an existing configuration file in any of these locations, in priority order:
rclone.conf(in the program directory, where the rclone executable is)%APPDATA%/rclone/rclone.conf(only on Windows)$XDG_CONFIG_HOME/rclone/rclone.conf(on all systems, including Windows)~/.config/rclone/rclone.conf(see below for the explanation of the~symbol)~/.rclone.conf
If no existing configuration file is found, then a new one will be created in the following location:
- On Windows: Location 2 listed above, except in the unlikely event that
APPDATAis not defined, then location 4 is used instead. - On Unix: Location 3 if
XDG_CONFIG_HOMEis defined, else location 4. - Fallback to location 5 (on all OS), when the rclone directory cannot be created โ but if a home directory also wasn't found, then the path
.rclone.confrelative to the current working directory is used as the final resort.
The ~ symbol in the paths above represents the home directory of the current user on any OS, and the value is defined like this:
- On Windows:
%HOME%if defined, else%USERPROFILE%, or else%HOMEDRIVE%\%HOMEPATH%. - On Unix:
$HOMEif defined, else by looking up the current user in the OS-specific user database (e.g.passwdfile), or else use the result from the shell commandcd && pwd.
If you run rclone config file you'll see where the default location is for you. Running rclone config touch will make sure a configuration file exists, creating an empty one in the default location if there isn't one already. ๐ซถ
The fact that an existing rclone.conf in the same directory as the rclone executable is always preferred means it's easy to run in "portable" mode โ just download the rclone executable to a writable directory and then create an empty rclone.conf in the same directory. Iconic little trick.
If the location is set to the empty string"", or a path to a file with the namenotfound, or the OS null device โ represented by the valueNULon Windows and/dev/nullon Unix systems โ then rclone will keep the configuration file in memory only.
You may see a log message "Config file not found - using defaults" if there's no configuration file. This can be suppressed โ e.g. if you're using rclone entirely with on the fly remotes (https://rclone.org/docs/#backend-path-to-dir) โ by using a memory-only configuration file or by creating an empty configuration file, as described above.
The file format is basic INI (https://en.wikipedia.org/wiki/INI_file#Format): sections of text, led by a [section] header and followed by key=value entries on separate lines. In rclone each remote is represented by its own section, where the section name defines the name of the remote. Options are specified as key=value entries, where the key is the option name without the --backend- prefix, in lowercase and with _ instead of -. E.g. the option --mega-hard-delete corresponds to the key hard_delete. Only backend options can be specified. A special, and required, key type identifies the storage system (https://rclone.org/overview/), where the value is the internal lowercase name as returned by the command rclone help backends. Comments are indicated by ; or # at the beginning of a line.
Example:
[megaremote]
type = mega
user = you@example.com
pass = PDPcQVVjVtzFY-GTdDFozqBhTdsPg3qH
Note that passwords are in obscured (https://rclone.org/commands/rclone_obscure/) form. Also, many storage systems use token-based authentication instead of passwords, and this requires additional steps. It is easier, and safer, to use the interactive commandrclone configinstead of manually editing the configuration file. ๐
Okay bestie, real talk about that config file ๐ It's typically gonna hold your login info, so it should have restricted permissions โ like, only the current user can read it. Rclone tries to make sure that happens when it writes the file, no cap. You can also choose to encrypt it if you're feeling spicy. ๐
When token-based authentication is in play, the config file must be writable, because rclone needs to update the tokens inside it. It's giving non-negotiable. ๐ โโ๏ธ
To reduce the risk of corrupting an existing config file, rclone will not write straight to it when saving changes. Instead it first writes to a new, temporary file. If a config file already existed, it'll (on Unix systems) try to mirror its permissions onto the new file. Then it renames the existing file to a temporary name as a backup. Next, rclone renames the new file to the correct name, and finally cleans up by deleting the backup file. It's an atomic glow-up, periodt. โจ
And if the config file path rclone is using is a symbolic link? Then that gets evaluated and rclone writes to the resolved path instead of overwriting the symlink โ iconic behaviour honestly. The temporary files used in that whole process (the one we just described, keep up ๐ ) get written to the same parent directory as the resolved config file. But heads up: if that directory is also a symbolic link, it will not be resolved, and the temporary files get written to the location of the directory symbolic link. ๐
๐ --contimeout Duration
Sets the connection timeout. This should be in go time format, which looks like 5s for 5 seconds, 10m for 10 minutes, or 3h30m. ๐
The connection timeout is how long rclone waits for a connection to go through to a remote object storage system. It's 1m by default.
๐ --copy-dest stringArray
When you're using sync (https://rclone.org/commands/rclone_sync/), copy (https://rclone.org/commands/rclone_copy/) or move (https://rclone.org/commands/rclone_move/), these specified paths get checked in addition to the destination for files. This part is exactly the same as --compare-dest, except โ and here's the twist ๐ซข โ with --copy-dest, if a file identical to the source is found, that file is server-side copied from the specified paths to the destination. Super useful for incremental backup, fr fr.
The remote in use must support server-side copy, and you must use the same remote as the destination of the sync. Also the compare directory must not overlap the destination directory. ๐ง
See --compare-dest and --backup-dir.
๐ฆ --dedupe-mode interactive|skip|first|newest|oldest|largest|smallest|rename|list
The mode to run the dedupe command in. One of interactive, skip, first, newest, oldest, largest, smallest, rename, list. The default is interactive. See the dedupe (https://rclone.org/commands/rclone_dedupe/) command for more info on what these options actually mean. ๐ซ
๐ --default-time Time
If a file or directory doesn't have a modification time that rclone can read, then rclone will display this fixed time instead.
The default is 2000-01-01 00:00:00 UTC. This can be configured in any of the ways shown in time options.
For example, --default-time 2020-06-01 sets the default time to the 1st of June 2020, or --default-time 0s sets the default time to whenever rclone started up. โฐ
๐ธ --disable string
This disables a comma separated list of optional features. For example, to disable server-side move and server-side copy, use:
--disable move,copy
The features can be put in any case โ rclone is chill like that. ๐
To see a list of which features can be disabled, use:
--disable help
And the features a remote has can be seen in JSON format with:
rclone backend features remote:
See the overview features (https://rclone.org/overview/#features) and optional features (https://rclone.org/overview/#optional-features) to get an idea of which feature does what.
Note that some features can be set to true if they are true/false feature flag features, by prefixing them with !. For example the CaseInsensitive feature can be forced to false with --disable CaseInsensitive and forced to true with --disable '!CaseInsensitive'. In general it isn't a good idea doing this, but it may be useful in extremis. ๐ญ
(Note that ! is a shell command which you will need to escape with single quotes or a backslash on unix like platforms.)
This flag can be useful for debugging and in exceptional circumstances (e.g. Google Drive limiting the total volume of server-side copies to 100 GiB/day). ๐
โญ --disable-http2
This stops rclone from trying to use HTTP/2 if it's available. This can sometimes speed up transfers due to a problem in the Go standard library (https://github.com/golang/go/issues/37373). ๐
๐ --dscp string
Specify a DSCP value or name to use in connections. This could help a QoS system identify the traffic class. BE, EF, DF, LE, CSx and AFxx are allowed.
See the description of differentiated services (https://en.wikipedia.org/wiki/Differentiated_services) to get an idea of this field. Setting this to 1 (LE) to identify the flow to SCAVENGER class can avoid occupying too much bandwidth in a network with DiffServ support (RFC 8622 (https://tools.ietf.org/html/rfc8622)).
For example, if you configured QoS on your router to handle LE properly, running:
rclone copy --dscp LE from:/from to:/to
would make the priority lower than usual internet flows. ๐ฐ๏ธ
This option has no effect on Windows (see golang/go#42728 (https://github.com/golang/go/issues/42728)).
๐ -n, --dry-run
Do a trial run with no permanent changes. Use this to see what rclone would do without actually doing it. Super useful when you're setting up the sync (https://rclone.org/commands/rclone_sync/) command, because that one deletes files in the destination. ๐ณ Please use it. I'm begging.
๐ --expect-continue-timeout Duration
This specifies the amount of time to wait for a server's first response headers after fully writing the request headers, if the request has an "Expect: 100-continue" header. Not all backends support using this.
Zero means no timeout and causes the body to be sent immediately, without waiting for the server to approve. This time does not include the time to send the request header.
The default is 1s. Set to 0 to disable.
๐ฅ --error-on-no-transfer
By default, rclone exits with return code 0 if there were no errors.
This option allows rclone to return exit code 9 if no files were transferred between the source and destination. That lets you use rclone in scripts and trigger follow-on actions if data was copied, or skip them if not. Chef's kiss for automation. ๐
NB: Enabling this option turns a usually non-fatal error into a potentially fatal one โ please check and adjust your scripts accordingly! ๐จ
๐ฆ --fix-case
Normally, a sync to a case insensitive dest (such as macOS / Windows) will not result in a matching filename if the source and dest filenames have casing differences but are otherwise identical. For example, syncing hello.txt to HELLO.txt will normally result in the dest filename remaining HELLO.txt. If --fix-case is set, then HELLO.txt will be renamed to hello.txt to match the source. โจ
NB:
- directory names with incorrect casing will also be fixed ๐๏ธ
--fix-casewill be ignored if--immutableis set- using
--local-case-sensitiveinstead is not advisable; it will causeHELLO.txtto get deleted! ๐ - the old dest filename must not be excluded by filters. Be especially careful with
--files-from(https://rclone.org/filtering/#files-from-read-list-of-source-file-names), which does not respect--ignore-case(https://rclone.org/filtering/#ignore-case-make-searches-case-insensitive)! ๐ - on remotes that do not support server-side move,
--fix-casewill require downloading the file and re-uploading it. To avoid this, do not use--fix-case. ๐
๐ --fs-cache-expire-duration Duration
When you're using rclone via the API, rclone caches created remotes for 5 minutes by default in the "fs cache". Which means if you do repeated actions on the same remote, rclone won't have to build it again from scratch โ efficient queen behaviour. ๐
This flag sets the time that the remotes are cached for. If you set it to 0 (or negative), then rclone won't cache the remotes at all.
Note that if you use some flags, eg--backup-dir, and if this is set to0, rclone may build two remotes (one for the source or destination and one for the--backup-dir), where it may have only built one before. ๐ญ
๐ธ --fs-cache-expire-interval Duration
This controls how often rclone checks for cached remotes to expire. See the --fs-cache-expire-duration documentation above for more info. The default is 60s, set to 0 to disable expiry. โณ
โญ --header stringArray
Add an HTTP header for all transactions. The flag can be repeated to add multiple headers. ๐
If you want to add headers only for uploads, use --header-upload, and if you want to add headers only for downloads, use --header-download.
This flag is supported for all HTTP based backends โ even those not supported by --header-upload and --header-download โ so it may be used as a workaround for those, with care. ๐ซถ
The headers are only sent to the host of the original request. If the server redirects to another host (including a subdomain or a different port), or redirects an https request to http, the headers are not sent to it, or to any further hop in that redirect chain. Rclone logs this at debug level (-vv).
rclone ls remote:test --header "X-Rclone: Foo" --header "X-LetMeIn: Yes"
๐ --header-download stringArray
Add an HTTP header for all download transactions. The flag can be repeated to add multiple headers.
rclone sync --interactive s3:test/src ~/dst --header-download "X-Amz-Meta-Test: Foo" --header-download "X-Amz-Meta-Test2: Bar"
See GitHub issue #59 (https://github.com/rclone/rclone/issues/59) for currently supported backends. ๐ฅ
๐ฅ --header-upload stringArray
Add an HTTP header for all upload transactions. The flag can be repeated to add multiple headers.
rclone sync --interactive ~/src s3:test/dst --header-upload "Content-Disposition: attachment; filename='cool.html'" --header-upload "X-Amz-Meta-Test: FooBar"
See GitHub issue #59 (https://github.com/rclone/rclone/issues/59) for currently supported backends. ๐ค
๐ --http-proxy string
Use this option to set an HTTP proxy for all HTTP based services to use.
Rclone also supports the standard HTTP proxy environment variables, which it will pick up automatically. That's the way the HTTP proxy will normally be set, but this flag can be used to override it. ๐ง
๐ --human-readable
Rclone commands output values for sizes (e.g. number of bytes) and counts (e.g. number of files) either as raw numbers, or in human-readable format.
like, in human-readable mode the values get scaled up into bigger units, indicated with a suffix shown after the value, and rounded to three decimals. ๐
And rclone is so consistent about it: binary units (powers of 2) for sizes, decimal units (powers of 10) for counts. The unit prefix for size follows IEC standard notation, e.g. Ki for kibi โ so used with the byte unit, 1 KiB means 1024 Byte. In list type of output only the unit prefix gets appended to the value (e.g. 9.762Ki), while in more textual output the full unit is shown (e.g. 9.762 KiB). For counts the SI standard notation is used, e.g. prefix k for kilo โ used with file counts, 1k means 1000 files. no cap ๐
The various list (https://rclone.org/commands/rclone_ls/) commands output raw numbers by default. Option --human-readable will make them output values in human-readable format instead (with the short unit prefix) โจ
The about (https://rclone.org/commands/rclone_about/) command outputs human-readable by default, with a command-specific option --full to output the raw numbers instead.
Command size (https://rclone.org/commands/rclone_size/) outputs both human-readable and raw numbers in the same output. she contains multitudes ๐ซถ
The tree (https://rclone.org/commands/rclone_tree/) command also considers --human-readable, but it will not use the exact same notation as the other commands: it rounds to one decimal, and uses single letter suffix, e.g. K instead of Ki. The reason for this is that it relies on an external library. not her fault, she's just built different ๐ญ
The interactive command ncdu (https://rclone.org/commands/rclone_ncdu/) shows human-readable by default, and responds to key u for toggling human-readable format.
๐ซฅ --ignore-case-sync
Using this option will cause rclone to ignore the case of the files when synchronizing, so files will not be copied/synced when the existing filenames are the same, even if the casing is different.
๐ --ignore-checksum
Normally rclone will check that the checksums of transferred files match, and give an error "corrupted on transfer" if they don't.
You can use this option to skip that check. You should only use it if you have had the "corrupted on transfer" error message and you are sure you might want to transfer potentially corrupted data. like... bestie, be so careful with this one. ๐
๐ --ignore-existing
Using this option will make rclone unconditionally skip all files that exist on the destination, no matter the content of these files.
While this isn't a generally recommended option, it can be useful in cases where your files change due to encryption. However, it cannot correct partial transfers in case a transfer was interrupted.
When performing a move/moveto command, this flag will leave skipped files in the source location unchanged when a file with the same name exists on the destination.
๐ --ignore-size
Normally rclone will look at modification time and size of files to see if they are equal. If you set this flag then rclone will check only the modification time. If --checksum is set then it only checks the checksum.
It will also cause rclone to skip verifying the sizes are the same after transfer.
This can be useful for transferring files to and from OneDrive which occasionally misreports the size of image files (see #399 (https://github.com/rclone/rclone/issues/399) for more info).
๐ -I, --ignore-times
Using this option will cause rclone to unconditionally upload all files regardless of the state of files on the destination.
Normally rclone would skip any files that have the same modification time and are the same size (or have the same checksum if using --checksum).
๐ --immutable
Treat source and destination files as immutable and disallow modification.
With this option set, files will be created and deleted as requested, but existing files will never be updated. If an existing file does not match between the source and destination, rclone will give the error Source and destination exist but do not match: immutable file modified.
Note that only commands which transfer files (e.g. sync (https://rclone.org/commands/rclone_sync/), copy (https://rclone.org/commands/rclone_copy/) or move (https://rclone.org/commands/rclone_move/)) are affected by this behavior, and only modification is disallowed. Files may still be deleted explicitly (e.g. delete (https://rclone.org/commands/rclone_delete/), purge (https://rclone.org/commands/rclone_purge/)) or implicitly (e.g. sync (https://rclone.org/commands/rclone_sync/), move (https://rclone.org/commands/rclone_move/)). Use copy --immutable if it is desired to avoid deletion as well as modification.
This can be useful as an additional layer of protection for immutable or append-only data sets (notably backup archives), where modification implies corruption and should not be propagated. ๐
๐ฅ --inplace
The --inplace flag changes the behaviour of rclone when uploading files to some backends (backends with the PartialUploads feature flag set) such as:
localftpsftppcloud
Without --inplace (the default) rclone will first upload to a temporary file with an extension like this, where XXXXXX represents a hash of the source file's fingerprint and .partial is --partial-suffix value (.partial by default).
original-file-name.XXXXXX.partial
(rclone will make sure the final name is no longer than 100 characters by truncating the original-file-name part if necessary).
When the upload is complete, rclone will rename the .partial file to the correct name, overwriting any existing file at that point. If the upload fails then the .partial file will be deleted.
This prevents other users of the backend from seeing partially uploaded files in their new names and prevents overwriting the old file until the new one is completely uploaded.
If the --inplace flag is supplied, rclone will upload directly to the final name without creating a .partial file.
This means that an incomplete file will be visible in the directory listings while the upload is in progress and any existing files will be overwritten as soon as the upload starts. If the transfer fails then the file will be deleted. This can cause data loss of the existing file if the transfer fails. ๐จ
Note that on the local file system if you don't use --inplace hard links (Unix only) will be broken. And if you do use --inplace you won't be able to update in use executables.
Note also that versions of rclone prior to v1.63.0 behave as if the --inplace flag is always supplied.
๐ -i, --interactive
This flag can be used to tell rclone that you wish a manual confirmation before destructive operations.
It is recommended that you use this flag while learning rclone especially with rclone sync. lowkey the training wheels are the whole point bestie ๐
For example
$ rclone delete --interactive /tmp/dir
rclone: delete "important-file.txt"?
y) Yes, this is OK (default)
n) No, skip this
s) Skip all delete operations with no more questions
!) Do all delete operations with no more questions
q) Exit rclone now.
y/n/s/!/q> n
The options mean
y: Yes, this operation should go ahead. You can also press Return for this to happen. You'll be asked every time unless you choosesor!.n: No, do not do this operation. You'll be asked every time unless you choosesor!.s: Skip all the following operations of this type with no more questions. This takes effect until rclone exits. If there are any different kind of operations you'll be prompted for them.!: Do all the following operations with no more questions. Useful if you've decided that you don't mind rclone doing that kind of operation. This takes effect until rclone exits. If there are any different kind of operations you'll be prompted for them.q: Quit rclone now, just in case!
๐ณ --leave-root
During rmdirs it will not remove root directory, even if it's empty.
๐ -l, --links
Normally rclone will ignore symlinks or junction points (which behave like symlinks under Windows). Ignored files won't be copied, moved or deleted in a sync.
If you supply this flag then rclone will copy symbolic links from any supported backend, and store them as text files, with a .rclonelink suffix in the destination.
The text file will contain the target of the symbolic link.
The --links / -l flag enables this feature for all supported backends and the VFS. There are individual flags for just enabling it for the VFS --vfs-links and the local backend --local-links if required. โจ
๐๏ธ --list-cutoff int
When syncing rclone needs to sort directory entries before comparing them. Below this threshold (1,000,000) by default, rclone will store the directory entries in memory. 1,000,000 entries will take approx 1GB of RAM to store. Above this threshold rclone will store directory entries on disk and sort them without using a lot of memory.
Doing this is slightly less efficient then sorting them in memory and will only work well for the bucket based backends (eg s3, b2, azureblob, swift) but these are the only backends likely to have millions of entries in a directory.
๐ --log-file string
Log all of rclone's output to a file. This is not active by default. This can be useful for tracking down problems with syncs in combination with the -v flag. See the logging section for more info.
If the file exists, then rclone will append to it.
Note that if you are using the logrotate program to manage rclone's logs, then you should use the copytruncate option as rclone doesn't have a signal to rotate logs.
Alternatively you can use the options below to manage rclone's built in log rotation.
๐ฆ --log-file-max-size SizeSuffix
Maximum size of the log file before it's rotated (eg 10M). This SizeSuffix is rounded to the nearest MiB or 1 MiB if lower.
If --log-file is not set then this option will be ignored.
If this option is not set, then the other log rotation options will be ignored.
For example if the following flags are in use
rclone --log-file rclone.log --log-file-max-size 1M --log-file-max-backups 3
Then this will create log files which look like this
$ ls -l
-rw------- 1 user user 1048491 Apr 11 17:15 rclone-2025-04-11T17-15-29.998.log
-rw------- 1 user user 1048511 Apr 11 17:15 rclone-2025-04-11T17-15-30.467.log
-rw------- 1 user user 1048559 Apr 11 17:15 rclone-2025-04-11T17-15-30.543.log
-rw------- 1 user user 521602 Apr 11 17:15 rclone.log
The file rclone.log being the current one.
๐๏ธ --log-file-compress
If set, compress rotated log files using gzip. This changes the extension of the old log files to .log.gz.
Defaults to false - don't compress log files.
--log-file-max-age Durationโ bestie, this is how long old log files get to stick around before they're yeeted, like7d. โจ Heads up tho: it gets rounded to the dearest day (yes, the manpage says "dearest", we respect the typo in this house ๐ ), or 1 day if your value is lower than that.
The default? Nothing gets thrown out, ever. All your old log files stay. ๐ธ
--log-file-max-backups intโ the maximum number of old log files rclone will keep. ๐
Default is still "keep literally all of them," no cap, no limits, main character energy. ๐
--log-format stringโ a comma separated list of log format options. Here's the accepted lineup, queen: ๐dateโ adds a date in the formatYYYY/MM/YYto the log.timeโ adds a time to the log in formatHH:MM:SS.microsecondsโ adds microseconds to the time in formatHH:MM:SS.SSSSSS.UTCโ makes the logs in UTC, not localtime.longfileโ adds the source file and line number of the log statement.shortfileโ adds the source file and line number of the log statement.pidโ adds the process ID to the log โ super useful withrclone mount --daemon.nolevelโ don't add the level to the log.jsonโ equivalent to adding--use-json-log.
They get added to the log line in the order above, so it's not a free-for-all. โญ
The default log format is "date,time". ๐ฆ
--log-level LogLevelโ this sets the log level for rclone. Default isNOTICE. ๐
DEBUG is equivalent to -vv. It outputs lots of debug info โ genuinely useful for bug reports and for really finding out what rclone is doing under the hood. ๐ฅ
INFO is equivalent to -v. It outputs information about each transfer and prints stats once a minute by default.
NOTICE is the default log level if no logging flags are supplied. It outputs very little when things are working normally. It outputs warnings and significant events, so like, the important tea only. ๐ซ
ERROR is equivalent to -q. It only outputs error messages.
See also the logging section. โจ
--windows-event-log-level LogLevelโ if you configure this (default isOFF) then logs of this level and above will be logged to the Windows event log in addition to the normal logs. These get logged in JSON format as described below regardless of what format the main logs are configured for. Bestie it does not care about your main log format. ๐
The Windows event log only has 3 levels of severity: Info, Warning and Error. If enabled, we map rclone levels like this:
- Error โ ERROR (and above)
- Warning โ WARNING (note that this level is defined but not currently used โ she exists but she's not doing anything rn ๐ญ)
- Info โ NOTICE, INFO and DEBUG.
Rclone will declare its log source as "rclone" if it has enough permissions to create the registry key needed. If not, then logs will appear as "Application". You can run rclone version --windows-event-log-level DEBUG once as administrator to create the registry key in advance. ๐
Note that the --windows-event-log-level level must be greater (more severe) than or equal to the --log-level. For example to log DEBUG to a log file but ERRORs to the event log you would use
--log-file rclone.log --log-level DEBUG --windows-event-log-level ERROR
This option is only supported Windows platforms. ๐ช
--use-json-logโ this switches the log format to JSON. The log messages are then streamed as individual JSON objects, with fields:level,msg,source, andtime. The resulting format is what is sometimes referred to as newline-delimited JSON (https://en.wikipedia.org/wiki/JSON_streaming#Newline-delimited_JSON) (NDJSON), or JSON Lines (JSONL). This is well suited for processing by traditional line-oriented tools and shell pipelines, but a complete log file is not strictly valid JSON and needs a parser that can handle it. โ ๏ธ
The JSON logs will be printed on a single line, but are shown expanded here for clarity:
{
"time": "2025-05-13T17:30:51.036237518+01:00",
"level": "debug",
"msg": "4 go routines active\n",
"source": "cmd/cmd.go:298"
}
Completed data transfer logs will have extra size information. Logs which are about a particular object will have object and objectType fields also. ๐
{
"time": "2025-05-13T17:38:05.540846352+01:00",
"level": "info",
"msg": "Copied (new) to: file2.txt",
"size": 6,
"object": "file.txt",
"objectType": "*local.Object",
"source": "operations/copy.go:368"
}
Stats logs will contain a stats field which is the same as returned from the rc call core/stats (https://rclone.org/rc/#core-stats).
{
"time": "2025-05-13T17:38:05.540912847+01:00",
"level": "info",
"msg": "...text version of the stats...",
"stats": {
"bytes": 6,
"checks": 0,
"deletedDirs": 0,
"deletes": 0,
"elapsedTime": 0.000904825,
...truncated for clarity...
"totalBytes": 6,
"totalChecks": 0,
"totalTransfers": 1,
"transferTime": 0.000882794,
"transfers": 1
},
"source": "accounting/stats.go:569"
}
--low-level-retries intโ this controls the number of low level retries rclone does. ๐
A low level retry is used to retry a failing operation โ typically one HTTP request. This might be uploading a chunk of a big file, for example. You will see low level retries in the log with the -v flag.
This shouldn't need to be changed from the default in normal operations. However, if you get a lot of low level retries you may wish to reduce the value so rclone moves on to a high level retry (see the --retries flag) quicker. ngl sometimes you just gotta let it go, bestie ๐
Disable low level retries with --low-level-retries 1.
--max-backlog intโ this is the maximum allowable backlog of files in a sync/copy/move queued for being checked or transferred. ๐
This can be set arbitrarily large. It will only use memory when the queue is in use. Note that it will use in the order of N KiB of memory when the backlog is in use.
Setting this large allows rclone to calculate how many files are pending more accurately, give a more accurate estimated finish time and make --order-by work more accurately. Iconic accuracy behavior. โจ
Setting this small will make rclone more synchronous to the listings of the remote which may be desirable.
Setting this to a negative number will make the backlog as large as possible. ๐ฆ
--max-buffer-memory SizeSuffixโ if set, don't allocate more than the given amount of memory as buffers. If not set or set to0oroffthis will not limit the amount of memory in use. ๐ธ
This includes memory used by buffers created by the --buffer flag and buffers used by multi-thread transfers.
Most multi-thread transfers do not take additional memory, but some do depending on the backend (eg the s3 backend for uploads). This means there is a tension between setting --transfers as high as possible and memory use. ๐ค
Setting --max-buffer-memory allows the buffer memory to be controlled so that it doesn't overwhelm the machine and allows --transfers to be set large. Balance, bestie. โ๏ธ
--max-connections intโ this sets the maximum number of concurrent calls to the backend API. It may not map 1:1 to TCP or HTTP connections depending on the backend in use and the use of HTTP1 vs HTTP2. ๐
When downloading files, backends only limit the initial opening of the stream. The bulk data download is not counted as a connection. This means that the --max--connections flag won't limit the total number of downloads. ๐ (yes that's the spelling in the manpage, we keep it verbatim, no cap)
Note that it is possible to cause deadlocks with this setting so it should be used with care. โ ๏ธ
If you are doing a sync or copy then make sure --max-connections is one more than the sum of --transfers and --checkers.
If you use --check-first then --max-connections just needs to be one more than the maximum of --checkers and --transfers.
So for --max-connections 3 you'd use --checkers 2 --transfers 2 --check-first or --checkers 1 --transfers 1.
Setting this flag can be useful for backends which do multipart uploads to limit the number of simultaneous parts being transferred. ๐
--max-delete intโ this tells rclone not to delete more than N files. If that limit is exceeded then a fatal error will be generated and rclone will stop the operation in progress. ๐--max-delete-size SizeSuffixโ rclone will stop deleting files when the total size of deletions has reached the size specified. It defaults to off.
If that limit is exceeded then a fatal error will be generated and rclone will stop the operation in progress. Same energy as above, just sized-based instead of count-based. ๐
--max-depth intโ this modifies the recursion depth for all the commands exceptpurge.
So if you do rclone --max-depth 1 ls remote:path you will see only the files in the top level directory. Using --max-depth 2 means you will see all the files in first two directory levels and so on. It's giving very organized, very controlled. โจ
For historical reasons the lsd command defaults to using a --max-depth of 1 โ you can override this with the command line flag.
You can use this command to disable recursion (with --max-depth 1).
Note that if you use this withsyncand--delete-excludedthe files not recursed through are considered excluded and will be deleted on the destination. Test first with--dry-runif you are not sure what will happen. ๐ญ Please test first bestie, I'm begging.
--max-duration Durationโ rclone will stop transferring when it has run for the duration specified. Defaults to off. โฐ
When the limit is reached all transfers will stop immediately. Use --cutoff-mode to modify this behaviour.
Rclone will exit with exit code 10 if the duration limit is reached.
--max-transfer SizeSuffixโ rclone will stop transferring when it has reached the size specified. Defaults to off.
When the limit is reached all transfers will stop immediately. Use --cutoff-mode to modify this behaviour.
Rclone will exit with exit code 8 if the transfer limit is reached.
--cutoff-mode HARD|SOFT|CAUTIOUSโ configure the behavior of--max-transferand--max-duration. ๐๏ธ
HARD will stop transferring immediately when rclone reaches the limit. This is the default.
SOFT will stop starting new transfers when rclone reaches the limit.
CAUTIOUS will try to prevent rclone from reaching the limit. Only applicable for --max-transfer.
-M,--metadataโ setting this flag enables rclone to copy the metadata from the source to the destination. For local backends this is ownership, permissions, xattr etc. See the metadata section for more info. ๐ฅ--metadata-mapper SpaceSepListโ if you supply the parameter--metadata-mapper /path/to/programthen rclone will use that program to map metadata from source object to destination object. ๐ง
The argument to this flag should be a command with an optional space separated list of arguments. If one of the arguments has a space in then enclose it in ", if you want a literal " in an argument then enclose the argument in " and double the ". See CSV encoding (https://godoc.org/encoding/csv) for more info. โจ
--metadata-mapper "python bin/test_metadata_mapper.py"
--metadata-mapper 'python bin/test_metadata_mapper.py "argument with a space"'
--metadata-mapper 'python bin/test_metadata_mapper.py "argument with ""two"" quotes"'
Ok so quoting works like that, bestie, in case your script path has spaces or you're passing args with quotes in them ๐
Anyway bestie, it's giving simple JSON based protocol energy: input on STDIN, output on STDOUT. It gets called for every single file and directory that's copied, and heads up โ it may be called concurrently, so don't go assuming you're the only one in the chat ๐ญ
The program's whole job? Take a metadata blob on the input and turn it into a metadata blob on the output that's actually suitable for the destination backend. Glow-up, but for metadata โจ
Input to the program (via STDIN) might look like this. It's giving context, and the context matters, ok:
- SrcFs is the config string for the remote that the object is currently on.
- SrcFsType is the name of the source backend.
- DstFs is the config string for the remote that the object is being copied to
- DstFsType is the name of the destination backend.
- Remote is the path of the object relative to the root.
- Size, MimeType, ModTime are attributes of the object.
- IsDir is true if this is a directory (not yet implemented).
- ID is the source ID of the object if known.
- Metadata is the backend specific metadata as described in the backend docs.
{
"SrcFs": "gdrive:",
"SrcFsType": "drive",
"DstFs": "newdrive:user",
"DstFsType": "onedrive",
"Remote": "test.txt",
"Size": 6,
"MimeType": "text/plain; charset=utf-8",
"ModTime": "2022-10-11T17:53:10.286745272+01:00",
"IsDir": false,
"ID": "xyz",
"Metadata": {
"btime": "2022-10-11T16:53:11Z",
"content-type": "text/plain; charset=utf-8",
"mtime": "2022-10-11T17:53:10.286745272+01:00",
"owner": "user1@domain1.com",
"permissions": "...",
"description": "my nice file",
"starred": "false"
}
}
Then your program should modify the input however it wants and yeet it to STDOUT. The returned Metadata field gets used in its entirety for the destination object โ and every other field? Ignored. Bye ๐
Not me translating user names and permissions and adding a lil something to the description in this example:
{
"Metadata": {
"btime": "2022-10-11T16:53:11Z",
"content-type": "text/plain; charset=utf-8",
"mtime": "2022-10-11T17:53:10.286745272+01:00",
"owner": "user1@domain2.com",
"permissions": "...",
"description": "my nice file [migrated from domain1]",
"starred": "false"
}
}
And yes, metadata can be removed here too. Deletion era ๐๏ธ
An example python program to pull off the transformations above would look something like this:
import sys, json
i = json.load(sys.stdin)
metadata = i["Metadata"]
# Add tag to description
if "description" in metadata:
metadata["description"] += " [migrated from domain1]"
else:
metadata["description"] = "[migrated from domain1]"
# Modify owner
if "owner" in metadata:
metadata["owner"] = metadata["owner"].replace("domain1.com", "domain2.com")
o = { "Metadata": metadata }
json.dump(o, sys.stdout, indent="\t")
You can find this example (slightly expanded) in the rclone source code at bin/test_metadata_mapper.py โ https://github.com/rclone/rclone/blob/master/bin/test_metadata_mapper.py ๐ซถ
And if you wanna see what goes into the metadata mapper and what comes back out of it, hit it with -vv --dump mapper. Main character logging energy, genuinely ๐ฅ
See the metadata section for more info.
๐ธ --metadata-set stringArray
Specify value as string in format key=value to add metadata key with value value when uploading. Repeat it as many times as you need, girl, there's no limit here. See the metadata section for more info.
โฐ --modify-window Duration
When checking whether a file has been modified, this is the maximum allowed time difference that a file can have and still be considered equivalent.
Default is 1ns unless this is overridden by a remote. For example OS X only stores modification times to the nearest second, so if you're reading and writing to an OS X filing system this will be 1s by default. Vibes-based timekeeping fr fr.
This command line flag lets you override that computed default, in case the auto-math isn't giving what you need ๐
๐งต --multi-thread-write-buffer-size SizeSuffix
When transferring with multiple threads, rclone will buffer the specified number of bytes in memory before writing to disk for each thread.
This can improve performance if the underlying filesystem does not deal well with a lot of small writes in different positions of the file โ so if you see transfers being limited by disk write speed, you might wanna experiment with different values. Specially for magnetic drives and remote file systems a higher value can be useful ๐
Nevertheless, the default of 128k should be fine for almost all use cases, so before changing it, ensure that network is not really your bottleneck. Read the room, bestie.
As a final hint, size is not the only factor: block size (or similar concept) can have an impact. In one case, they observed that exact multiples of 16k performed much better than other values. Iconic detective work honestly ๐
๐ฐ --multi-thread-chunk-size SizeSuffix
Normally the chunk size for multi thread transfers is set by the backend. However some backends such as local and smb (which implement OpenWriterAt but not OpenChunkWriter) don't have a natural chunk size.
In this case the value of this option is used (default 64Mi).
๐ฅ --multi-thread-cutoff SizeSuffix
When transferring files above the specified size to capable backends, rclone will use multiple threads to transfer the file (default 256M).
Capable backends are marked in the overview at https://rclone.org/overview/#optional-features as MultithreadUpload. (They need to implement either the OpenWriterAt or OpenChunkWriter internal interfaces). These include local, s3, azureblob, b2, oracleobjectstorage and smb at the time of writing. Ate, no crumbs ๐
On the local disk, rclone preallocates the file (using fallocate(FALLOC_FL_KEEP_SIZE) on unix or NTSetInformationFile on Windows, both of which takes no time) then each thread writes directly into the file at the correct place. This means that rclone won't create fragmented or sparse files and there won't be any assembly time at the end of the transfer. Clean, precise, organized โจ
The number of threads used to transfer is controlled by --multi-thread-streams.
Use -vv if you wish to see info about the threads.
This will work with the sync (https://rclone.org/commands/rclone_sync/), copy (https://rclone.org/commands/rclone_copy/) and move (https://rclone.org/commands/rclone_move/) commands, and friends copyto (https://rclone.org/commands/rclone_copyto/), moveto (https://rclone.org/commands/rclone_moveto/). Multi thread transfers will be used with rclone mount and rclone serve if --vfs-cache-mode is set to writes or above.
Most multi-thread transfers do not take additional memory, but some do (for example uploading to s3). In the worst case memory usage can be at maximum --transfers * --multi-thread-chunk-size * --multi-thread-streams or specifically for the s3 backend --transfers * --s3-chunk-size * --s3-concurrency. However you can use the --max-buffer-memory (https://rclone.org/docs/#max-buffer-memory) flag to control the maximum memory used here. Budget queen behaviour ๐ค
NB that this only works with supported backends as the destination but will work with any backend as the source.
NB that multi-thread copies are disabled for local to local copies as they are faster without, unless --multi-thread-streams is set explicitly.
NB on Windows using multi-thread transfers to the local disk will cause the resulting files to be sparse (https://en.wikipedia.org/wiki/Sparse_file). Use--local-no-sparseto disable sparse files (which may cause long delays at the start of transfers) or disable multi-thread transfers with--multi-thread-streams 0. Not the Windows sparse file jump scare ๐ญ
๐ --multi-thread-streams int
When using multi thread transfers (see above, --multi-thread-cutoff) this sets the number of streams to use. Set to 0 to disable multi thread transfers (Default 4).
If the backend has a --backend-upload-concurrency setting (eg --s3-upload-concurrency) then this setting will be used as the number of transfers instead if it is larger than the value of --multi-thread-streams, or if --multi-thread-streams isn't set.
๐ช --name-transform stringArray
--name-transform introduces path name transformations for rclone copy, rclone sync, and rclone move. These transformations enable modifications to source and destination file names by applying prefixes, suffixes, and other alterations during transfer operations. For detailed docs and examples, see convmv (https://rclone.org/commands/rclone_convmv/). Renaming slay ๐
๐ --no-check-dest
The --no-check-dest can be used with move or copy and it causes rclone not to check the destination at all when copying files.
This means that:
- the destination is not listed, minimising the API calls
- files are always transferred
- this can cause duplicates on remotes which allow it (e.g. Google Drive)
--retries 1is recommended otherwise you'll transfer everything again on a retry
This flag is useful to minimise the transactions if you know that none of the files are on the destination.
This is a specialized flag which should be ignored by most users! Do not touch unless you know exactly why, bestie, I'm begging ๐
๐ซ --no-gzip-encoding
Don't set Accept-Encoding: gzip. This means that rclone won't ask the server for compressed files automatically. Useful if you've set the server to return files with Content-Encoding: gzip but you uploaded compressed files.
There is no need to set this in normal operation, and doing so will decrease the network transfer efficiency of rclone. So likeโฆ don't? Unless you literally need it ๐ซ
๐งญ --no-traverse
The --no-traverse flag controls whether the destination file system is traversed when using the copy or move commands. --no-traverse is not compatible with sync and will be ignored if you supply it with sync.
If you are only copying a small number of files (or are filtering most of the files) and/or have a large number of files on the destination, then --no-traverse will stop rclone listing the destination and save time.
However, if you are copying a large number of files โ especially if you're doing a copy where lots of the files under consideration haven't changed and won't need copying โ then you shouldn't use --no-traverse. Know your moment โ
See rclone copy (https://rclone.org/commands/rclone_copy/) for an example of how to use it.
๐ฆ --no-unicode-normalization
Don't normalize unicode characters in filenames during the sync routine. As-is, no edits, untouched, raw ๐
okay bestie, the unicode one (continued) ๐
Sometimes your operating system is gonna store filenames that contain unicode bits in their decomposed form (macOS, we are literally looking at you ๐ซต). Then some cloud storage systems go and recompose that unicode, and now you've got duplicate files the second the data gets copied back down to a local filesystem. a mess. ๐ญ
Flip this flag on and that whole normalization situation is cancelled โ every unicode character is treated as its own unique collectible. Like, by default รฉ and รฉ get normalized into the same character. With --no-unicode-normalization they're treated as unique characters. two icons, no overlap, periodt. โจ
--no-update-modtimeโ with this flag on, rclone will not update modification times of remote files when they're incorrect, even though it normally would. super useful when the remote is also being synced by another tool (e.g. the Google Drive client) โ nobody likes two apps fighting over the same timestamps ๐--no-update-dir-modtimeโ same energy as above but for directories: rclone won't update modification times of remote directories if they're incorrect, even though it normally would. ๐ธ--order-bystring โ bestie this one controls the order in which files in the backlog get processed inrclone sync,rclone copyandrclone move. it's giving queue-manager energy ๐
The order by string is built like this. First part says what is being measured:
sizeโ order by the size of the filesnameโ order by the full path of the filesmodtimeโ order by the modification date of the files
Then you can slap a modifier on with a comma:
ascendingorascโ order so that the smallest (or oldest) is processed firstdescendingordescโ order so that the largest (or newest) is processed firstmixedโ order so that the smallest is processed first for some threads and the largest for others
If the modifier is mixed then it can have an optional percentage (which defaults to 50), e.g. size,mixed,25 which means that 25% of the threads should be taking the smallest items and 75% the largest. The threads which take the smallest first will always take the smallest first and likewise the largest first threads. The mixed mode can be useful to minimise the transfer time when you are transferring a mixture of large and small files โ the large files are guaranteed upload threads and bandwidth and the small files will be processed continuously. it's giving โจload balancingโจ
If no modifier is supplied then the order is ascending.
For example:
--order-by size,descโ send the largest files first--order-by modtime,ascendingโ send the oldest files first--order-by nameโ send the files with alphabetically by path first
If the --order-by flag is not supplied or it is supplied with an empty string then the default ordering will be used which is as scanned. With --checkers 1 this is mostly alphabetical, however with the default --checkers 8 it is somewhat random. (chaotic. unhinged. we love her. ๐)
Limitations
The --order-by flag does not do a separate pass over the data. Translation: it may transfer some files out of the order specified if
- there are no files in the backlog or the source has not been fully scanned yet
- there are more than
--max-backlogfiles in the backlog
Rclone will do its best to transfer the best file it has so in practice this should not cause a problem. Think of --order-by as being more of a best efforts flag rather than a perfect ordering. ngl it's trying its best ๐ฅบ
If you want perfect ordering then you will need to specify --check-first which will find all the files which need transferring first before transferring any. icon behaviour, no notes. ๐
--partial-suffixstring โ when--inplaceis not used, it causes rclone to use the--partial-suffixas suffix for temporary files. Suffix length limit is 16 characters. The default is.partial. ๐--password-commandSpaceSepList โ this flag supplies a program which should supply the config password when run. This is an alternative to rclone prompting for the password or setting theRCLONE_CONFIG_PASSvariable. It is also used when setting the config password for the first time. ๐
The argument to this should be a command with a space separated list of arguments. If one of the arguments has a space in then enclose it in ", if you want a literal " in an argument then enclose the argument in " and double the ". This includes the command itself: if the path to the executable contains a space, it must be quoted too. See CSV encoding (https://godoc.org/encoding/csv) for more info.
Eg:
--password-command "echo hello"
--password-command 'echo "hello with space"'
--password-command 'echo "hello with ""quotes"" and space"'
--password-command '"/path with a space/get-password.sh"'
Note that when changing the configuration password the environment variable RCLONE_PASSWORD_CHANGE=1 will be set. This can be used to distinguish initial decryption of the config file from the new password.
See the Configuration Encryption for more info.
See a Windows PowerShell example on the Wiki (https://github.com/rclone/rclone/wiki/Windows-Powershell-use-rclone-password-command-for-Config-file-password).
-P,--progressโ this flag makes rclone update the stats in a static block in the terminal, providing a realtime overview of the transfer. main character energy fr fr ๐
Any log messages will scroll above the static block. Log messages will push the static block down to the bottom of the terminal where it will stay. it's so well behaved ๐ซถ
Normally this is updated every 500mS but this period can be overridden with the --stats flag.
This can be used with the --stats-one-line flag for a simpler display.
To change the display length of filenames (for different terminal widths), see the --stats-file-name-length option. The default output is formatted for 80 character wide terminals.
Note: On Windows until this bug (https://github.com/Azure/go-ansiterm/issues/26) is fixed all non-ASCII characters will be replaced with.when--progressis in use. rip to the emoji girlies on Windows ๐ญ
--progress-terminal-titleโ this flag, when used with-P/--progress, will print the stringETA: %sto the terminal title. cute little window title moment ๐-q,--quietโ this flag will limit rclone's output to error messages only. silence, but make it โจdeliberateโจ--refresh-timesโ the--refresh-timesflag can be used to update modification times of existing files when they are out of sync on backends which don't support hashes. ๐ฐ๏ธ
This is useful if you uploaded files with the incorrect timestamps and you now wish to correct them.
This flag is only useful for destinations which don't support hashes (e.g. crypt).
This can be used any of the sync commands sync (https://rclone.org/commands/rclone_sync/), copy (https://rclone.org/commands/rclone_copy/) or move (https://rclone.org/commands/rclone_move/).
To use this flag you will need to be doing a modification time sync (so not using --size-only or --checksum). The flag will have no effect when using --size-only or --checksum. important bestie!! ๐จ
If this flag is used when rclone comes to upload a file it will check to see if there is an existing file on the destination. If this file matches the source with size (and checksum if available) but has a differing timestamp then instead of re-uploading it, rclone will update the timestamp on the destination file. If the checksum does not match rclone will upload the new file. If the checksum is absent (e.g. on a crypt backend) then rclone will update the timestamp.
Note that some remotes can't set the modification time without re-uploading the file so this flag is less useful on them. ๐
Normally if you are doing a modification time sync rclone will update modification times without --refresh-times provided that the remote supports checksums and the checksums match on the file. However if the checksums are absent then rclone will upload the file rather than setting the timestamp as this is the safe behaviour. safety first, always. ๐
--retriesint โ retry the entire sync if it fails this many times it fails (default3).
Some remotes can be unreliable and a few retries help pick up the files which didn't get transferred because of errors.
Disable retries with --retries 1. (one try, no mercy ๐)
--retries-sleepDuration โ this sets the interval between each retry specified by--retries. The default is0. Use0to disable. ๐ค--server-side-across-configsโ allow server-side operations (e.g. copy or move) to work across different configurations. ๐
This can be useful if you wish to do a server-side copy or move between two remotes which use the same backend but are configured differently.
Note that this isn't enabled by default because it isn't easy for rclone to tell if it will work between any two configurations. (she's careful, she's โจcautiousโจ)
--size-onlyโ normally rclone will look at modification time and size of files to see if they are equal. If you set this flag then rclone will check only the size.
This can be useful transferring files from Dropbox which have been modified by the desktop sync client which doesn't set checksums of modification times in the same way as rclone. Dropbox bestie we love you but ๐ญ
--statsDuration โ commands which transfer data (sync (https://rclone.org/commands/rclone_sync/), copy (https://rclone.org/commands/rclone_copy/), copyto (https://rclone.org/commands/rclone_copyto/), move (https://rclone.org/commands/rclone_move/), moveto (https://rclone.org/commands/rclone_moveto/)) will print data transfer stats at regular intervals to show their progress. ๐
This sets the interval.
The default is 1m. Use 0 to disable.
If you set the stats interval then all commands can show stats. This can be useful when running other commands, check or mount for example.
Stats are logged at INFO level by default which means they won't show at default log level NOTICE. Use --stats-log-level NOTICE or -v to make them show. See the logging section for more info on log levels.
Note that on macOS you can send a SIGINFO (which is normally ctrl-T in the terminal) to make the stats print immediately. mac girlies stay winning ๐
--stats-file-name-lengthint โ by default, the--statsoutput will truncate file names and paths longer than40characters. This is equivalent to providing--stats-file-name-length 40. Use--stats-file-name-length 0to disable any truncation of file names printed by stats. โ๏ธ--stats-log-levelLogLevel โ log level to show--statsoutput at. This can beDEBUG,INFO,NOTICE, orERROR. The default isINFO. This means at the default level of logging, which isNOTICE, the stats won't show โ if you want them to then use--stats-log-level NOTICE. See the logging section for more details on log levels. ๐--stats-one-lineโ when this is specified, rclone condenses the stats into a single line showing the most important stats only. minimalism era โจ--stats-one-line-dateโ when this is specified, rclone enables the single-line stats and prepends the display with a date string. The default is2006/01/02 15:04:05 -๐๏ธ--stats-one-line-date-format stringโ bestie, if you set this, rclone flips on the single-line stats and slaps a custom date string right at the front of the display. That date string MUST be wrapped in quotes, no exceptions ๐ , and the formatting syntax follows the golang specs (https://golang.org/pkg/time/#Time.Format), so go read those before you start freestyling.--stats-unit stringโ so by default, data transfer rates get printed in bytes per second, which is the same as saying--stats-unit bytes.
This option lets the data rate be printed in bits per second instead โ you just say --stats-unit bits. Note that your data transfer volume is still reported in bytes tho, that part doesn't change โจ.
Also the rate is reported as a binary unit, not SI. So 1 Mbit/s equals 1,048,576 bit/s and not 1,000,000 bit/s. Math girlies stay winning ๐
--suffix stringโ when you're usingsync(https://rclone.org/commands/rclone_sync/),copy(https://rclone.org/commands/rclone_copy/) ormove(https://rclone.org/commands/rclone_move/), any files that would have been overwritten or deleted get the suffix added to them. And if a file already exists with that same path (like, after the suffix has been added), then it just gets overwritten. Sorry babe ๐
Heads up: the remote you're using must support server-side move or copy, and you must use the same remote as the destination of the sync.
This is for use with files to add the suffix in the current directory, or with --backup-dir. Peep --backup-dir for more info.
For example
rclone copy --interactive /path/to/local/file remote:current --suffix .bak
will copy /path/to/local to remote:current, but for any files which would have been updated or deleted have .bak added.
If you're using rclone sync with --suffix and without --backup-dir, then fr it's recommended to put a filter rule in excluding the suffix, otherwise the sync will delete the backup files ๐ญ Like:
rclone sync --interactive /path/to/local/file remote:current --suffix .bak --exclude "*.bak"
--suffix-keep-extensionโ when you're using--suffix, setting this makes rclone put the SUFFIX before the extension of the files that it backs up, rather than after.
So let's say we had --suffix -2019-01-01, without the flag file.txt would be backed up to file.txt-2019-01-01 and with the flag it would be backed up to file-2019-01-01.txt. This can be super helpful to make sure the suffixed files can still be opened ๐
And if a file has two (or more) extensions and the second (or subsequent) extension is recognised as a valid mime type, then the suffix will go before that extension. So file.tar.gz would be backed up to file-2019-01-01.tar.gz whereas file.badextension.gz would be backed up to file.badextension-2019-01-01.gz. iykyk ๐
--syslogโ on capable OSes (so like, not Windows or Plan9), send all log output to syslog.
This can be useful for running rclone in a script or rclone mount โจ
--syslog-facility stringโ if you're using--syslog, this sets the syslog facility (e.g.KERN,USER). Seeman syslogfor a list of possible facilities. The default facility isDAEMON.--temp-dir stringโ specify the directory rclone will use for temporary files, to override the default. Make sure the directory exists and has accessible permissions, mmkay? ๐
By default the operating system's temp directory will be used:
- On Unix systems,
$TMPDIRif non-empty, else/tmp. - On Windows, the first non-empty value from
%TMP%,%TEMP%,%USERPROFILE%, or the Windows directory.
When overriding the default with this option, the specified path will be set as value of environment variable TMPDIR on Unix systems and TMP and TEMP on Windows.
You can use the config paths (https://rclone.org/commands/rclone_config_paths/) command to see the current value ๐
--tpslimit floatโ caps transactions per second at this number. Default is0, which means unlimited transactions per second.
A transaction is roughly defined as an API call; its exact meaning will depend on the backend. For HTTP based backends it's an HTTP PUT/GET/POST/etc and its response. For FTP/SFTP it's a round trip transaction over TCP.
For example, to limit rclone to 10 transactions per second use --tpslimit 10, or to 1 transaction every 2 seconds use --tpslimit 0.5.
Use this when the number of transactions per second from rclone is causing a problem with the cloud storage provider (e.g. getting you banned or rate limited ๐ญ the horror).
This can be very useful for rclone mount to control the behaviour of applications using it.
This limit applies to all HTTP based backends and to the FTP and SFTP backends. It does not apply to the local backend or the Storj backend.
See also --tpslimit-burst.
--tpslimit-burst intโ max burst of transactions for--tpslimit(default1).
Normally --tpslimit will do exactly the number of transaction per second specified. However if you supply --tps-burst then rclone can save up some transactions from when it was idle, giving a burst of up to the parameter supplied ๐ฅ
For example if you provide --tpslimit-burst 10 then if rclone has been idle for more than 10*--tpslimit then it can do 10 transactions very quickly before they are limited again.
This may be used to increase performance of --tpslimit without changing the long term average number of transactions per second. slay ๐
--track-renamesโ by default, rclone doesn't keep track of renamed files, so if you rename a file locally and then sync it to a remote, rclone will delete the old file on the remote and upload a new copy. the way that wastes so much ๐ญ
An rclone sync with --track-renames runs like a normal sync, but it keeps track of objects which exist in the destination but not in the source (which would normally be deleted), and which objects exist in the source but not the destination (which would normally be transferred). These objects are then candidates for renaming โจ
After the sync, rclone matches up the source only and destination only objects using the --track-renames-strategy specified, and either renames the destination object or transfers the source and deletes the destination object. --track-renames is stateless like all of rclone's syncs ๐
To use this flag the destination must support server-side copy or server-side move, and to use a hash based --track-renames-strategy (the default) the source and the destination must have a compatible hash.
If the destination does not support server-side copy or move, rclone will fall back to the default behaviour and log an error level message to the console.
Encrypted destinations are not currently supported by --track-renames if --track-renames-strategy includes hash ๐ซ
Note that --track-renames is incompatible with --no-traverse and that it uses extra memory to keep track of all the rename candidates (memory girlies, pay attention).
Note also that --track-renames is incompatible with --delete-before and will select --delete-after instead of --delete-during.
--track-renames-strategy stringโ this option changes the file matching criteria for--track-renames.
The matching is controlled by a comma separated selection of these tokens:
modtime- the modification time of the file - not supported on all backendshash- the hash of the file contents - not supported on all backendsleaf- the name of the file not including its directory namesize- the size of the file (this is always enabled)
The default option is hash.
Using --track-renames-strategy modtime,leaf would match files based on modification time, the leaf of the file name and the size only.
Using --track-renames-strategy modtime or leaf can enable --track-renames support for encrypted destinations ๐
Note that the hash strategy is not supported with encrypted destinations.
--delete-(before,during,after)โ this option lets you specify when files on your destination get deleted when you sync folders.
Specifying the value --delete-before will delete all files present on the destination, but not on the source, before starting the transfer of any new or updated files. This uses two passes through the file systems, one for the deletions and one for the copies ๐ฏ
Specifying --delete-during will delete files while checking and uploading files. This is the fastest option and uses the least memory โก
Specifying --delete-after (the default value) will delay deletion of files until all new/updated files have been successfully transferred. The files to be deleted are collected in the copy pass, then deleted after the copy pass has completed successfully. The files to be deleted are held in memory so this mode may use more memory. This is the safest mode as it will only delete files if there have been no errors subsequent to that. If there have been errors before the deletions start then you will get the message not deleting files as there were IO errors. dramatic but for your own good ๐ซถ
--fast-listโ when doing anything which involves a directory listing (e.g.sync,copy,ls- in fact nearly every command), rclone has different strategies to choose from.
The basic strategy is to list one directory and processes it before using more directory lists to process any subdirectories. This is a mandatory backend feature, called List, which means it is supported by all backends. This strategy uses small amount of memory, and because it can be parallelised it is fast for operations involving processing of the list results โจ
Some backends provide the support for an alternative strategy, where all files beneath a directory can be listed in one (or a small number) of transactions. Rclone supports this alternative strategy through an optional backend feature called ListR (https://rclone.org/overview/#listr). You can see in the storage system overview documentation's optional features (https://rclone.org/overview/#optional-features) section which backends it is enabled for (these tend to be the bucket-based ones, e.g. S3, B2, GCS, Swift). This strategy requires fewer transactions for highly recursive operations, which is important on backends where this is charged or heavily rate limited. It may be faster (due to fewer transactions) or slower (because it can't be parallelized) depending on different parameters, and may require more memory if rclone has to keep the whole listing in memory. it's giving trade-offs, bestie ๐
Which listing strategy rclone picks for a given operation is complicated, but in general it tries to choose the best possible. It will prefer ListR in situations where it doesn't need to store the listed files in memory, e.g. for unlimited recursive ls command variants. In other situations it will prefer List, e.g. for sync and copy, where it needs to keep the listed files in memory, and is performing operations on them where parallelization may be a huge advantage ๐ฅ
Rclone can't read your mind about which strategy eats less, so it gives you two little dials instead. You can stop rclone from using ListR at all by killing the feature with the --disable option (--disable ListR), or you can let rclone use ListR even where it'd normally say "nah, too much memory" by flipping --fast-list. Either way, rclone should always produce identical results โ like, genuinely identical. And if you slap --disable ListR or --fast-list on a remote that doesn't even support ListR? Nothing happens. rclone just shrugs and ignores it. ๐ซถ
Rule of thumb bestie: if you're paying for transactions AND your whole sync listing fits in memory, then yeah, --fast-list is the move, recommended, slay. But if you've got a very big sync going down, do NOT use --fast-list, or you will run out of memory and it's giving tragedy. Run some tests, compare, and if you're in doubt just leave the default โ let rclone decide, i.e. not use --fast-list. Periodt.
โฑ๏ธ --timeout Duration
This sets the IO idle timeout. If a transfer has started but then becomes idle for this long, it's considered broken and disconnected. Ghosted, basically. ๐
The default is 5m. Set to 0 to disable.
๐ฅ --transfers int
The number of file transfers to run in parallel. Sometimes it's useful to set this to a smaller number if your remote is being dramatic and giving a lot of timeouts, or bigger if you have lots of bandwidth and a fast remote. Main character energy.
The default is to run 4 file transfers in parallel.
Look at --multi-thread-streams if you would like to control single file transfers.
๐ -u, --update
This forces rclone to skip any files which exist on the destination and have a modified time that is newer than the source file.
This can be useful in avoiding needless transfers when transferring to a remote which doesn't support modification times directly (or when using --use-server-modtime to avoid extra API calls) as it is more accurate than a --size-only check and faster than using --checksum. On such remotes (or when using --use-server-modtime) the time checked will be the uploaded time.
If an existing destination file has a modification time older than the source file's, it will be updated if the sizes are different. If the sizes are the same, it will be updated if the checksum is different or not available.
If an existing destination file has a modification time equal (within the computed modify window) to the source file's, it will be updated if the sizes are different. The checksum will not be checked in this case unless the --checksum flag is provided.
In all other cases the file will not be updated.
Consider using the --modify-window flag to compensate for time skews between the source and the backend, for backends that do not support mod times, and instead use uploaded times. However, if the backend does not support checksums, note that syncing or copying within the time skew window may still result in additional transfers for safety. ๐
๐ง --use-mmap
If this flag is set then rclone will use anonymous memory allocated by mmap on Unix based platforms and VirtualAlloc on Windows for its transfer buffers (size controlled by --buffer-size). Memory allocated like this does not go on the Go heap and can be returned to the OS immediately when it is finished with.
If this flag is not set then rclone will allocate and free the buffers using the Go memory allocator which may use more memory as memory pages are returned less aggressively to the OS.
It is possible this does not work well on all platforms so it is disabled by default; in the future it may be enabled by default. ๐
๐ฐ๏ธ --use-server-modtime
Some object-store backends (e.g, Swift, S3) do not preserve file modification times (modtime). On these backends, rclone stores the original modtime as additional metadata on the object. By default it will make an API call to retrieve the metadata when the modtime is needed by an operation.
Use this flag to disable the extra API call and rely instead on the server's modified time. In cases such as a local to remote sync using --update, knowing the local file is newer than the time it was last uploaded to the remote is sufficient. In those cases, this flag can speed up the process and reduce the number of API calls necessary. Efficiency queen ๐
This flag is only supported on certain backends and will be silently ignored on unsupported backends. Supported backends include azureblob, oracleobjectstorage, s3, swift.
Using this flag on a sync operation without also using --update would cause all files modified at any time other than the last upload time to be uploaded again, which is probably not what you want. Not the vibe fr fr.
๐ฃ๏ธ -v, -vv, --verbose
With -v rclone will tell you about each file that is transferred and a small number of significant events.
With -vv rclone will become very verbose telling you about every file it considers and transfers. Please send bug reports with a log with this setting.
When setting verbosity as an environment variable, use RCLONE_VERBOSE=1 or RCLONE_VERBOSE=2 for -v and -vv respectively.
โจ -V, --version
Prints the version number
๐ SSL/TLS options
The outgoing SSL/TLS connections rclone makes can be controlled with these options. For example this can be very useful with the HTTP or WebDAV backends. Rclone HTTP servers have their own set of configuration for SSL/TLS which you can find in their documentation. Don't mix them up bestie, they're different girlies. ๐
๐ --ca-cert stringArray
This loads the PEM encoded certificate authority certificates and uses it to verify the certificates of the servers rclone connects to.
If you have generated certificates signed with a local CA then you will need this flag to connect to servers using those certificates.
๐ชช --client-cert string
This loads the PEM encoded client side certificate.
This is used for mutual TLS authentication (https://en.wikipedia.org/wiki/Mutual_authentication).
The --client-key flag is required too when using this.
๐๏ธ --client-key string
This loads the PEM encoded client side private key used for mutual TLS authentication. Used in conjunction with --client-cert.
Supported types are:
- Unencrypted PKCS#1 (
"BEGIN RSA PRIVATE KEY") - Unencrypted PKCS#8 (
"BEGIN PRIVATE KEY") - Encrypted PKCS#8 (
"BEGIN ENCRYPTED PRIVATE KEY") - Legacy PEM encryption (e.g.,
DEK-Infoheaders), which are automatically detected.
๐คซ --client-pass string
This can be used to supply an optional password to decrypt the client key file.
NB the password should be obscured so it should be the output of rclone obscure YOURPASSWORD.
๐ซ --no-check-certificate
--no-check-certificate controls whether a client verifies the server's certificate chain and host name. If --no-check-certificate is true, TLS accepts any certificate presented by the server and any host name in that certificate. In this mode, TLS is susceptible to man-in-the-middle attacks. ๐ญ Scary.
This option defaults to false.
This should be used only for testing. Do not ship this, I'm begging.
๐ Configuration encryption
Your configuration file contains information for logging in to your cloud services. This means that you should keep your rclone.conf file in a secure location. It's literally your diary but for cloud credentials.
If you are in an environment where that isn't possible, you can add a password to your configuration. This means that you will have to supply the password every time you start rclone.
To add a password to your rclone configuration, execute rclone config.
$ rclone config
Current remotes:
e) Edit existing remote
n) New remote
d) Delete remote
s) Set configuration password
q) Quit config
e/n/d/s/q>
Go into s, Set configuration password:
e/n/d/s/q> s
Your configuration is not encrypted.
If you add a password, you will protect your login information to cloud services.
a) Add Password
q) Quit to main menu
a/q> a
Enter NEW configuration password:
password:
Confirm NEW password:
password:
Password set
Your configuration is encrypted.
c) Change Password
u) Unencrypt configuration
q) Quit to main menu
c/u/q>
Your configuration is now encrypted, and every time you start rclone you will have to supply the password. See below for details. In the same menu, you can change the password or completely remove encryption from your configuration.
There is no way to recover the configuration if you lose your password. ๐ธ Gone. Deleted. No take-backs. Write it down somewhere safe.
You can also use
rclone config encryption set(https://rclone.org/commands/rclone_config_encryption_set/) to set the config encryption directlyrclone config encryption remove(https://rclone.org/commands/rclone_config_encryption_remove/) to remove itrclone config encryption check(https://rclone.org/commands/rclone_config_encryption_check/) to check that it is encrypted properly.
rclone uses nacl secretbox (https://godoc.org/golang.org/x/crypto/nacl/secretbox) which in turn uses XSalsa20 and Poly1305 to encrypt and authenticate your configuration with secret-key cryptography. The password is SHA-256 hashed, which produces the key for secretbox. The hashed password is not stored. Obsessed with the security actually. ๐
While this provides very good security, we do not recommend storing your encrypted rclone configuration in public if it contains sensitive information, maybe except if you use a very strong password.
If it is safe in your environment, you can set the RCLONE_CONFIG_PASS environment variable to contain your password, in which case it will be used for decrypting the configuration.
You can set this for a session from a script. For unix like systems save this to a file called set-rclone-password:
#!/bin/echo Source this file don't run it
read -s RCLONE_CONFIG_PASS
export RCLONE_CONFIG_PASS
Then source the file when you want to use it. From the shell you would do source set-rclone-password. It will then ask you for the password and set it in the environment variable. ๐
An alternate means of supplying the password is to provide a script which will retrieve the password and print on standard output. This script should have a fully specified path name and not rely on any environment variables. The script is supplied either via --password-command="..." command line argument or via the RCLONE_PASSWORD_COMMAND environment variable.
One useful example of this is using the passwordstore application to retrieve the password:
export RCLONE_PASSWORD_COMMAND="pass rclone/config"
...so like, if your passwordstore password manager is the one holding the password for your rclone config, the script method means that password is mainly protected by the passwordstore system itself ๐. It's never sitting there in the clear inside scripts, and it's not available for snooping with the standard commands either. And ngl bestie, this matters: with long-running rclone sessions it's quite possible for copies of passwords to get innocently captured in log files, terminal scroll buffers, etc. ๐ So using the script method to hand over the password levels up your config password security considerably. โจ
If you're running rclone inside a script, and you're not using the --password-command method, you might wanna disable password prompts altogether. Do that by passing --ask-password=false to rclone. What that does: rclone will fail instead of asking for a password, if RCLONE_CONFIG_PASS doesn't contain a valid password and --password-command hasn't been supplied. No sneaky hanging prompt, just a clean fail. ๐
And whenever you run commands that might be affected by options in a configuration file, rclone goes looking for an existing file using the rules described above, and loads whatever it finds. If what it finds is an encrypted file, that includes decrypting it โ with the possible consequence of a password prompt ๐ญ. So if you're running a command line you know isn't actually pulling anything from such a config file, you can dodge the whole load by overriding the location, e.g. with one of the documented special values for memory-only configuration. Since only backend options can be stored in configuration files, this is normally unnecessary for commands that don't operate on backends โ like completion. But it will be relevant for commands that do operate on backends in general, yet get used without referencing a stored remote โ like listing local filesystem paths, or connection strings: rclone --config="" ls . ๐
๐ธ Configuration encryption cheatsheet ๐ธ
Okay so you can quickly apply configuration encryption with no plain-text at rest or in transfer. Here's the detailed tea for the popular OSes:
๐ Mac
- Generate and store a password
security add-generic-password -a rclone -s config -w $(openssl rand -base64 40)
- Add the retrieval instruction to your
.zprofile/.profile
export RCLONE_PASSWORD_COMMAND="/usr/bin/security find-generic-password -a rclone -s config -w"
๐ง Linux
- Prerequisite: Linux doesn't come with a default password manager. So let's install the "pass" utility using a package manager, e.g.
apt install pass,yum install pass, etc. (https://www.passwordstore.org/#download); then initialize a password store:pass init rclone. - Generate and store a password
echo $(openssl rand -base64 40) | pass insert -m rclone/config
- Add the retrieval instruction
export RCLONE_PASSWORD_COMMAND="/usr/bin/pass rclone/config"
๐ช Windows
- Generate and store a password
New-Object -TypeName PSCredential -ArgumentList "rclone", (ConvertTo-SecureString -String ([System.Web.Security.Membership]::GeneratePassword(40, 10)) -AsPlainText -Force) | Export-Clixml -Path "rclone-credential.xml"
- Add the password retrieval instruction
[Environment]::SetEnvironmentVariable("RCLONE_PASSWORD_COMMAND", "[System.Runtime.InteropServices.Marshal]::PtrToStringAuto([System.Runtime.InteropServices.Marshal]::SecureStringToBSTR((Import-Clixml -Path "rclone-credential.xml").Password))")
๐ Encrypt the config file (all systems)
- Execute
rclone config, and select options) Set configuration password - Add/update the password from previous steps
๐ ๏ธ Developer options ๐ ๏ธ
These options are literally your bestie when you're developing or debugging rclone. There are also some more remote-specific options that aren't documented here โ those are used for testing, and they start with the remote name, e.g. --drive-test-option โ see the docs for the remote in question. ๐
--cpuprofilestring โ Write CPU profile to a file. This can be analysed withgo tool pprof.--memprofilestring โ Write memory profile to a file. This can be analysed withgo tool pprof.--dumpDumpFlags โ The--dumpflag takes a comma separated list of flags to dump info about.
Note that some headers, such as Accept-Encoding, may not be correct as shown in the request, and the response may not show Content-Encoding if the go standard libraries auto gzip encoding was in effect. In this case the body of the request will be gunzipped before showing it. ๐ซถ
The available flags are:
headersโ dumps HTTP headers. AnyAuthorization:headers will be excluded, but output may still contain sensitive information ๐ฌ. Can be very verbose. Useful for debugging only. Useauthif you do want theAuthorization:headers.authโ dumps HTTP headers likeheaders, but also includes anyAuthorization:headers. This means the output will probably contain sensitive information. Useheadersto dump withoutAuthorization:headers. Can be very verbose. Useful for debugging only. This flag also makes the debug log of the config process (e.g.rclone config -vv) show answers to questions, passwords and tokens which are otherwise redacted. ๐bodiesโ dumps HTTP headers and bodies. May contain sensitive info. Can be very verbose. Useful for debugging only. Note that the bodies are buffered in memory so don't use this for enormous files.requestsโ is similar tobodies, but dumps the request bodies and the response headers. Useful for debugging download problems.responsesโ is similar tobodies, but dumps the response bodies and the request headers. Useful for debugging upload problems.filtersโ dumps the filters. Useful to see exactly what include and exclude options are filtering on.goroutinesโ dumps a list of the running go-routines at the end of the command.openfilesโ dumps a list of the open files at the end of the command. It uses thelsofUnix command to do that, so you'll need that installed to use it.mapperโ dumps the JSON blobs being sent to the program supplied with--metadata-mapperand received from it. It can be useful for debugging the metadata mapper interface.curlโ dumps the HTTP request as acurlcommand. Can be used with the other HTTP debugging flags (e.g.requests,bodies). By default the auth will be masked โ use withauthto have the curl commands with authentication too.errorsโ only dumps the HTTP transactions which fail with a retryable error โ that is a transport error, an HTTP429(too many requests) or an HTTP5xxserver error. The other dump flags control what is dumped, so for example use--dump errors,bodiesto dump the headers and bodies of failed transactions only. On its own--dump errorsdumps the headers. This lets you capture first-failure diagnostics without the noise of dumping every transaction. May contain sensitive info.traceโ logs connection level events for each HTTP transaction using Go'snet/http/httptraceโ DNS resolution, TCP connect, TLS handshake (including the negotiated TLS version, cipher, ALPN protocol and server certificate), connection reuse, request write and time to first response byte. Each line is tagged with the time elapsed since the start of the transaction so you can see where the time goes โฑ๏ธ. This is complementary to the other dump flags: it shows how the connection behaved rather than what was sent, so it's useful for debugging connectivity, DNS, TLS, proxy and keep-alive problems. It does not dump headers or bodies โ combine it withheadersorbodiesfor that.
๐ฆ Filtering ๐ฆ
For the filtering options:
--delete-excluded--filter--filter-from--exclude--exclude-from--exclude-if-present--include--include-from--files-from--files-from-raw--files-from0--min-size--max-size--min-age--max-age--hash-filter--dump filters--metadata-include--metadata-include-from--metadata-exclude--metadata-exclude-from--metadata-filter--metadata-filter-from
See the filtering section (https://rclone.org/filtering/). โจ
๐ Remote control ๐
For the remote control options and for instructions on how to remote control rclone:
--rc- Anything starting with
--rc-
See the remote control section (https://rclone.org/rc/). ๐
๐ Logging ๐
rclone has 4 levels of logging: ERROR, NOTICE, INFO and DEBUG.
By default, rclone logs to standard error. This means you can redirect standard error and still see the normal output of rclone commands (e.g. rclone ls).
By default, rclone will produce Error and Notice level messages.
If you use the -q flag, rclone will only produce Error messages. ๐คซ
If you use the -v flag, rclone will produce Error, Notice and Info messages.
If you use the -vv flag, rclone will produce Error, Notice, Info and Debug messages. ๐ฃ๏ธ
You can also control the log levels with the --log-level flag.
If you use the --log-file option, rclone will redirect Error, Info and Debug messages along with standard error to a file.
If you use the --syslog flag then rclone will log to syslog, and the --syslog-facility controls which facility it uses.
Rclone prefixes all log messages with their level in capitals, e.g. INFO, which makes it easy to grep the log file for different kinds of information. ๐
๐ Metrics ๐
Rclone can publish metrics in the OpenMetrics/Prometheus format.
To enable the metrics endpoint, use the --metrics-addr flag. Metrics can also be published on the --rc-addr port if the --rc flag and --rc-enable-metrics flags are supplied, or if using rclone rcd --rc-enable-metrics.
Rclone provides extensive configuration options for the metrics HTTP endpoint. These settings are grouped under the Metrics section and have a prefix --metrics-*.
When metrics are enabled with --rc-enable-metrics, they will be published on the same port as the rc API. In this case, the --metrics-* flags will be ignored, and the HTTP endpoint configuration will be managed by the --rc-* parameters. ๐ซก
๐ช Exit code ๐ช
If any errors occur during the command execution, rclone will exit with a non-zero exit code. This lets scripts detect when rclone operations have failed. ๐ต๏ธ
During the startup phase, rclone will exit immediately if an error is detected in the configuration. There will always be a log message immediately before exiting. Periodt. ๐
okay bestie, real talk about how rclone handles errors while it's out there doing its thing โจ โ it just accumulates them as it goes along, like a little goblin collecting receipts ๐, and it only exits with a non-zero exit code if (after retries) there were still failed transfers. So a blip that fixed itself? not a problem, she moved on ๐
For every error that gets counted there's a high priority log message (visible with -q) showing the message AND which file caused the drama ๐. A high priority message also pops up when a retry is starting, so you know that any previous error messages might not be valid after the retry โ like okay girl we're trying again, don't come for me. And if rclone has done a retry, it'll log a high priority message if the retry was successful ๐. Good girl.
โจ List of exit codes โจ
0โ Success ๐ ate, no crumbs1โ Error not otherwise categorised ๐ซ2โ Syntax or usage error ๐3โ Directory not found ๐ณ๏ธ4โ File not found ๐5โ Temporary error (one that more retries might fix) (Retry errors) ๐6โ Less serious errors (like461errors from dropbox) (NoRetry errors) ๐ฌ7โ Fatal error (one that more retries won't fix, like account suspended) (Fatal errors) โ ๏ธ8โ Transfer exceeded - limit set by--max-transferreached ๐9โ Operation successful, but no files transferred (Requires--error-on-no-transfer) ๐คจ10โ Duration exceeded - limit set by--max-durationreached โฐ
๐ Environment variables ๐
Bestie. You can configure rclone ENTIRELY using environment variables. Not joking. These can be used to set defaults for options or for config file entries. main character config energy, no config file required ๐
Options
Every option in rclone can have its default set by an environment variable. Every. Single. One. ๐
So how do you find the name of the environment variable? Recipe time, follow along:
- Take the long option name
- Strip the leading
-- - Change
-to_ - Make it upper case
- Prepend
RCLONE_
That's it, that's the whole spell ๐ง
For example, if you want to always set --stats 5s, you set the environment variable RCLONE_STATS=5s. And if you set stats on the command line, that will override the environment variable setting โ command line is the main character here, no cap.
Or, if you always want to use the trash in drive โ that's --drive-use-trash โ you set RCLONE_DRIVE_USE_TRASH=true.
Verbosity is slightly different, because of course she is ๐ โ the environment variable equivalent of --verbose or -v is RCLONE_VERBOSE=1, or for -vv it's RCLONE_VERBOSE=2.
The same parser is used for the options and the environment variables, so they take exactly the same form. Symmetry, we love to see it ๐ซถ
The options that got set by environment variables can be seen with the -vv flag, e.g.
rclone version -vv
Options that can appear multiple times (type stringArray) are treated slightly differently, because environment variables can only be defined once ๐ญ. In order to allow a simple mechanism for adding one or many items, the input is treated as a CSV encoded (https://godoc.org/encoding/csv) string. For example:
RCLONE_EXCLUDE="*.jpg"is equivalent to--exclude "*.jpg"RCLONE_EXCLUDE="*.jpg,*.png"is equivalent to--exclude "*.jpg" --exclude "*.png"RCLONE_EXCLUDE='"*.jpg","*.png"'is equivalent to--exclude "*.jpg" --exclude "*.png"RCLONE_EXCLUDE='"/directory with comma , in it /**"'is equivalent to--exclude "/directory with comma , in it /**"
If stringArray options are defined as environment variables and as options on the command line, then all the values will be used. Both. Everything. Greedy and valid ๐
Config file
You can set defaults for values in the config file on an individual remote basis ๐ฏ. The names of the config items are documented in the page for each backend โ go read those, bestie, they're right there.
To find the name of the environment variable you need to set, you take:
RCLONE_CONFIG_ + name of remote + _ + name of config file option
and make it all uppercase. One implication here that you need to know: the remote's name must be convertible into a valid environment variable name, so it can only contain letters, digits, or the _ (underscore) character. That's the vibe check the name has to pass โ
For example, to configure an S3 remote named mys3: without a config file (using unix ways of setting environment variables):
$ export RCLONE_CONFIG_MYS3_TYPE=s3
$ export RCLONE_CONFIG_MYS3_ACCESS_KEY_ID=XXX
$ export RCLONE_CONFIG_MYS3_SECRET_ACCESS_KEY=XXX
$ rclone lsd mys3:
-1 2016-09-21 12:54:21 -1 my-bucket
$ rclone listremotes | grep mys3
mys3:
Note that if you want to create a remote using environment variables you must create the..._TYPEvariable as above. No_TYPE, no remote. Periodt.
Note that the name of a remote created using environment variable is case insensitive, in contrast to regular remotes stored in a config file as documented above. You must write the name in uppercase in the environment variable, but as seen from the example above it will be listed and can be accessed in lowercase, while you can also refer to the same remote in uppercase ๐
$ rclone lsd mys3:
-1 2016-09-21 12:54:21 -1 my-bucket
$ rclone lsd MYS3:
-1 2016-09-21 12:54:21 -1 my-bucket
Note that you can only set the options of the immediate backend, soRCLONE_CONFIG_MYS3CRYPT_ACCESS_KEY_IDhas no effect ifmyS3Cryptis a crypt remote based on an S3 remote. HoweverRCLONE_S3_ACCESS_KEY_IDwill set the access key of all remotes using S3, includingmyS3Crypt. It's giving "one set of keys to rule them all" ๐
Also, note that now rclone has connection strings, it's probably easier to use those instead, which makes the above example:
rclone lsd :s3,access_key_id=XXX,secret_access_key=XXX:
Look how much shorter. She ate and left no crumbs ๐
Precedence
The various different methods of backend configuration are read in this order, and the first one with a value is the one that gets used. First come, first served, no takebacks ๐
- Parameters in connection strings, e.g.
myRemote,skip_links: - Flag values as supplied on the command line, e.g.
--skip-links - Remote specific environment vars, e.g.
RCLONE_CONFIG_MYREMOTE_SKIP_LINKS(see above) - Backend-specific environment vars, e.g.
RCLONE_LOCAL_SKIP_LINKS - Backend generic environment vars, e.g.
RCLONE_SKIP_LINKS - Config file, e.g.
skip_links = true - Default values, e.g.
falseโ these can't be changed ๐
So if both --skip-links is supplied on the command line and an environment variable RCLONE_LOCAL_SKIP_LINKS is set, the command line flag will take preference. She said what she said ๐
The backend configurations set by environment variables can be seen with the -vv flag, e.g.
rclone about myRemote: -vv
For non backend configuration, the order is as follows:
- Flag values as supplied on the command line, e.g.
--stats 5s - Environment vars, e.g.
RCLONE_STATS=5s - Default values, e.g.
1mโ these can't be changed ๐
Other environment variables
RCLONE_CONFIG_PASSset to contain your config file password (see Configuration Encryption section) ๐HTTP_PROXY,HTTPS_PROXYandNO_PROXY(or the lowercase versions thereof).HTTPS_PROXYtakes precedence overHTTP_PROXYfor https requests. Queen behaviour ๐- The environment values may be either a complete URL or a
"host[:port]"for, in which case the"http"scheme is assumed.
USERandLOGNAMEvalues are used as fallbacks for current username. The primary method for looking up username is OS-specific: Windows API on Windows, real user ID in/etc/passwdon Unix systems. In the documentation the current username is simply referred to as$USER๐ธRCLONE_CONFIG_DIRโ rclone sets this variable for use in config files and sub processes to point to the directory holding the config file. She's telling on herself, helpfully ๐
The options set by environment variables can be seen with the -vv and --log-level=DEBUG flags, e.g.
rclone version -vv
๐ป Configuring rclone on a remote / headless machine ๐ป
okay so bestie, listen โ some of the configurations (specifically the ones involving oauth2) need an internet-connected web browser. like, non-negotiable โจ
So if you're trying to set rclone up on a remote or headless machine that has no browser at all (think: a NAS, or a server sitting in a datacenter somewhere), you're gonna need an alternative way to configure it. There are three ways to do it, and we're going through all of them below. ๐ซถ
๐ Configuring using rclone authorize
On the headless machine, run rclone config, but when it asks you "Use web browser to automatically authenticate rclone with remote?" โ you answer N. no browser weirdness, we're doing this the manual way ๐
Use web browser to automatically authenticate rclone with remote?
* Say Y if the machine running rclone has a web browser you can use
* Say N if running rclone on a (remote) machine without web browser access
If not sure try Y. If Y failed, try N.
y) Yes (default)
n) No
y/n> n
Option config_token.
For this to work, you will need rclone available on a machine that has
a web browser available.
For more help and alternate methods see: https://rclone.org/remote_setup/
Execute the following on the machine with the web browser (same rclone
version recommended):
rclone authorize "onedrive"
Then paste the result.
Enter a value.
config_token>
Then, over on your main desktop machine, you run rclone authorize (โจ https://rclone.org/commands/rclone_authorize/ โ that's the link, keep it, it slays).
rclone authorize "onedrive"
NOTICE: Make sure your Redirect URL is set to "http://localhost:53682/" in your custom config.
NOTICE: If your browser doesn't open automatically go to the following link: http://127.0.0.1:53682/auth?state=xxxxxxxxxxxxxxxxxxxxxx
NOTICE: Log in and authorize rclone for access
NOTICE: Waiting for code...
Got code
Paste the following into your remote machine --->
SECRET_TOKEN
<---End paste
Then it's back to the headless machine, and you paste in the code girlie ๐
config_token> SECRET_TOKEN
--------------------
[acd12]
client_id =
client_secret =
token = SECRET_TOKEN
--------------------
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d>
๐ Configuring by copying the config file
Rclone keeps all of its configuration in a single file. Which is honestly iconic of it, because that means you can just copy it over to configure a remote rclone โ although some backends do not support reusing the same configuration, so definitely consult your backend documentation to be sure before you go copy-pasting things around ๐
Start by running rclone config to create the configuration file on your desktop machine.
rclone config
Then locate the file by running rclone config file.
$ rclone config file
Configuration file is stored at:
/home/user/.rclone.conf
Finally, transfer the file to the remote machine (scp, cut paste, ftp, sftp, whatever works for you, no judgement) and place it in the correct location โ use rclone config file on the remote machine to find out where that is. ๐ฆ
๐ Configuring using SSH Tunnel
If you have an SSH client installed on your local machine, you can set up an SSH tunnel to redirect the port 53682 into the headless machine using this command:
ssh -L localhost:53682:localhost:53682 username@remote_server
Then on the headless machine run rclone config and answer Y to the question "Use web browser to automatically authenticate rclone with remote?". yes queen, we're doing the browser thing now, you've got a tunnel ๐ง
Use web browser to automatically authenticate rclone with remote?
* Say Y if the machine running rclone has a web browser you can use
* Say N if running rclone on a (remote) machine without web browser access
If not sure try Y. If Y failed, try N.
y) Yes (default)
n) No
y/n> y
NOTICE: Make sure your Redirect URL is set to "http://localhost:53682/" in your custom config.
NOTICE: If your browser doesn't open automatically go to the following link: http://127.0.0.1:53682/auth?state=xxxxxxxxxxxxxxxxxxxxxx
NOTICE: Log in and authorize rclone for access
NOTICE: Waiting for code...
Finally, copy and paste the presented URL http://127.0.0.1:53682/auth?state=xxxxxxxxxxxxxxxxxxxxxx into the browser on your local machine, complete the auth, and you are DONE. periodt. ๐
๐ธ Filtering, includes and excludes ๐ธ
Filter flags decide which files the rclone sync, move, ls, lsl, md5sum, sha1sum, size, delete, check and similar commands actually apply to. iykyk.
They're specified in terms of path/file name patterns; path/file lists; file age and size; or the presence of a file in a directory. And for bucket based remotes that don't even have a concept of directories โ those apply the filters to object key, age and size in an analogous way. ๐ซถ
โ ๏ธ rclone purge does not obey filters. like, at all. be careful bestie.
To test filters without any risk of damage to your data, apply them to rclone ls, or use the --dry-run and -vv flags. safety first ๐
Rclone filter patterns can only be used in filter command line options โ not in the specification of a remote.
E.g. rclone copy "remote:dir*.jpg" /path/to/dir does not have a filter effect. rclone copy remote:dir /path/to/dir --include "*.jpg" does.
Important ๐จ Avoid mixing any two of--include...,--exclude...or--filter...flags in an rclone command. The results might not be what you expect. Instead use a--filter...flag. (fr fr, just don't do it.)
๐ Patterns for matching path/file names
โจ Pattern syntax
Here is a formal definition of the pattern syntax, examples are below.
Rclone matching rules follow a glob style:
* matches any sequence of non-separator (/) characters
** matches any sequence of characters including / separators
? matches any single non-separator (/) character
[ [ ! ] { character-range } ]
character class (must be non-empty)
{ pattern-list }
pattern alternatives
{{ regexp }}
regular expression to match
c matches character c (c != *, **, ?, \, [, {, })
\c matches reserved character c (c = *, **, ?, \, [, {, }) or character class
character-range:
c matches character c (c != \, -, ])
\c matches reserved character c (c = \, -, ])
lo - hi matches character c for lo <= c <= hi
pattern-list:
pattern { , pattern }
comma-separated (without spaces) patterns
character classes (see Go regular expression reference at https://golang.org/pkg/regexp/syntax/) include:
- Named character classes (e.g.
[\d],[^\d],[\D],[^\D]) - Perl character classes (e.g.
\s,\S,\w,\W) - ASCII character classes (e.g.
[[:alnum:]],[[:alpha:]],[[:punct:]],[[:xdigit:]])
regexp is for advanced users who want to insert a regular expression โ see below for more info:
Any re2 regular expression not containing `}}`
If the filter pattern starts with a / then it only matches at the top level of the directory tree, relative to the root of the remote (not necessarily the root of the drive). If it does not start with / then it is matched starting at the end of the path/file name โ but it only matches a complete path element, so it must match from a / separator or the beginning of the path/file. ๐ฆ
file.jpg - matches "file.jpg"
- matches "directory/file.jpg"
- doesn't match "afile.jpg"
- doesn't match "directory/afile.jpg"
/file.jpg - matches "file.jpg" in the root directory of the remote
- doesn't match "afile.jpg"
- doesn't match "directory/file.jpg"
The top level of the remote might not be the top level of the drive. lowkey important.
E.g. for a Microsoft Windows local directory structure
F:
โโโ bkp
โโโ data
โ โโโ excl
โ โ โโโ 123.jpg
โ โ โโโ 456.jpg
โ โโโ incl
โ โ โโโ document.pdf
To copy the contents of folder data into folder bkp excluding the contents of subfolder excl, the following command treats F:\data and F:\bkp as top level for filtering.
rclone copy F:\data\ F:\bkp\ --exclude=/excl/**
Important ๐ Use/in path/file name patterns and not\even if running on Microsoft Windows. yes even then. especially then.
Simple patterns are case sensitive unless the --ignore-case flag is used.
Without --ignore-case (default):
potato - matches "potato"
- doesn't match "POTATO"
With --ignore-case:
potato - matches "potato"
- matches "POTATO"
๐ Using regular expressions in filter patterns
The syntax of filter patterns is glob style matching (like bash uses) to make things easy for users. However this does not provide absolute control over the matching, so for advanced users rclone also provides a regular expression syntax. ๐
Rclone generally accepts Perl-style regular expressions, the exact syntax is defined in the Go regular expression reference at https://golang.org/pkg/regexp/syntax/. Regular expressions should be enclosed in {{ }}. They will match only the last path segment if the glob doesn't start with / or the whole path name if it does. Note that rclone does not attempt to parse the supplied regular expression, meaning that using any regular expression filter will prevent rclone from using directory filter rules, as it will instead check every path against the supplied regular expression(s).
Here is how the {{regexp}} is transformed into a full regular expression to match the entire path:
{{regexp}} becomes (^|/)(regexp)$
/{{regexp}} becomes ^(regexp)$
Regexp syntax can be mixed with glob syntax, for example
*.{{jpe?g}} to match file.jpg, file.jpeg but not file.png
You can also use regexp flags โ to set case insensitive, for example
*.{{(?i)jpg}} to match file.jpg, file.JPG but not file.png
โ ๏ธ Be careful with wildcards in regular expressions โ you don't want them to match path separators normally. To match any file name starting withstartand ending withendwrite
{{start[^/]*end\.jpg}}
Not
{{start.*end\.jpg}}
Which will match a directory called start with a file called end.jpg in it, as the .* will match / characters. that's the trap bestie, don't fall in it ๐ญ
Note that you can use -vv --dump filters to show the filter patterns in regexp format โ rclone implements the glob patterns by transforming them into regular expressions. โจ
โจ Filter pattern examples โจ
okay bestie, here's the whole vibe of how patterns hit, laid out so it actually makes sense ๐
- Wildcard โ pattern
*.jpgmatches/file.jpgand/dir/file.jpg, but not/file.pngor/dir/file.png - Rooted โ pattern
/*.jpgmatches/file.jpgand/file2.jpg, but not/file.pngor/dir/file.jpg - Alternates โ pattern
*.{jpg,png}matches/file.jpgand/dir/file.png, but not/file.gifor/dir/file.gif - Path Wildcard โ pattern
dir/**matches/dir/anyfileand/subdir/dir/subsubdir/anyfile, but notfile.pngor/subdir/file.png - Any Char โ pattern
*.t?tmatches/file.txtand/dir/file.tzt, but not/file.qxtor/dir/file.png - Range โ pattern
*.[a-z]matches/file.aand/dir/file.b, but not/file.0or/dir/file.1 - Escape โ pattern
*.\?\?\?matches/file.???and/dir/file.???, but not/file.abcor/dir/file.def - Class โ pattern
*.\d\d\dmatches/file.012and/dir/file.345, but not/file.abcor/dir/file.def - Regexp โ pattern
*.{{jpe?g}}matches/file.jpegand/dir/file.jpg, but not/file.pngor/dir/file.jpeeg - Rooted Regexp โ pattern
/{{.*\.jpe?g}}matches/file.jpegand/file.jpg, but not/file.pngor/dir/file.jpg
๐ธ How filter rules are applied to files ๐ธ
ngl this is the part everyone skips and then everyone gets confused, so let's NOT ๐
Rclone path/file name filters are made up of one or more of the following flags:
--include--include-from--exclude--exclude-from--filter--filter-from
There can be more than one instance of individual flags.
Rclone internally uses a combined list of all the include and exclude rules. The order in which rules are processed can influence the result of the filter.
All flags of the same type are processed together in the order above, regardless of what order the different types of flags are included on the command line.
Multiple instances of the same flag are processed from left to right according to their position in the command line.
To mix up the order of processing includes and excludes use --filter... flags.
Within --include-from, --exclude-from and --filter-from flags rules are processed from top to bottom of the referenced file.
If there is an --include or --include-from flag specified, rclone implies a - ** rule which it adds to the bottom of the internal rule list. Specifying a + rule with a --filter... flag does not imply that rule.
Each path/file name passed through rclone is matched against the combined filter list. At first match to a rule the path/file name is included or excluded and no further filter rules are processed for that path/file.
If rclone does not find a match, after testing against all rules (including the implied rule if appropriate), the path/file name is included.
Any path/file included at that stage is processed by the rclone command.
--files-from, --files-from-raw and --files-from0 flags over-ride and cannot be combined with other filter options.
To see the internal combined rule list, in regular expression form, for a command add the --dump filters flag. Running an rclone command with --dump filters and -vv flags lists the internal filter elements and shows how they are applied to each source path/file. There is not currently a means provided to pass regular expression filter options into rclone directly though character class filter rules contain character classes. Go regular expression reference (https://golang.org/pkg/regexp/syntax/)
๐ฆ How filter rules are applied to directories ๐ฆ
Rclone commands are applied to path/file names not directories. The entire contents of a directory can be matched to a filter by the pattern directory/* or recursively by directory/**.
Directory filter rules are defined with a closing / separator.
E.g. /directory/subdirectory/ is an rclone directory filter rule.
Rclone commands can use directory filter rules to determine whether they recurse into subdirectories. This potentially optimises access to a remote by avoiding listing unnecessary directories. Whether optimisation is desirable depends on the specific filter rules and source remote content.
If any regular expression filters are in use, then no directory recursion optimisation is possible, as rclone must check every path against the supplied regular expression(s).
Directory recursion optimisation occurs if either:
- A source remote does not support the rclone ListR primitive.
local,sftp, Microsoft OneDrive and WebDAV do not support ListR. Google Drive and most bucket type storage do. Full list (https://rclone.org/overview/#optional-features) - On other remotes (those that support ListR), if the rclone command is not naturally recursive, and provided it is not run with the
--fast-listflag.ls,lsf -Randsizeare naturally recursive butsync,copyandmoveare not. - Whenever the
--disable ListRflag is applied to an rclone command.
Rclone commands imply directory filter rules from path/file filter rules. To view the directory filter rules rclone has implied for a command specify the --dump filters flag.
E.g. for an include rule
/a/*.jpg
Rclone implies the directory include rule
/a/
Directory filter rules specified in an rclone command can limit the scope of an rclone command but path/file filters still have to be specified.
E.g. rclone ls remote: --include /directory/ will not match any files. Because it is an --include option the --exclude ** rule is implied, and the /directory/ pattern serves only to optimise access to the remote by ignoring everything outside of that directory.
E.g. rclone ls remote: --filter-from filter-list.txt with a file filter-list.txt:
- /dir1/
- /dir2/
+ *.pdf
- **
All files in directories dir1 or dir2 or their subdirectories are completely excluded from the listing. Only files of suffix pdf in the root of remote: or its subdirectories are listed. The - ** rule prevents listing of any path/files not previously matched by the rules above.
Option exclude-if-present creates a directory exclude rule based on the presence of a file in a directory and takes precedence over other rclone directory filter rules.
When using pattern list syntax, if a pattern item contains either / or **, then rclone will not able to imply a directory filter rule from this pattern list.
E.g. for an include rule
{dir1/**,dir2/**}
Rclone will match files below directories dir1 or dir2 only, but will not be able to use this filter to exclude a directory dir3 from being traversed.
Directory recursion optimisation may affect performance, but normally not the result. One exception to this is sync operations with option --create-empty-src-dirs, where any traversed empty directories will be created. With the pattern list example {dir1/**,dir2/**} above, this would create an empty directory dir3 on destination (when it exists on source). Changing the filter to {dir1,dir2}/**, or splitting it into two include rules --include dir1/** --include dir2/**, will match the same files while also filtering directories, with the result that an empty directory dir3 will no longer be created.
๐ --exclude - Exclude files matching pattern ๐
Excludes path/file names from an rclone command based on a single exclude rule.
This flag can be repeated. See above for the order filter flags are processed in.
--exclude should not be used with --include, --include-from, --filter or --filter-from flags.
--exclude has no effect when combined with --files-from, --files-from-raw or --files-from0 flags.
E.g. rclone ls remote: --exclude *.bak excludes all .bak files from listing.
E.g. rclone size remote: --exclude "/dir/**" returns the total size of all files on remote: excluding those in root directory dir and sub directories.
E.g. on Microsoft Windows rclone ls remote: --exclude "*\[{JP,KR,HK}\]*" lists the files in remote: without [JP] or [KR] or [HK] in their name. Quotes prevent the shell from interpreting the \ characters.\ characters escape the [ and ] so an rclone filter treats them literally rather than as a character-range. The { and } define an rclone pattern list. For other operating systems single quotes are required ie rclone ls remote: --exclude '*\[{JP,KR,HK}\]*'
๐ --exclude-from - Read exclude patterns from file ๐
Excludes path/file names from an rclone command based on rules in a named file. The file contains a list of remarks and pattern rules.
For an example exclude-file.txt:
# a sample exclude rule file
*.bak
file2.jpg
rclone ls remote: --exclude-from exclude-file.txt lists the files on remote: except those named file2.jpg or with a suffix .bak. That is equivalent to rclone ls remote: --exclude file2.jpg --exclude "*.bak".
This flag can be repeated. See above for the order filter flags are processed in.
The --exclude-from flag is useful where multiple exclude filter rules are applied to an rclone command.
--exclude-from should not be used with --include, --include-from, --filter or --filter-from flags.
--exclude-from has no effect when combined with --files-from, --files-from-raw or --files-from0 flags.
--exclude-from followed by - reads filter rules from standard input.
๐ --include - Include files matching pattern ๐
Adds a single include rule based on path/file names to an rclone command.
This flag can be repeated. See above for the order filter flags are processed in.
--include has no effect when combined with --files-from, --files-from-raw or --files-from0 flags.
--include implies --exclude ** at the end of an rclone internal filter list. Therefore if you mix --include and --include-from flags with --exclude, --exclude-from, --filter or --filter-from, you must use include rules for all the files you want in the include statement. For more flexibility use the --filter-from flag.
E.g. rclone ls remote: --include "*.{png,jpg}" lists the files on remote: with suffix .png and .jpg. All other files are excluded.
E.g. multiple rclone copy commands can be smooshed into one with --include and a pattern-list, bestie:
rclone copy /vol1/A remote:A
rclone copy /vol1/B remote:B
is literally the same as:
rclone copy /vol1 remote: --include "{A,B}/**"
E.g. rclone ls remote:/wheat --include "??[^[:punct:]]*" lists the files in the remote: directory wheat (and all its subdirectories, slay) whose third character is not punctuation. This one uses an ASCII character class โ the docs live at https://golang.org/pkg/regexp/syntax/. ๐
--include-from - Read include patterns from file
Adds path/file names to an rclone command based on rules in a named file. The file is a lil list of remarks and pattern rules, okay?
For an example include-file.txt:
# a sample include rule file
*.jpg
file2.avi
rclone ls remote: --include-from include-file.txt lists the files on remote: with name file2.avi or suffix .jpg. That's equivalent to rclone ls remote: --include file2.avi --include "*.jpg". โจ
This flag can be repeated (go off). See above for the order filter flags are processed in.
The --include-from flag is useful where multiple include filter rules are applied to an rclone command.
--include-from implies --exclude ** at the end of an rclone internal filter list. So if you mix --include and --include-from flags with --exclude, --exclude-from, --filter or --filter-from, you must use include rules for all the files you want in the include statement. For more flexibility use the --filter-from flag.
--include-from has no effect when combined with --files-from, --files-from-raw or --files-from0 flags. ๐ซถ
--include-from followed by - reads filter rules from standard input.
--filter - Add a file-filtering rule
Specifies path/file names to an rclone command, based on a single include or exclude rule, in + or - format.
This flag can be repeated. See above for the order filter flags are processed in.
--filter + differs from --include. In the case of --include rclone implies an --exclude * rule which it adds to the bottom of the internal rule list. --filter...+ does not imply that rule. ๐
--filter has no effect when combined with --files-from, --files-from-raw or --files-from0 flags.
--filter should not be used with --include, --include-from, --exclude or --exclude-from flags.
E.g. rclone ls remote: --filter "- *.bak" excludes all .bak files from a list of remote:.
--filter-from - Read filtering patterns from a file
Adds path/file names to an rclone command based on rules in a named file. The file contains a list of remarks and pattern rules. Include rules start with + and exclude rules with -. ! clears existing rules. Rules are processed in the order they are defined. ๐
This flag can be repeated. See above for the order filter flags are processed in.
Arrange the order of filter rules with the most restrictive first and work down, bestie.
Lines starting with # or ; are ignored, and can be used to write comments. Inline comments are not supported. Use -vv --dump filters to see how they appear in the final regexp.
E.g. for filter-file.txt:
# a sample filter rule file
- secret*.jpg
+ *.jpg
+ *.png
+ file2.avi
- /dir/tmp/** # WARNING! This text will be treated as part of the path.
- /dir/Trash/**
+ /dir/**
# exclude everything else
- *
rclone ls remote: --filter-from filter-file.txt lists the path/files on remote: including all jpg and png files, excluding any matching secret*.jpg and including file2.avi. It also includes everything in the directory dir at the root of remote, except remote:dir/Trash which it excludes. Everything else is excluded. ๐
E.g. for an alternative filter-file.txt:
- secret*.jpg
+ *.jpg
+ *.png
+ file2.avi
- *
Files file1.jpg, file3.png and file2.avi are listed whilst secret17.jpg and files without the suffix .jpg or .png are excluded.
E.g. for an alternative filter-file.txt:
+ *.jpg
+ *.gif
!
+ 42.doc
- *
Only file 42.doc is listed. Prior rules are cleared by the !. ๐ญ
--files-from - Read list of source-file names
Adds path/files to an rclone command from a list in a named file. Rclone processes the path/file names in the order of the list, and no others.
Other filter flags (--include, --include-from, --exclude, --exclude-from, --filter and --filter-from) are ignored when --files-from, --files-from-raw or --files-from0 is used.
--files-from expects a list of files as its input. Leading or trailing whitespace is stripped from the input lines. Lines starting with # or ; are ignored.
--files-from followed by - reads the list of files from standard input.
Rclone commands with a --files-from flag traverse the remote, treating the names in --files-from as a set of filters.
If the --no-traverse and --files-from flags are used together an rclone command does not traverse the remote. Instead it addresses each path/file named in the file individually. For each path/file name, that requires typically 1 API call. This can be efficient for a short --files-from list and a remote containing many files. ๐ฅ
Rclone commands do not error if any names in the --files-from file are missing from the source remote.
The --files-from flag can be repeated in a single rclone command to read path/file names from more than one file. The files are read from left to right along the command line.
Paths within the --files-from file are interpreted as starting with the root specified in the rclone command. Leading / separators are ignored. See --files-from-raw if you need the input to be processed in a raw manner.
E.g. for a file files-from.txt:
# comment
file1.jpg
subdir/file2.jpg
rclone copy --files-from files-from.txt /home/me/pics remote:pics copies the following, if they exist, and only those files.
/home/me/pics/file1.jpg โ remote:pics/file1.jpg
/home/me/pics/subdir/file2.jpg โ remote:pics/subdir/file2.jpg
E.g. to copy the following files referenced by their absolute paths:
/home/user1/42
/home/user1/dir/ford
/home/user2/prefect
First find a common subdirectory โ in this case /home โ and put the remaining files in files-from.txt with or without leading /, e.g.
user1/42
user1/dir/ford
user2/prefect
Then copy these to a remote:
rclone copy --files-from files-from.txt /home remote:backup
The three files are transferred as follows:
/home/user1/42 โ remote:backup/user1/important
/home/user1/dir/ford โ remote:backup/user1/dir/file
/home/user2/prefect โ remote:backup/user2/stuff
Alternatively if / is chosen as root files-from.txt will be:
/home/user1/42
/home/user1/dir/ford
/home/user2/prefect
The copy command will be:
rclone copy --files-from files-from.txt / remote:backup
Then there will be an extra home directory on the remote:
/home/user1/42 โ remote:backup/home/user1/42
/home/user1/dir/ford โ remote:backup/home/user1/dir/ford
/home/user2/prefect โ remote:backup/home/user2/prefect
--files-from-raw - Read list of source-file names without any processing
This flag is the same as --files-from except that input is read in a raw manner. Lines with leading / trailing whitespace, and lines starting with ; or # are read without any processing. rclone lsf (at https://rclone.org/commands/rclone_lsf/) has a compatible format that can be used to export file lists from remotes for input to --files-from-raw. ๐ฆ
--files-from0 - Read NUL separated list of source-file names
This flag is the same as --files-from-raw except that input is split on NUL (\0) characters instead of newlines. This allows handling filenames that contain embedded newline characters.
It is similar to the -print0 option of find and the -0 option of xargs.
E.g. to copy files listed by find:
find /path -print0 | rclone copy --files-from0 - / remote:path
--ignore-case - make searches case insensitive
By default, rclone filter patterns are case sensitive. The --ignore-case flag makes all of the filters patterns on the command line case insensitive.
E.g. --include "zaphod.txt" does not match a file Zaphod.txt. With --ignore-case a match is made. โจ
Quoting shell metacharacters
Rclone commands with filter patterns containing shell metacharacters may not work as expected in your shell and may require quoting. (No cap.)
E.g. linux, OSX (* metacharacter)
--include \*.jpg--include '*.jpg'--include='*.jpg'
Microsoft Windows expansion is done by the command, not shell, so --include *.jpg does not require quoting.
If the rclone error Command .... needs .... arguments maximum: you provided .... non flag arguments: is encountered, the cause is commonly spaces within the name of a remote or flag value. The fix then is to quote values containing spaces. ๐
Other filters
--min-size - Don't transfer any file smaller than this
Controls the minimum size file within the scope of an rclone command. Default units are KiB but abbreviations B, K, M, G, T or P are valid.
E.g. rclone ls remote: --min-size 50k lists files on remote: of 50 KiB size or larger.
See the size option docs at https://rclone.org/docs/#size-options for more info.
--max-size - Don't transfer any file larger than this
Controls the maximum size file within the scope of an rclone command. Default units are KiB but abbreviations B, K, M, G, T or P are valid.
E.g. rclone ls remote: --max-size 1G lists files on remote: of 1 GiB size or smaller.
See the size option docs at https://rclone.org/docs/#size-options for more info.
--max-age - Don't transfer any file older than this
Controls the maximum age of files within the scope of an rclone command.
--max-age applies only to files and not to directories. ๐
E.g. rclone ls remote: --max-age 2d lists files on remote: of 2 days old or less.
See the time option docs at https://rclone.org/docs/#time-options for valid formats.
--min-age - Don't transfer any file younger than this
Controls the minimum age of files within the scope of an rclone command. (see --max-age for valid formats)
--min-age applies only to files and not to directories.
E.g. rclone ls remote: --min-age 2d lists files on remote: of 2 days old or more.
See the time option docs at https://rclone.org/docs/#time-options for valid formats. ๐ธ
--hash-filter โ deterministically pick a subset of files โจ
Okay so the --hash-filter flag lets you grab a deterministic subset of your files, and it's lowkey iconic for:
- Running big sync operations spread across multiple machines.
- Checking a subset of files for bitrot.
- Any other operations where a sample of files is required.
Syntax ๐
The flag takes two parameters expressed as a fraction:
--hash-filter K/N
N: the total number of partitions (must be a positive integer).K: the specific partition to select (an integer from 0 to N).
For example:
--hash-filter 1/3: selects the first third of the files.--hash-filter 2/3and--hash-filter 3/3: select the second and third partitions, respectively.
Each partition is non-overlapping, ensuring all files are covered without duplication. No cap, the math is mathing. ๐
Random Partition Selection ๐ฒ
Use @ as K to randomly select a partition:
--hash-filter @/M
For example, --hash-filter @/3 will randomly select a number between 0 and 2. This will stay constant across retries. (Very demure, very consistent.) ๐ซถ
How It Works ๐ง
- Rclone takes each file's full path, normalizes it to lowercase, and applies Unicode normalization.
- It then hashes the normalized path into a 64 bit number.
- The hash result is reduced modulo N to assign the file to a partition.
- If the calculated partition does not match K the file is excluded.
- Other filters may apply if the file is not excluded.
Important: Rclone will traverse all directories to apply the filter. ๐
Usage Notes ๐
- Safe to use with
rclone sync; source and destination selections will match. - Do not use with
--delete-excluded, as this could delete unselected files. - Ignored if
--files-from,--files-from-rawor--files-from0is used.
Examples ๐
Dividing files into 4 partitions
Assuming the current directory contains file1.jpg through file9.jpg:
$ rclone lsf --hash-filter 0/4 .
file1.jpg
file5.jpg
$ rclone lsf --hash-filter 1/4 .
file3.jpg
file6.jpg
file9.jpg
$ rclone lsf --hash-filter 2/4 .
file2.jpg
file4.jpg
$ rclone lsf --hash-filter 3/4 .
file7.jpg
file8.jpg
$ rclone lsf --hash-filter 4/4 . # the same as --hash-filter 0/4
file1.jpg
file5.jpg
Syncing the first quarter of files
rclone sync --hash-filter 1/4 source:path destination:path
Checking a random 1% of files for integrity
rclone check --download --hash-filter @/100 source:path destination:path
Other flags โจ
--delete-excluded โ delete files on dest excluded from sync
Important this flag is dangerous to your data โ use with--dry-runand-vfirst. ๐ญ Like fr fr, do the dry run.
In conjunction with rclone sync, --delete-excluded deletes any files on the destination which are excluded from the command.
E.g. the scope of rclone sync --interactive A: B: can be restricted:
rclone --min-size 50k --delete-excluded sync A: B:
All files on B: which are less than 50 KiB are deleted because they are excluded from the rclone sync command.
--dump filters โ dump the filters to the output
Dumps the defined filters to standard output in regular expression format.
Useful for debugging. ๐ต๏ธ
Exclude directory based on a file ๐ซ
The --exclude-if-present flag controls whether a directory is within the scope of an rclone command based on the presence of a named file within it. The flag can be repeated to check for multiple file names, presence of any of them will exclude the directory.
This flag has a priority over other filter flags. ๐
E.g. for the following directory structure:
dir1/file1
dir1/dir2/file2
dir1/dir2/dir3/file3
dir1/dir2/dir3/.ignore
The command rclone ls --exclude-if-present .ignore dir1 does not list dir3, file3 or .ignore.
Metadata filters ๐ท๏ธ
The metadata filters work in a very similar way to the normal file name filters, except they match metadata (https://rclone.org/docs/#metadata) on the object.
The metadata should be specified as key=value patterns. This may be wildcarded using the normal filter patterns or regular expressions.
For example if you wished to list only local files with a mode of 100664 you could do that with:
rclone lsf -M --files-only --metadata-include "mode=100664" .
Or if you wished to show files with an atime, mtime or btime at a given date:
rclone lsf -M --files-only --metadata-include "[abm]time=2022-12-16*" .
Like file filtering, metadata filtering only applies to files not to directories.
The filters can be applied using these flags.
--metadata-include- Include metadatas matching pattern--metadata-include-from- Read metadata include patterns from file (use-to read from stdin)--metadata-exclude- Exclude metadatas matching pattern--metadata-exclude-from- Read metadata exclude patterns from file (use-to read from stdin)--metadata-filter- Add a metadata filtering rule--metadata-filter-from- Read metadata filtering patterns from a file (use-to read from stdin)
Each flag can be repeated. See the section on how filter rules are applied for more details โ these flags work in an identical way to the file name filtering flags, but instead of file name patterns have metadata patterns.
Common pitfalls ๐
The most frequent filter support issues on the rclone forum (https://forum.rclone.org/) are:
- Not using paths relative to the root of the remote
- Not using
/to match from the root of a remote - Not using
**to match the contents of a directory
๐ธ rclone gui ๐ธ
The rclone gui command starts the official Web GUI that comes bundled with rclone. Bestie, it's built in. We're not even joking. โจ
With this command, rclone can serve a web-based GUI (graphical user interface) that is accessible from a normal web browser. ๐ฆ
Run it in a terminal and rclone will initialize and then start the GUI.
rclone gui
This will produce logs like this. The terminal window needs to stay open to continue to run the GUI:
2026/04/14 11:36:04 NOTICE: Serving remote control on http://127.0.0.1:50803/
2026/04/14 11:36:04 NOTICE: Serving GUI on http://127.0.0.1:50802/
2026/04/14 11:36:04 NOTICE: GUI available at http://127.0.0.1:50802/login?pass=XXX&url=http%3A%2F%2F127.0.0.1%3A50803%2F&user=gui
You can also add debugging flags when running the GUI, such as -v, which will show more logging output from the rc server.
Using the GUI ๐
Once the browser opens, you will be presented with the Dashboard, the main screen where you can see the status of your remotes and system.
At the top, starting from the left, you will see a series of tabs you can click on. On the right side you will have the logout button and potentially an "Update available" message if a new rclone version has been released.
Dashboard ๐
See live metrics, learn if your remotes are near capacity, and read the changelog for the current version.
Explorer ๐
Explore and manage both local disks and remotes, download files and directories and start transfers.
Remotes โ๏ธ
Scroll the list of remotes and tap on it to navigate to the explorer. There you can navigate the contents of your remotes, transfer, download, and even upload files.
Mounts ๐พ
Mount remotes as local drives on your computer and check on your existing mounts.
Serves ๐
Get quick info about your active serve instances, and start new ones.
Settings โ๏ธ
Edit your rclone.conf file directly, set logging flags, and performance parameters.
How it works ๐ง
When you run rclone gui this is what happens
- Rclone starts the remote control API ("rc").
- Rclone starts a second server to serve the Web GUI.
- If a port, username or password is not specified, then missing values will be auto-generated.
- Unless
--no-open-browseris passed, a browser window will open. - The URL already contains the username & password, in which case the GUI will use those values and log you in automatically.
Security ๐
It's important to think first about what rclone has access to and what you might be sharing.
A few good measures:
- Don't use
--no-auth(this is for testing only). - Do not expose to the local network (eg with
--api-addr :5572 --addr :8080) unless you trust all devices on your local network. Prefer127.0.0.1orlocalhost(the default). - Use a strong password and non-obvious usernames like "admin" or "rclone" if you are using
--userand--pass. - If you want to host it on a server and access it remotely, make sure you're only exposing the GUI and not the RC API. They listen on different ports.
If you want to access it remotely but want to avoid running a proxy and exposing ports, you can use Cloudflare Tunnels or localhost.run or Tailscale (all free).
Options ๐
--addr stringArrayโ IPaddress:Port for the GUI server (default auto-chosen localhost port)--api-addr stringArrayโ IPaddress:Port for the RC API server (default auto-chosen localhost port)--enable-metricsโ Enable OpenMetrics/Prometheus compatible endpoint at/metrics-h,--helpโ help for gui--no-authโ Don't require auth for the RC API--no-open-browserโ Skip opening the browser automatically--pass stringโ Password for RC authentication--user stringโ User name for RC authentication
History ๐
In v1.74 the GUI was redone and embedded within rclone for ease of use. The GUI bundle ships as a compressed zip embedded in the rclone binary and is served from the zip at runtime.
๐ Remote controlling rclone with its API ๐
If rclone is run with the --rc flag then it starts an HTTP server which can be used to remote control rclone using its API.
You can either use the rc command to access the API or use HTTP directly.
If you just want to run a remote control then see the rcd (https://rclone.org/commands/rclone_rcd/) command.
Security ๐จ
Access to the rc API is equivalent to shell access as the user running rclone. Treat the rc port as you would an interactive login on the host.
Any caller who can reach the API (and pass authentication, if it is enabled) can, among other things:
- Run OS commands as the rclone user.
core/commandre-executes the rclone binary with arbitrary arguments, and several backend options shell out to programs, so even creating a remote withconfig/createcan lead to command execution. - Read and write literally any file the rclone process can reach, by pointing
operations/*orsync/*at a local remote (or going through--rc-files/--rc-serve). Bestie, writing arbitrary files as the rclone user is itself a route to code execution. ๐ - Read back stored credentials. rclone configs are out here routinely holding cloud-provider secrets.
config/dumpand its little friends expose them, so the second your rc gets compromised, it's over for every configured backend. ๐ญ - Change rclone's runtime behaviour with
options/set, manage remotes withconfig/*, and just straight up stop the process withcore/quit.
There is currently no per-endpoint capability or scope system: authentication is all-or-nothing. Granting any access grants all of the above. No in-between, no crumbs. ๐
Consequently:
- Do not bind the rc to a network address you do not control. The default bind is loopback (
localhost:5572); keep it there unless you have a specific reason to change it. - Do not use
--rc-no-authon a non-loopback bind. It disables authentication on the endpoints that access remotes โ go read--rc-no-auth. - Use authentication and TLS (
--rc-user/--rc-passor--rc-htpasswd, plus--rc-cert/--rc-key) whenever the port is reachable by anyone you do not fully trust, and raise--rc-min-tls-version.
โจ Supported parameters โจ
--rcโ the flag that starts the http server listening for remote requests. ๐ซถ--rc-addr=IPโIPaddress:Portor:Portto bind server to. Default is"localhost:5572".--rc-cert=KEYโ SSL PEM key (concatenation of certificate and CA certificate).--rc-client-ca=PATHโ Client certificate authority to verify clients with.--rc-htpasswd=PATHโ htpasswd file โ if not provided, no authentication is done. ๐จ--rc-key=PATHโ TLS PEM private key file.--rc-max-header-bytes=VALUEโ Maximum size of request header (default4096).--rc-min-tls-version=VALUEโ The minimum TLS version that is acceptable. Valid values are"tls1.0","tls1.1","tls1.2"and"tls1.3"(default"tls1.0").--rc-user=VALUEโ User name for authentication.--rc-pass=VALUEโ Password for authentication.--rc-realm=VALUEโ Realm for authentication (default"rclone").--rc-server-read-timeout=DURATIONโ Timeout for server reading data (default1h0m0s).--rc-server-write-timeout=DURATIONโ Timeout for server writing data (default1h0m0s).--rc-serveโ Enable the serving of remote objects via the HTTP interface. This means objects will be accessible athttp://127.0.0.1:5572/by default, so you can browse tohttp://127.0.0.1:5572/orhttp://127.0.0.1:5572/*to see a listing of the remotes. Objects may be requested from remotes using this syntaxhttp://127.0.0.1:5572/[remote:path]/path/to/object.
Unless the rc server has authentication configured (--rc-user/--rc-pass or --rc-htpasswd) or the --rc-no-auth flag is set, only remotes already present in the config file may be served this way. Inline remotes (e.g. [:webdav,url=...:]), connection string parameters and bare local paths are rejected, since instantiating them from an unauthenticated request could run commands or read arbitrary local files. ๐ค
Default Off.
global.*connection string options and the rc โ Remotes instantiated by the rc do not let connection string (https://rclone.org/docs/#connection-strings)global.*options change rclone's process-wide configuration. Remotes created directly on the command line or defined in the config file are unaffected.
A global.* option still takes effect for the individual backend it is set on (exactly like an override.* option), it just does not leak into the global config for the rest of the process. ๐ฆ
--rc-serve-no-modtimeโ Set this flag to skip reading the modification time (can speed things up).
Default Off.
--rc-files /path/to/directoryโ Path to local files to serve on the HTTP server.
If this is set then rclone will serve the files in that directory. It will also open the root in the web browser if specified. This is for implementing browser based GUIs for rclone functions.
If --rc-user or --rc-pass is set then the URL that is opened will have the authorization in the URL in the http://user:pass@localhost/ style.
Default Off.
--rc-enable-metricsโ Enable OpenMetrics/Prometheus compatible endpoint at/metrics. If more control over the metrics is desired (for example running it on a different port or with different auth) then endpoint can be enabled with the--metrics-*flags instead.
Default Off.
--rc-web-guiโ Set this flag to serve the default web gui on the same port as rclone.
Default Off.
--rc-allow-originโ Set the allowedAccess-Control-Allow-Originfor rc requests.
This enables cross-origin (CORS) requests from browsers on the origin given, for example --rc-allow-origin https://app.example.com. Browser CORS preflight OPTIONS requests are answered by rclone without authentication as browsers never send credentials with them. All other requests, including other OPTIONS requests, must be authenticated when authentication is enabled.
The rclone gui command sets this automatically to the origin the GUI is served from if it is not set explicitly.
Setting this to * allows any origin which is a security risk on an authenticated server. ๐จ be so for real about that one
Default is off (no CORS).
--rc-web-fetch-urlโ Set the URL to fetch the rclone-web-gui files from.
Default https://api.github.com/repos/rclone/rclone-webui-react/releases/latest.
--rc-web-gui-updateโ Set this flag to check and update rclone-webui-react from the rc-web-fetch-url.
Default Off.
--rc-web-gui-force-updateโ Set this flag to force update rclone-webui-react from the rc-web-fetch-url.
Default Off.
--rc-web-gui-no-open-browserโ Set this flag to disable opening browser automatically when using web-gui.
Default Off.
--rc-job-expire-duration=DURATIONโ Expire finished async jobs older than DURATION (default60s).--rc-job-expire-interval=DURATIONโ Interval duration to check for expired async jobs (default10s).--rc-no-authโ By default rclone will require authorisation to have been set up on the rc interface in order to use any methods which access any rclone remotes. Egoperations/listis denied as it involved creating a remote as issync/copy.
If this is set then no authorisation will be required on the server to use these methods. The alternative is to use --rc-user and --rc-pass and use these credentials in the request.
Default Off.
--rc-baseurlโ Prefix for URLs.
Default is root.
--rc-templateโ User-specified template.
๐ Accessing the remote control via the rclone rc command ๐
Rclone itself implements the remote control protocol in its rclone rc command. She's self-sufficient like that. ๐
You can use it like this:
$ rclone rc rc/noop param1=one param2=two
{
"param1": "one",
"param2": "two"
}
If the remote is running on a different URL than the default http://localhost:5572/, use the --url option to specify it:
rclone rc --url http://some.remote:1234/ rc/noop
Or, if the remote is listening on a Unix socket, use the --unix-socket option instead:
rclone rc --unix-socket /tmp/rclone.sock rc/noop
Run rclone rc on its own, without any commands, to see the help for the installed remote control commands. Note that this also needs to connect to the remote server. โจ
๐ JSON input ๐
rclone rc also supports a --json flag which can be used to send more complicated input parameters.
$ rclone rc --json '{ "p1": [1,"2",null,4], "p2": { "a":1, "b":2 } }' rc/noop
{
"p1": [
1,
"2",
null,
4
],
"p2": {
"a": 1,
"b": 2
}
}
If the parameter being passed is an object then it can be passed as a JSON string rather than using the --json flag which simplifies the command line. So much less typing bestie, we love efficiency. ๐
rclone rc operations/list fs=/tmp remote=test opt='{"showHash": true}'
Rather than
rclone rc operations/list --json '{"fs": "/tmp", "remote": "test", "opt": {"showHash": true}}'
๐ Special parameters ๐
The rc interface supports some special parameters which apply to all commands. These start with _ to show they are different. It's giving main character energy, obviously. โจ
๐ฅ Running asynchronous jobs with _async = true ๐ฅ
Each rc call is classified as a job and it is assigned its own id. By default jobs are executed immediately as they are created or synchronously.
If _async has a true value when supplied to an rc call then it will return immediately with a jobid and executeId, and the task will be run in the background. The job/status call can be used to get information of the background job. The job can be queried for up to 1 minute after it has finished. โณ
It is recommended that potentially long running jobs, e.g. sync/sync, sync/copy, sync/move, operations/purge are run with the _async flag to avoid any potential problems with the HTTP request and response timing out. Fr fr, just do it. ๐ญ
As an alternative to _async, you can send the HTTP header Prefer: respond-async (RFC 7240). This has the same effect as _async = true but additionally returns HTTP status 202 (Accepted) instead of 200, and includes a Preference-Applied: respond-async response header. The 202 status code makes it easy for clients to distinguish an async response from a completed one without inspecting the body. Iconic behaviour honestly. ๐ซถ
Starting a job with the _async flag:
$ rclone rc --json '{ "p1": [1,"2",null,4], "p2": { "a":1, "b":2 }, "_async": true }' rc/noop
{
"jobid": 2,
"executeId": "d794c33c-463e-4acf-b911-f4b23e4f40b7"
}
The jobid is a unique identifier for the job within this rclone instance. The executeId identifies the rclone process instance and changes after rclone restart. Together, the pair (executeId, jobid) uniquely identifies a job across rclone restarts. ๐
Query the status to see if the job has finished. For more information on the meaning of these return parameters see the job/status call.
$ rclone rc --json '{ "jobid":2 }' job/status
{
"duration": 0.000124163,
"endTime": "2018-10-27T11:38:07.911245881+01:00",
"error": "",
"executeId": "d794c33c-463e-4acf-b911-f4b23e4f40b7",
"finished": true,
"id": 2,
"output": {
"_async": true,
"p1": [
1,
"2",
null,
4
],
"p2": {
"a": 1,
"b": 2
}
},
"startTime": "2018-10-27T11:38:07.911121728+01:00",
"success": true
}
okay so job/list is literally your little โจ job tracker โจ โ it shows you the jobs that are running right now or recently finished, plus their status. bestie behavior fr ๐
$ rclone rc job/list
{
"executeId": "d794c33c-463e-4acf-b911-f4b23e4f40b7",
"finished_ids": [
1
],
"jobids": [
1,
2
],
"running_ids": [
2
]
}
And what are we actually looking at here ๐ let me break it down no cap:
executeIdโ the current rclone instance ID (it's the same for every job, and it changes after a restart, so don't get attached ๐)jobidsโ array of all the job IDs, both running and finishedrunning_idsโ array of the job IDs that are running right nowfinished_idsโ array of the job IDs that are done
Setting config flags with _config ๐
So if you wanna set config โ like the equivalent of the global flags โ but only for the duration of one single rc call? Then you pass in the _config parameter. one call only, babe. what happens in the call stays in the call โจ
Alternative route: you can pass config options flat at the top level of the parameter map. The option names match their CLI flags, but without the -- and with - swapped for _ (so like transfers instead of Transfers inside _config). iykyk
This should be in the same format as the main key returned by options/get.
rclone rc --loopback options/get blocks=main
You can peep more help on these options with this command (check out the options blocks section for the full tea):
rclone rc --loopback options/info blocks=main
So real talk โ say you wanna run a sync with the --checksum parameter. You'd pass this param in your JSON blob ๐
"_config":{"CheckSum": true}
Or pass it flat at the top level:
"checksum": true
If you're using rclone rc you could pass it as:
rclone rc sync/sync ... _config='{"CheckSum": true}'
Or just flat, easy peasy:
rclone rc sync/sync ... checksum=true
heads up bestie โ if you supply both flat parameters and_config, the parameters in the legacy_configblock take precedence. the old one wins, periodt.
Any config parameters you don't set will inherit the global defaults that were set with command line flags or environment variables. so it's giving... defaults that just vibe in the background ๐ฆ
Quick note: it's possible to set some values as strings or integers โ see data types for more info. Here's an example setting the equivalent of --buffer-size in string or integer format:
"_config":{"BufferSize": "42M"}
"_config":{"BufferSize": 44040192}
Or flat:
"buffer_size": "42M"
"buffer_size": 44040192
And if you wanna confirm the _config assignment actually worked properly? Call options/local and it'll show you what the value got set to. we love receipts โ
Setting filter flags with _filter ๐ธ
Same energy, different flag. If you wanna set filters for the duration of an rc call only, you pass in the _filter parameter.
Or โ you guessed it โ pass filter options flat at the top level of the parameter map. Option names = their CLI flags without -- and with - replaced by _ (so exclude instead of Exclude inside _filter). ๐ซถ
This should be in the same format as the filter key returned by options/get.
rclone rc --loopback options/get blocks=filter
More help on these options? Yes bestie, this command got you (again, see the options blocks section for more):
rclone rc --loopback options/info blocks=filter
Say you wanted to run a sync with these flags:
--max-size 1M --max-age 42s --include "a" --include "b"
You'd pass this parameter in your JSON blob ๐
"_filter":{"MaxSize":"1M", "IncludeRule":["a","b"], "MaxAge":"42s"}
Or pass them flat at the top level:
"max_size":"1M", "include":["a","b"], "max_age":"42s"
If using rclone rc this could be passed as:
rclone rc ... _filter='{"MaxSize":"1M", "IncludeRule":["a","b"], "MaxAge":"42s"}'
Or simply flat:
rclone rc ... max_size=1M include="a,b" max_age=42s
same rule as before, bestie โ if you supply both flat parameters and_filter, the parameters in the legacy_filterblock take precedence. legacy stays winning ๐
Any filter parameters you don't set will inherit the global defaults set with command line flags or environment variables.
Note that it's possible to set some values as strings or integers โ see data types for more info. Example setting the equivalent of --buffer-size in string or integer format:
"_filter":{"MinSize": "42M"}
"_filter":{"MinSize": 44040192}
Or flat:
"min_size": "42M"
And if you wanna check the _filter assignment worked properly, call options/local and it'll show you what the value got set to. โจ iconic โจ
Assigning operations to groups with _group = value ๐
Every single rc call has its own stats group for tracking its metrics โ main character energy, obviously ๐
By default, grouping is done by the composite group name from the prefix job/ and the id of the job, like so: job/1.
But if _group has a value, then the stats for that request get grouped under that value instead. This lets the caller group stats under their own name. custom labels? we love to see it ๐
Stats for a specific group can be accessed by passing group to core/stats:
$ rclone rc --json '{ "group": "job/1" }' core/stats
{
"speed": 12345
...
}
Data types ๐ฆ
When the API returns types, these will mostly be straight-forward integer, string, or boolean types. nice and chill, no drama.
However, some of the types returned by the options/get call and taken by the options/set calls โ as well as the vfsOpt, mountOpt and the _config parameters โ are a little spicier ๐ถ๏ธ
- Duration โ these come back as an integer duration in nanoseconds. They may be set as an integer, or they may be set with a time string, e.g.
"5s". See the options section (<https://rclone.org/docs/#options>) for more info. - Size โ these come back as an integer number of bytes. They may be set as an integer, or they may be set with a size suffix string, e.g.
"10M". See the options section (<https://rclone.org/docs/#options>) for more info. - Enumerated type (such as
CutoffMode,DumpFlags,LogLevel,VfsCacheMode) โ these come back as an integer and may be set as an integer, but more conveniently they can be set as a string, e.g."HARD"forCutoffModeorDEBUGforLogLevel. - BandwidthSpec โ this will be set and returned as a string, e.g.
"1M".
Option blocks ๐ง
The calls options/info (for the main config) and config/providers (for the backend config) may be used to get information on the rclone configuration options. This can be used to build user interfaces for displaying and setting any rclone option. UI girlies, this one's for you ๐
These consist of arrays of Option blocks. These have the following format. Each block describes a single option.
โฆand bestie, that's where we're picking up next โ more blocks incoming, don't go anywhere ๐
Nameโ typestring, optional?Nโ name of the option insnake_caseFieldNameโ typestring, optional?Nโ name of the field used in the rc โ if blank useName. May contain"."for nested fields.Helpโ typestring, optional?Nโ help, started with a single sentence on a single lineGroupsโ typestring, optional?Yโ groups this option belongs to โ comma separated string for options classificationProviderโ typestring, optional?Yโ set to filter on providerDefaultโ typeany, optional?Nโ default value, if set (and not to nil or"") thenRequireddoes nothingValueโ typeany, optional?Nโ value to be set by flagsExamplesโ typeExamples, optional?Yโ predefined values that can be selected from list (multiple-choice option)ShortOptโ typestring, optional?Yโ the short command line option for thisHideโ typeVisibility, optional?Nโ if non zero, this option is hidden from the configurator or the command lineRequiredโ typebool, optional?Nโ this option is required, meaning value cannot be empty unless there is a defaultIsPasswordโ typebool, optional?Nโ set if the option is a passwordNoPrefixโ typebool, optional?Nโ set if the option for this should not use the backend prefixAdvancedโ typebool, optional?Nโ set if this is an advanced config optionExclusiveโ typebool, optional?Nโ set if the answer can only be one of the examples (empty string allowed unlessRequiredorDefaultis set)Sensitiveโ typebool, optional?Nโ set if this option should be redacted when usingrclone config redacted
An example of this might be the --log-level flag. And bestie, note this: the Name of the option becomes the command line flag with _ replaced with -. That's the whole trick. โจ
{
"Advanced": false,
"Default": 5,
"DefaultStr": "NOTICE",
"Examples": [
{
"Help": "",
"Value": "EMERGENCY"
},
{
"Help": "",
"Value": "ALERT"
},
...
],
"Exclusive": true,
"FieldName": "LogLevel",
"Groups": "Logging",
"Help": "Log level DEBUG|INFO|NOTICE|ERROR",
"Hide": 0,
"IsPassword": false,
"Name": "log_level",
"NoPrefix": true,
"Required": true,
"Sensitive": false,
"Type": "LogLevel",
"Value": null,
"ValueStr": "NOTICE"
},
Also keep in your head: the Help may be multiple lines separated by \n. The first line will always be a short sentence, and that is the sentence shown when you run rclone help flags. ๐
๐ธ Specifying remotes to work on ๐ธ
Remotes get specified with the fs=, srcFs=, dstFs= parameters, depending on which command you're using. Different command, different param name, that's just how it is bestie.
The parameters can be a string exactly like the rest of rclone, e.g. s3:bucket/path or :sftp:/my/dir. They can also be specified as JSON blobs. ๐ซถ
If you specify a JSON blob, it should be an object mapping strings to strings. Those values will be used to configure the remote. There are 3 special values which may be set:
typeโ set to type to specify a remote called:type:_nameโ set to name to specify a remote calledname:_rootโ sets the root of the remote โ may be empty
One of _name or type should normally be set. If you want the local backend, then type should be set to local. If _root isn't specified then it defaults to the root of the remote.
For example, this JSON is equivalent to remote:/tmp:
{
"_name": "remote",
"_root": "/tmp"
}
And this is equivalent to :sftp,host='example.com':/tmp:
{
"type": "sftp",
"host": "example.com",
"_root": "/tmp"
}
And this is equivalent to /tmp/dir:
{
"type": "local",
"_root": "/tmp/dir"
}
๐ Supported commands ๐
backend/command: Runs a backend command.
This takes the following parameters:
commandโ a string with the command namefsโ a remote name string e.g."drive:"argโ a list of arguments for the backend commandoptโ a map of string to string of options
Returns:
resultโ result from the backend command
Example:
rclone rc backend/command command=noop fs=. -o echo=yes -o blue -a path1 -a path2
Returns
{
"result": {
"arg": [
"path1",
"path2"
],
"name": "noop",
"opt": {
"blue": "",
"echo": "yes"
}
}
}
Note that this is the direct equivalent of using this "backend" command:
rclone backend noop . -o echo=yes -o blue path1 path2
Note that arguments must be preceded by the "-a" flag. Don't forget the -a, she's load-bearing. ๐ค
See the backend command (https://rclone.org/commands/rclone_backend/) for more information.
cache/expire: Purge a remote from cache
Purge a remote from the cache backend. Supports either a directory or a file.
Params:
remote= path to remote (required)withData=true/falseto delete cached data (chunks) as well (optional)
Eg:
rclone rc cache/expire remote=path/to/sub/folder/
rclone rc cache/expire remote=/ withData=true
cache/fetch: Fetch file chunks
Ensure the specified file chunks are cached on disk. ๐พ
The chunks= parameter specifies the file chunks to check. It takes a comma separated list of array slice indices. The slice indices are similar to Python slices: start[:end]
start is the 0 based chunk number from the beginning of the file to fetch inclusive. end is 0 based chunk number from the beginning of the file to fetch exclusive. Both values can be negative, in which case they count from the back of the file. The value "-5:" represents the last 5 chunks of a file.
Some valid examples are:
":5,-5:"โ the first and last five chunks"0,-2"โ the first and the second last chunk"0:10"โ the first ten chunks
Any parameter with a key that starts with "file" can be used to specify files to fetch, e.g.
rclone rc cache/fetch chunks=0 file=hello file2=home/goodbye
File names will automatically be encrypted when the a crypt remote is used on top of the cache. ๐
cache/stats: Get cache stats
Show statistics for the cache remote. ๐
Authentication is not required for this call. No login needed, she's open.
config/create: create the config for a remote.
This takes the following parameters:
nameโ name of remoteparametersโ a map of{ "key": "value" }pairstypeโ type of the new remoteoptโ a dictionary of options to control the configurationobscureโ declare passwords are plain and need obscuringnoObscureโ declare passwords are already obscured and don't need obscuringnoOutputโ don't print anything to stdoutnonInteractiveโ don't interact with a user, return questionscontinueโ continue the config process with an answerallโ ask all the config questions not just the post config onesstateโ state to restart with โ used withcontinueresultโ result to restart with โ used withcontinue
See the config create command (https://rclone.org/commands/rclone_config_create/) for more information on the above.
config/delete: Delete a remote in the config file.
Parameters:
nameโ name of remote to delete
See the config delete command (https://rclone.org/commands/rclone_config_delete/) for more information on the above.
config/dump: Dumps the config file.
Returns a JSON object: key: value
Where keys are remote names and values are the config parameters. ๐๏ธ
See the config dump command (https://rclone.org/commands/rclone_config_dump/) for more information on the above.
config/get: Get a remote in the config file.
Parameters:
nameโ name of remote to get
See the config dump command (https://rclone.org/commands/rclone_config_dump/) for more information on the above.
config/listremotes: Lists the remotes in the config file and defined in environment variables.
Returns
remotesโ array of remote names
See the listremotes command (https://rclone.org/commands/rclone_listremotes/) for more information on the above. and that's the list bestie, keep going โจ
config/oauthstatus</p>: Get the status of the OAuth authentication server ๐ฆ
Okay so this one just peeks at the OAuth authentication server and tells you what it's up to. It returns the current status, periodt.
It gives you back a JSON object:
statusโ either"running"or"stopped", no in-between bestieauthUrlโ the URL for the authorization, and it's only there if status is"running"
Eg ๐
{
"status": "running",
"authUrl": "http://127.0.0.1:53682/auth?state=..."
}
config/oauthstop</p>: Stop any running OAuth authentication server ๐
Stops the OAuth authentication server if one is running. That's it, that's the vibe.
This is your little escape hatch: you can use it to recover from an interrupted OAuth flow without restarting rclone. Iconic.
Heads up bestie: if no OAuth authentication is in progress, an error is returned. So don't come for it for no reason ๐ญ
config/password</p>: password the config for a remote ๐
This takes the following parameters:
nameโ name of remoteparametersโ a map of{ "key": "value" }pairs
See the config password (https://rclone.org/commands/rclone_config_password/) command for more information on the above.
config/paths</p>: Reads the config file path and other important paths ๐บ๏ธ
Returns a JSON object with the following keys:
config: path to config filecache: path to root of cache directorytemp: path to root of temporary directory
Eg
{
"cache": "/home/USER/.cache/rclone",
"config": "/home/USER/.rclone.conf",
"temp": "/tmp"
}
See the config paths (https://rclone.org/commands/rclone_config_paths/) command for more information on the above.
config/providers</p>: Shows how providers are configured in the config file ๐
Returns a JSON object:
providersโ array of objects
See the config providers (https://rclone.org/commands/rclone_config_providers/) command for more information on the above.
Lowkey important detail: the Options blocks are in the same format as returned by "options/info". They are described in the option blocks section. iykyk ๐ธ
config/setpath</p>: Set the path of the config file ๐
Parameters:
pathโ path to the config file to use
config/unlock</p>: Unlock the config file ๐
Unlocks the config file if it is locked. Fr fr, sometimes it just be locked.
Parameters:
'configPassword'โ password to unlock the config file
Pro tip vibes: a good idea is to disable AskPassword before making this call โจ
config/unset</p>: Unset keys in a remote in the config file ๐งน
Parameters:
nameโ name of remotekeysโ a list of key names to remove
Returns:
removedโ a list of the keys that were actually removed
See the config unset (https://rclone.org/commands/rclone_config_unset/) command for more information on the above.
config/update</p>: update the config for a remote ๐
This takes the following parameters:
nameโ name of remoteparametersโ a map of{ "key": "value" }pairsoptโ a dictionary of options to control the configurationobscureโ declare passwords are plain and need obscuringnoObscureโ declare passwords are already obscured and don't need obscuringnoOutputโ don't print anything to stdoutnonInteractiveโ don't interact with a user, return questionscontinueโ continue the config process with an answerallโ ask all the config questions not just the post config onesstateโ state to restart with - used withcontinueresultโ result to restart with - used withcontinue
See the config update (https://rclone.org/commands/rclone_config_update/) command for more information on the above.
core/bwlimit</p>: Set the bandwidth limit ๐ฆ
This sets the bandwidth limit to the string passed in. It should be a single bandwidth limit entry or a pair of upload:download bandwidth. The way it justโฆ does that. Obsessed.
Eg
rclone rc core/bwlimit rate=off
{
"bytesPerSecond": -1,
"bytesPerSecondTx": -1,
"bytesPerSecondRx": -1,
"rate": "off"
}
rclone rc core/bwlimit rate=1M
{
"bytesPerSecond": 1048576,
"bytesPerSecondTx": 1048576,
"bytesPerSecondRx": 1048576,
"rate": "1M"
}
rclone rc core/bwlimit rate=1M:100k
{
"bytesPerSecond": 1048576,
"bytesPerSecondTx": 1048576,
"bytesPerSecondRx": 131072,
"rate": "1M"
}
If the rate parameter is not supplied then the bandwidth is queried ๐
rclone rc core/bwlimit
{
"bytesPerSecond": 1048576,
"bytesPerSecondTx": 1048576,
"bytesPerSecondRx": 1048576,
"rate": "1M"
}
The format of the parameter is exactly the same as passed to --bwlimit except only one bandwidth may be specified. One. Singular. Don't try it.
In either case "rate" is returned as a human-readable string, and "bytesPerSecond" is returned as a number. Both, always, no cap ๐
core/command</p>: Run a rclone terminal command over rc ๐ฅ๏ธ
This takes the following parameters:
commandโ a string with the command name.argโ a list of arguments for the backend command.optโ a map of string to string of options.returnTypeโ one of ("COMBINED_OUTPUT","STREAM","STREAM_ONLY_STDOUT","STREAM_ONLY_STDERR").- Defaults to
"COMBINED_OUTPUT"if not set. - The
STREAMreturnTypes will write the output to the body of the HTTP message. - The
COMBINED_OUTPUTwill write the output to the"result"parameter.
- Defaults to
Returns:
resultโ result from the backend command.- Only set when using returnType
"COMBINED_OUTPUT".
- Only set when using returnType
errorโ set if rclone exits with an error code.returnTypeโ one of ("COMBINED_OUTPUT","STREAM","STREAM_ONLY_STDOUT","STREAM_ONLY_STDERR").
Example:
rclone rc core/command command=ls -a mydrive:/ -o max-depth=1
rclone rc core/command -a ls -a mydrive:/ -o max-depth=1
Returns:
{
"error": false,
"result": "<Raw command line output>"
}
OR
{
"error": true,
"result": "<Raw command line output>"
}
core/disks</p>: List the local disks ๐พ
This does not take any parameters. Nothing. Nada. Zilch.
This call is for rclone GUI programs to enumerate local disks and important directories for doing transfers to and from. The list returned will include the root directory and the user's home directory and any mounted disks. The returned items should be usable directly as remotes. Slay, honestly ๐
Returns:
disks- This is an array of strings of local disk names
core/du</p>: Returns disk usage of a locally attached disk ๐
This returns the disk usage for the local directory passed in as dir.
If the directory is not passed in, it defaults to the directory pointed to by --cache-dir.
dirโ string (optional)
Returns:
{
"dir": "/",
"info": {
"Available": 361769115648,
"Free": 361785892864,
"Total": 982141468672
}
}
Cute little detail: authentication is not required for this call. Walk right in bestie ๐
core/gc</p>: Runs a garbage collection ๐๏ธ
This tells the go runtime to do a garbage collection run. It isn't necessary to call this normally, but it can be useful for debugging memory problems. Like, you probably don't need it, but if memory is acting up it's giving โจdiagnosticโจ
core/group-list</p>: Returns list of stats ๐
This returns list of stats groups currently in memory.
Returns the following values:
{
"groups": an array of group names:
[
"group1",
"group2",
...
]
}
Authentication is not required for this call either ๐
core/memstats</p>: Returns the memory statistics ๐ง
This returns the memory statistics of the running program. What the values mean are explained in the go docs: https://golang.org/pkg/runtime/#MemStats
The most interesting values for most people are:
HeapAllocโ this is the amount of memory rclone is actually usingHeapSysโ this is the amount of memory rclone has obtained from the OSSysโ this is the total amount of memory requested from the OS- It is virtual memory so may include unused memory
core/obscure</p>: Obscures a string passed in ๐
Pass a clear string and rclone will obscure it for the config file:
clearโ string
Returns:
obscuredโ string
core/pid</p>: Return PID of current process ๐ข
This returns PID of current process. Useful for stopping rclone process. Like, know your enemy's number, y'know? ๐
core/quit</p>: Terminates the app ๐
(Optional) Pass an exit code to be used for terminating the app:
exitCodeโ int
core/stats</p>: Returns stats about current transfers ๐
This returns all available stats:
rclone rc core/stats
If group is not provided then summed up stats for all groups will be returned.
Parameters
groupโ name of the stats group (string, optional)shortโ if true will not return the transferring and checking arrays (boolean, optional)
Returns the following values:
{
"bytes": total transferred bytes since the start of the group,
"checks": number of files checked,
"deletedDirs": number of directories deleted,
"deletes" : number of files deleted,
"elapsedTime": time in floating point seconds since rclone was started,
"errors": number of errors,
"eta": estimated time in seconds until the group completes,
"fatalError": boolean whether there has been at least one fatal error,
"lastError": last error string,
"renames" : number of files renamed,
"listed" : number of directory entries listed,
"retryError": boolean showing whether there has been at least one non-NoRetryError,
"serverSideCopies": number of server side copies done,
"serverSideCopyBytes": number bytes server side copied,
"serverSideMoves": number of server side moves done,
"serverSideMoveBytes": number bytes server side moved,
"speed": average speed in bytes per second since start of the group,
"totalBytes": total number of bytes in the group,
"totalChecks": total number of checks in the group,
"totalTransfers": total number of transfers in the group,
"transferTime" : total time spent on running jobs,
"transfers": number of transferred files,
"transferring": an array of currently active file transfers:
[
{
"bytes": total transferred bytes for this file,
"eta": estimated time in seconds until file transfer completion
"name": name of the file,
"percentage": progress of the file transfer in percent,
"speed": average speed over the whole transfer in bytes per second,
"speedAvg": current speed in bytes per second as an exponentially weighted moving average,
"size": size of the file in bytes
}
],
"checking": an array of names of currently active file checks
[]
}
okay so tiny lil truth bomb: the values for "transferring", "checking" and "lastError" are only assigned if data is actually available. like, no vibes to report = no key, bestie. ๐
And the value for "eta" is null if an eta genuinely cannot be determined. can't rush the mystery, yk?
โจ Authentication is not required for this call. โจ
๐๏ธ core/stats-delete: Delete stats group.
This deletes entire stats group. whole thing. gone. bye bestie ๐
Parameters
groupโ name of the stats group (string)
โป๏ธ core/stats-reset: Reset stats.
This clears counters, errors and finished transfers for all stats โ or for one specific stats group if group is provided. fresh start energy โจ
Parameters
groupโ name of the stats group (string)
๐ค core/transferred: Returns stats about completed transfers.
This returns stats about completed transfers:
rclone rc core/transferred
If group is not provided then completed transfers for all groups will be returned. ๐
โ ๏ธ Note only the last 100 completed transfers are returned. after that it's giving amnesia, bestie ๐ซถ
Parameters
groupโ name of the stats group (string)
Returns the following values:
{
"transferred": an array of completed transfers (including failed ones):
[
{
"name": name of the file,
"size": size of the file in bytes,
"bytes": total transferred bytes for this file,
"checked": if the transfer is only checked (skipped, deleted),
"what": the purpose of the transfer (transferring, deleting, checking, importing, hashing, merging, listing, moving, renaming),
"timestamp": integer representing millisecond unix epoch,
"error": string description of the error (empty if successful),
"jobid": id of the job that this transfer belongs to
}
]
}
โจ Authentication is not required for this call. โจ
๐ท๏ธ core/version: Shows the current version of rclone, Go and the OS.
This shows the current versions of rclone, Go and the OS: ๐
versionโ rclone version, e.g."v1.71.2"decomposedโ version number as [major, minor, patch]isGitโ boolean โtrueif this was compiled from the git versionisBetaโ boolean โtrueif this is a beta versionosโ OS in use as according to GoGOOS(e.g."linux")osKernelโ OS Kernel version (e.g."6.8.0-86-generic (x86_64)")osVersionโ OS Version (e.g."ubuntu 24.04 (64 bit)")osArchโ cpu architecture in use (e.g."arm64 (ARMv8 compatible)")archโ cpu architecture in use according to GoGOARCH(e.g."arm64")goVersionโ version of Go runtime in use (e.g."go1.25.0")linkingโ type of rclone executable (static or dynamic)goTagsโ space separated build tags or"none"
โจ Authentication is not required for this call. โจ
๐ง debug/set-block-profile-rate: Set runtime.SetBlockProfileRate for blocking profiling.
SetBlockProfileRate controls the fraction of goroutine blocking events that are reported in the blocking profile. The profiler aims to sample an average of one blocking event per rate nanoseconds spent blocked. โฑ๏ธ
To include every blocking event in the profile, pass rate = 1. To turn off profiling entirely, pass rate <= 0. ๐
After calling this you can use this to see the blocking profile:
go tool pprof http://localhost:5572/debug/pprof/block
Parameters:
rateโint
๐๏ธ debug/set-gc-percent: Call runtime/debug.SetGCPercent for setting the garbage collection target percentage.
SetGCPercent sets the garbage collection target percentage: a collection is triggered when the ratio of freshly allocated data to live data remaining after the previous collection reaches this percentage. SetGCPercent returns the previous setting. The initial setting is the value of the GOGC environment variable at startup, or 100 if the variable is not set. ๐ฏ
๐ธ This setting may be effectively reduced in order to maintain a memory limit. A negative percentage effectively disables garbage collection, unless the memory limit is reached.
See https://pkg.go.dev/runtime/debug#SetMemoryLimit for more details.
Parameters:
gc-percentโint
๐ debug/set-mutex-profile-fraction: Set runtime.SetMutexProfileFraction for mutex profiling.
SetMutexProfileFraction controls the fraction of mutex contention events that are reported in the mutex profile. On average 1/rate events are reported. The previous rate is returned. ๐ซถ
To turn off profiling entirely, pass rate 0. To just read the current rate, pass rate < 0. (For n>1 the details of sampling may change.) ๐
Once this is set you can look use this to profile the mutex contention:
go tool pprof http://localhost:5572/debug/pprof/mutex
Parameters:
rateโint
Results:
previousRateโint
๐ง debug/set-soft-memory-limit: Call runtime/debug.SetMemoryLimit for setting a soft memory limit for the runtime.
SetMemoryLimit provides the runtime with a soft memory limit. ๐
The runtime undertakes several processes to try to respect this memory limit, including adjustments to the frequency of garbage collections and returning memory to the underlying system more aggressively. This limit will be respected even if GOGC=off (or, if SetGCPercent(-1) is executed). ๐ช
The input limit is provided as bytes, and includes all memory mapped, managed, and not released by the Go runtime. Notably, it does not account for space used by the Go binary and memory external to Go, such as memory managed by the underlying system on behalf of the process, or memory managed by non-Go code inside the same process. Examples of excluded memory sources include: OS kernel memory held on behalf of the process, memory allocated by C code, and memory mapped by syscall.Mmap (because it is not managed by the Go runtime). ๐ง
๐ A zero limit or a limit that's lower than the amount of memory used by the Go runtime may cause the garbage collector to run nearly continuously. However, the application may still make progress.
The memory limit is always respected by the Go runtime, so to effectively disable this behavior, set the limit very high. math.MaxInt64 is the canonical value for disabling the limit, but values much greater than the available memory on the underlying system work just as well. ๐ฅ
See https://go.dev/doc/gc-guide for a detailed guide explaining the soft memory limit in more detail, as well as a variety of common use-cases and scenarios.
SetMemoryLimit returns the previously set memory limit. A negative input does not adjust the limit, and allows for retrieval of the currently set memory limit. โจ
Parameters:
mem-limitโint
๐งน fscache/clear: Clear the Fs cache.
This clears the fs cache. This is where remotes created from backends are cached for a short while to make repeated rc calls more efficient. โก
๐ If you change the parameters of a backend then you may want to call this to clear an existing remote out of the cache before re-creating it.
๐ข fscache/entries: Returns the number of entries in the fs cache.
This returns the number of entries in the fs cache. ๐ฆ
Returns โ entries โ number of items in the cache
๐ฆ job/batch: Run a batch of rclone rc commands concurrently.
This takes the following parameters:
concurrencyโintโ do this many commands concurrently. Defaults to--transfersif not set.inputsโ an list of inputs to the commands with an extra_pathparameter
{
"_path": "rc/path",
"param1": "parameter for the path as documented",
"param2": "parameter for the path as documented, etc",
}
The inputs may use _async, _group, _config and _filter as normal when using the rc. ๐
Returns:
resultsโ a list of results from the commands with one entry for each ininputs.
For example:
rclone rc job/batch --json '{
"inputs": [
{
"_path": "rc/noop",
"parameter": "OK"
},
{
"_path": "rc/error",
"parameter": "BAD"
}
]
}
'
Gives the result:
{
"results": [
{
"parameter": "OK"
},
{
"error": "arbitrary error on input map[parameter:BAD]",
"input": {
"parameter": "BAD"
},
"path": "rc/error",
"status": 500
}
]
}
๐ job/list โ the ID roll-call of everything currently running
Parameters: literally none, bestie. It takes nothing.
Results:
executeIdโ string id of the rclone that's executing this (heads up: it changes after a restart ๐)jobidsโ array of integer job ids (and yes, they start back at 1 on every restart ๐)runningIdsโ array of integer job ids that are runningfinishedIdsโ array of integer job ids that are finished
๐ job/status โ read the status of a job ID
Parameters:
jobidโ id of the job (integer).
Results:
finishedโ booleandurationโ time in seconds that the job ran forendTimeโ time the job finished (e.g."2018-10-26T18:50:20.528746884+01:00")errorโ error from the job or empty string for no errorfinishedโ boolean whether the job has finished or notidโ as passed in aboveexecuteIdโ rclone instance ID (changes after restart); combined withiduniquely identifies a jobstartTimeโ time the job started (e.g."2018-10-26T18:50:20.528336039+01:00")successโ boolean - true for success false otherwiseoutputโ output of the job as would have been returned if called synchronouslyprogressโ output of the progress related to the underlying job
ngl the finished key shows up twice in that list up there and I'm just telling you exactly what the manpage says ๐
๐ job/stop โ stop the running job
Parameters:
jobidโ id of the job (integer).
๐๐ job/stopgroup โ stop all running jobs in a group
Parameters:
groupโ name of the group (string).
๐บ๏ธ mount/listmounts โ show me every current mount point
This shows currently mounted points, which can be used for performing an unmount. Iconic behaviour fr fr.
This takes no parameters and returns
mountPoints: list of current mount points
Eg
rclone rc mount/listmounts
๐ mount/mount โ create a new mount point
rclone allows Linux, FreeBSD, macOS and Windows to mount any of Rclone's cloud storage systems as a file system with FUSE. Obsessed, honestly.
If no mountType is provided, the priority is given as follows: 1. mount 2. cmount 3. mount2
This takes the following parameters:
fsโ a remote path to be mounted (required)mountPoint: valid path on the local machine (required)mountType: one of the values (mount,cmount,mount2) specifies the mount implementation to usemountOpt: a JSON object with Mount options in.vfsOpt: a JSON object with VFS options in.
Alternatively, you can pass VFS and Mount options flat at the top level of the parameter map. The option names are the same as their CLI flags without -- and with - replaced by _ (e.g. vfs_cache_mode instead of CacheMode inside vfsOpt, and volname instead of VolName inside mountOpt).
If both flat parameters and nested vfsOpt/mountOpt blocks are supplied, the parameters in the nested blocks will take precedence. Nested wins, always. Periodt. ๐
On Windows mountPoint may be set to * to assign the next available drive letter automatically, or a network share UNC path (e.g. "\\server") to mount as a network drive. In these cases the actual drive letter is chosen at mount time.
This returns the following values:
mountPoint: the actual mount point that was used (this may differ from the input, e.g. on Windows when*is passed the allocated drive letter is returned)
Example:
rclone rc mount/mount fs=mydrive: mountPoint=/home/<user>/mountPoint
rclone rc mount/mount fs=mydrive: mountPoint=/home/<user>/mountPoint mountType=mount
rclone rc mount/mount fs=TestDrive: mountPoint=/mnt/tmp vfsOpt='{"CacheMode": 2}' mountOpt='{"AllowOther": true}'
rclone rc mount/mount fs=TestDrive: mountPoint=/mnt/tmp vfs_cache_mode=writes volname=MyTestVolume
rclone rc mount/mount fs=mydrive: mountPoint=* mountType=cmount
The vfsOpt are as described in options/get and can be seen in the "vfs" section when running and the mountOpt can be seen in the "mount" section:
rclone rc options/get
๐ง mount/types โ show all possible mount types
This shows all possible mount types and returns them as a list.
This takes no parameters and returns
mountTypes: list of mount types
The mount types are strings like "mount", "mount2", "cmount" and can be passed to mount/mount as the mountType parameter.
Eg
rclone rc mount/types
๐ฆ mount/unmount โ unmount selected active mount
rclone allows Linux, FreeBSD, macOS and Windows to mount any of Rclone's cloud storage systems as a file system with FUSE.
This takes the following parameters:
mountPoint: valid path on the local machine where the mount was created (required)
Example:
rclone rc mount/unmount mountPoint=/home/<user>/mountPoint
๐ธ mount/unmountall โ unmount all active mounts
rclone allows Linux, FreeBSD, macOS and Windows to mount any of Rclone's cloud storage systems as a file system with FUSE.
This takes no parameters and returns error if unmount does not succeed. ๐ญ
Eg
rclone rc mount/unmountall
๐ operations/about โ return the space used on the remote
This takes the following parameters:
fsโ a remote name string e.g."drive:"
The result is as returned from rclone about --json
See the about (https://rclone.org/commands/rclone_about/) command for more information on the above.
โ
operations/check โ check the source and destination are the same
Checks the files in the source and destination match. It compares sizes and hashes and logs a report of files that don't match. It doesn't alter the source or destination. Pure vibes, zero side effects ๐ซถ
This takes the following parameters:
srcFsโ a remote name string e.g."drive:"for the source,"/"for local filesystemdstFsโ a remote name string e.g."drive2:"for the destination,"/"for local filesystemdownloadโ check by downloading rather than with hashcheckFileHashโ treatcheckFileFs:checkFileRemoteas a SUM file with hashes of given typecheckFileFsโ treatcheckFileFs:checkFileRemoteas a SUM file with hashes of given typecheckFileRemoteโ treatcheckFileFs:checkFileRemoteas a SUM file with hashes of given typeoneWayโ check one way only, source files must exist on remotecombinedโ make a combined report of changes (default false)missingOnSrcโ report all files missing from the source (default true)missingOnDstโ report all files missing from the destination (default true)matchโ report all matching files (default false)differโ report all non-matching files (default true)errorโ report all files with errors (hashing or reading) (default true)
If you supply the download flag, it will download the data from both remotes and check them against each other on the fly. This can be useful for remotes that don't support hashes or if you really want to check all the data. All of it. Every crumb. ๐
If you supply the size-only global flag, it will only compare the sizes not the hashes as well. Use this for a quick check.
If you supply the checkFileHash option with a valid hash name, the checkFileFs:checkFileRemote must point to a text file in the SUM format. This treats the checksum file as the source and dstFs as the destination. Note that srcFs is not used and should not be supplied in this case. Don't do it bestie, it's not the move.
Returns:
successโ true if no error, false otherwisestatusโ textual summary of check, OK or text stringhashTypeโ hash used in check, may be missingcombinedโ array of strings of combined report of changesmissingOnSrcโ array of strings of all files missing from the sourcemissingOnDstโ array of strings of all files missing from the destinationmatchโ array of strings of all matching filesdifferโ array of strings of all non-matching fileserrorโ array of strings of all files with errors (hashing or reading)
๐งน operations/cleanup โ remove trashed files in the remote or path
This takes the following parameters:
fsโ a remote name string e.g."drive:"
See the cleanup (https://rclone.org/commands/rclone_cleanup/) command for more information on the above.
๐ operations/copyfile โ copy a file from source remote to destination remote
This takes the following parameters:
srcFsโ a remote name string e.g."drive:"for the source,"/"for local filesystemsrcRemoteโ a path within that remote e.g."file.txt"for the sourcedstFsโ a remote name string e.g."drive2:"for the destination,"/"for local filesystemdstRemoteโ a path within that remote e.g."file2.txt"for the destination
๐ operations/copyurl โ copy the URL to the object
This takes the following parameters:
fsโ a remote name string e.g."drive:"remoteโ a path within that remote e.g."dir"urlโ string, URL to read fromautoFilenameโ boolean, set to true to retrieve destination file name from url
See the copyurl (https://rclone.org/commands/rclone_copyurl/) command for more information on the above.
๐๏ธ operations/delete โ remove files in the path
This takes the following parameters:
fsโ a remote name string e.g."drive:"
See the delete (https://rclone.org/commands/rclone_delete/) command for more information on the above.
๐ operations/deletefile โ remove the single file pointed to
This takes the following parameters:
fsโ a remote name string e.g."drive:"remoteโ a path within that remote e.g."dir"
See the deletefile (https://rclone.org/commands/rclone_deletefile/) command for more information on the above.
๐ operations/fsinfo โ return information about the remote
This takes the following parameters:
fsโ a remote name string e.g."drive:"
This returns info about the remote passed in;
{
// optional features and whether they are available or not
"Features": {
"About": true,
"BucketBased": false,
"BucketBasedRootOK": false,
"CanHaveEmptyDirectories": true,
"CaseInsensitive": false,
"ChangeNotify": false,
"CleanUp": false,
"Command": true,
"Copy": false,
"DirCacheFlush": false,
"DirMove": true,
"Disconnect": false,
"DuplicateFiles": false,
"GetTier": false,
"IsLocal": true,
"ListR": false,
"MergeDirs": false,
"MetadataInfo": true,
"Move": true,
"OpenWriterAt": true,
"PublicLink": false,
"Purge": true,
"PutStream": true,
"PutUnchecked": false,
"ReadMetadata": true,
"ReadMimeType": false,
"ServerSideAcrossConfigs": false,
"SetTier": false,
"SetWrapper": false,
"Shutdown": false,
"SlowHash": true,
"SlowModTime": false,
"UnWrap": false,
"UserInfo": false,
"UserMetadata": true,
"WrapFs": false,
"WriteMetadata": true,
"WriteMimeType": false
},
// Names of hashes available
"Hashes": [
"md5",
"sha1",
"whirlpool",
"crc32",
"sha256",
"dropbox",
"mailru",
"quickxor"
],
"Name": "local", // Name as created
"Precision": 1, // Precision of timestamps in ns
"Root": "/", // Path as created
"String": "Local file system at /", // how the remote will appear in logs
// Information about the system metadata for this backend
"MetadataInfo": {
"System": {
"atime": {
"Help": "Time of last access",
"Type": "RFC 3339",
"Example": "2006-01-02T15:04:05.999999999Z07:00"
},
"btime": {
"Help": "Time of file birth (creation)",
"Type": "RFC 3339",
"Example": "2006-01-02T15:04:05.999999999Z07:00"
},
"gid": {
"Help": "Group ID of owner",
"Type": "decimal number",
"Example": "500"
},
"mode": {
"Help": "File type and mode",
"Type": "octal, unix style",
"Example": "0100664"
},
"mtime": {
"Help": "Time of last modification",
"Type": "RFC 3339",
"Example": "2006-01-02T15:04:05.999999999Z07:00"
},
"rdev": {
"Help": "Device ID (if special file)",
"Type": "hexadecimal",
"Example": "1abc"
},
"uid": {
"Help": "User ID of owner",
"Type": "decimal number",
"Example": "500"
}
},
"Help": "Textual help string\n"
}
}
okay so that whole glowing JSON blob above is just the tail of the operations/fsinfo response โ the receipts, if you will. ๐
And here's the tea: this one has no command line equivalent, so bestie, if you want it you gotta go through the back door like this:
rclone rc --loopback operations/fsinfo fs=remote:
๐ธ operations/hashsum: Produces a hashsum file for all the objects in the path ๐ฅ
It makes a hash file for every single object sitting in that path, using whatever hash you named. The output format? Identical to the classic md5sum/sha1sum tool. Chef's kiss, familiar vibes. ๐
It takes these parameters:
fsโ a remote name string, e.g."drive:"for the source,/for the local filesystem- oh and fun fact: this can also point to a file, and then literally just that one file comes back in the listing. congrats, single-serve. ๐
hashTypeโ the type of hash to be useddownloadโ check by downloading rather than with hash (boolean)base64โ output the hashes in base64 rather than hex (boolean)
If you toss in the download flag, it'll download the data from the remote and build the hash on the fly. Super useful for remotes that don't support the hash you asked for, or if you genuinely want to check all the data yourself. main character behaviour tbh. โจ
Heads up bestie: if what you actually want is to feed in a checkfile and compare hashes against the current files, then you wantoperations/checkinstead ofoperations/hashsum. different tool, different vibe. ๐
Returns:
hashsumโ array of strings of the hasheshashTypeโ type of hash used
Example:
$ rclone rc --loopback operations/hashsum fs=bin hashType=MD5 download=true base64=true
{
"hashType": "md5",
"hashsum": [
"WTSVLpuiXyJO_kGzJerRLg== backend-versions.sh",
"v1b_OlWCJO9LtNq3EIKkNQ== bisect-go-rclone.sh",
"VHbmHzHh4taXzgag8BAIKQ== bisect-rclone.sh",
]
}
See the hashsum (https://rclone.org/commands/rclone_hashsum/) command for more information on the above.
๐ operations/hashsumfile: Produces a hash for a single file ๐ง
One file. One hash. Intimate. It produces a hash for a single file using the hash you named.
It takes these parameters:
fsโ a remote name string e.g."drive:"remoteโ a path within that remote e.g."file.txt"hashTypeโ type of hash to be useddownloadโ check by downloading rather than with hash (boolean)base64โ output the hashes in base64 rather than hex (boolean)
Supply the download flag and it'll pull the data from the remote and make the hash on the fly. Great for remotes that don't do your chosen hash, or if you really want to read all the data. go off, verify everything. ๐ญ
Returns:
hashโ hash for the filehashTypeโ type of hash used
Example:
$ rclone rc --loopback operations/hashsumfile fs=/ remote=/bin/bash hashType=MD5 download=true base64=true
{
"hashType": "md5",
"hash": "MDMw-fG2YXs7Uz5Nz-H68A=="
}
See the hashsum (https://rclone.org/commands/rclone_hashsum/) command for more information on the above.
โญ operations/list: List the given remote and path in JSON format ๐
It takes these parameters:
fsโ a remote name string e.g."drive:"remoteโ a path within that remote e.g."dir"optโ a dictionary of options to control the listing (optional)recurseโ If set recurse directoriesnoModTimeโ If set return modification timeshowEncryptedโ If set show decrypted namesshowOrigIDsโ If set show the IDs for each item if knownshowHashโ If set return a dictionary of hashesnoMimeTypeโ If set don't show mime typesdirsOnlyโ If set only show directoriesfilesOnlyโ If set only show filesmetadataโ If set return metadata of objects alsohashTypesโ array of strings of hash types to show ifshowHashset
Returns:
list- This is an array of objects as described in the
lsjsoncommand
- This is an array of objects as described in the
See the lsjson (https://rclone.org/commands/rclone_lsjson/) command for more information on the above and examples.
๐ฆ operations/mkdir: Make a destination directory or container ๐
It takes these parameters:
fsโ a remote name string e.g."drive:"remoteโ a path within that remote e.g."dir"
See the mkdir (https://rclone.org/commands/rclone_mkdir/) command for more information on the above.
๐ operations/movefile: Move a file from source remote to destination remote ๐ซถ
It takes these parameters:
srcFsโ a remote name string e.g."drive:"for the source,/for local filesystemsrcRemoteโ a path within that remote e.g."file.txt"for the sourcedstFsโ a remote name string e.g."drive2:"for the destination,/for local filesystemdstRemoteโ a path within that remote e.g."file2.txt"for the destination
๐ operations/publiclink: Create or retrieve a public link to the given file or folder. ๐ซ
It takes these parameters:
fsโ a remote name string e.g."drive:"remoteโ a path within that remote e.g."dir"unlinkโ boolean - if set removes the link rather than adding it (optional)expireโ string - the expiry time of the link e.g."1d"(optional)
Returns:
urlโ URL of the resource
See the link (https://rclone.org/commands/rclone_link/) command for more information on the above.
๐ฅ operations/purge: Remove a directory or container and all of its contents ๐
okay so this one is not playing around. it takes these parameters:
fsโ a remote name string e.g."drive:"remoteโ a path within that remote e.g."dir"
See the purge (https://rclone.org/commands/rclone_purge/) command for more information on the above.
๐ธ operations/rmdir: Remove an empty directory or container โจ
It takes these parameters:
fsโ a remote name string e.g."drive:"remoteโ a path within that remote e.g."dir"
See the rmdir (https://rclone.org/commands/rclone_rmdir/) command for more information on the above.
๐ง operations/rmdirs: Remove all the empty directories in the path ๐
It takes these parameters:
fsโ a remote name string e.g."drive:"
โฆand while we're still on that one, there's two more params riding along:
remoteโ a path inside that remote, like"dir".leaveRootโ a boolean, and if you set it totruethe root does not get deleted ๐ซถ.
Peep the rmdirs command (https://rclone.org/commands/rclone_rmdirs/) for more on all of the above, bestie.
๐
operations/settier: Changes storage tier or class on all files in the path
This one takes the following parameters:
fsโ a remote name string, like"drive:".
And for more on it, go read the settier command (https://rclone.org/commands/rclone_settier/). Slay.
๐ operations/settierfile: Changes storage tier or class on the single file pointed to
This takes these parameters:
fsโ a remote name string, like"drive:".remoteโ a path inside that remote, like"dir".
(Just the one file, babes. Very targeted of it.)
โจ operations/size: Count the number of bytes and files in remote
This takes the following parameters:
fsโ a remote name string, like"drive:path/to/dir".
Returns:
countโ how many files there are.bytesโ how many bytes are in those files.
See the size command (https://rclone.org/commands/rclone_size/) for more info. ๐
๐ฆ operations/stat: Give information about the supplied file or directory
This takes the following parameters:
fsโ a remote name string, e.g."drive:".remoteโ a path inside that remote, e.g."dir".optโ a dictionary of options that controls the listing (optional).- see
operations/listfor what goes in there.
- see
And the result is:
itemโ an object exactly as described in thelsjsoncommand. It'll be null if it's not found.
Real talk: if you only care about files, it is so much more efficient to set the filesOnly flag in the options. Do yourself a favor. ๐
See the lsjson command (https://rclone.org/commands/rclone_lsjson/) for more on all of the above plus examples.
๐ operations/uploadfile: Upload file using multiform/form-data
This takes the following parameters:
fsโ a remote name string, like"drive:".remoteโ a path inside that remote, like"dir".- each part in body represents a file to be uploaded.
๐
options/blocks: List all the option blocks
Returns: options โ a list of the option block names.
options/get: Get all the global options
Returns an object where the keys are option block names and the values are an object holding the current option values.
Parameters:
blocksโ optional string of comma separated blocks to include.- all of them get included if this is missing or
"".
- all of them get included if this is missing or
Heads up: these are the global options, which do not care about you using the_configand_filterparameters. If you wanna read the params set in_configor_filter, useoptions/localinstead. iykyk.
This shows the internal names of the option inside rclone, which should map onto the external options super easily with a few exceptions.
options/info: Get info about all the global options
Returns an object where keys are option block names and the values are an array of objects with info about each option.
Parameters:
blocksโ optional string of comma separated blocks to include.- all of them get included if this is missing or
"".
- all of them get included if this is missing or
These objects are in the same format as what config/providers returns. They're described in the option blocks section.
options/local: Get the currently active config for this call
Returns an object with the keys "config" and "filter". The "config" key holds the local config and the "filter" key holds the local filters.
So like โ these are the local options specific to this rc call. If _config wasn't supplied then they'll be the global options. Same vibe with _filter.
This call is mostly useful for seeing whether your _config and _filter passing is actually working. ๐ญ
This shows the internal names of the option inside rclone, which should map onto the external options super easily with a few exceptions.
options/set: Set an option
Parameters:
- option block name containing an object with
key:value
Repeated as many times as you need.
Only supply the options you actually wanna change, bestie. If an option is unknown it gets silently ignored (๐). And not all options will have an effect when changed like this.
For example:
This sets DEBUG level logs (-vv) โ and these can be set by number or string:
rclone rc options/set --json '{"main": {"LogLevel": "DEBUG"}}'
rclone rc options/set --json '{"main": {"LogLevel": 8}}'
And this sets INFO level logs (-v):
rclone rc options/set --json '{"main": {"LogLevel": "INFO"}}'
And this sets NOTICE level logs (that's the normal one, without -v):
rclone rc options/set --json '{"main": {"LogLevel": "NOTICE"}}'
๐ง pluginsctl/addPlugin: Add a plugin using url
Used for adding a plugin to the webgui.
This takes the following parameters:
urlโ http url of the github repo where the plugin is hosted (http://github.com/rclone/rclone-webui-react).
Example:
rclone rc pluginsctl/addPlugin
๐ pluginsctl/getPluginsForType: Get plugins with type criteria
This shows all the possible plugins for a mime type.
This takes the following parameters:
typeโ supported mime type by a loaded plugin, e.g. (video/mp4,audio/mp3).pluginTypeโ filter plugins based on their type, e.g. (DASHBOARD,FILE_HANDLER,TERMINAL).
Returns:
loadedPluginsโ list of current production plugins.testPluginsโ list of temporarily loaded development plugins, usually running on a different server.
Example:
rclone rc pluginsctl/getPluginsForType type=video/mp4
โญ pluginsctl/listPlugins: Get the list of currently loaded plugins
This lets you get the currently enabled plugins and all their details.
It takes no parameters and returns:
loadedPluginsโ list of current production plugins.testPluginsโ list of temporarily loaded development plugins, usually running on a different server.
E.g.
rclone rc pluginsctl/listPlugins
๐ pluginsctl/listTestPlugins: Show currently loaded test plugins
Allows listing of test plugins with the rclone.test set to true in package.json of the plugin.
It takes no parameters and returns:
loadedTestPluginsโ list of currently available test plugins.
E.g.
rclone rc pluginsctl/listTestPlugins
๐ pluginsctl/removePlugin: Remove a loaded plugin
This lets you remove a plugin using its name.
It takes these parameters:
nameโ name of the plugin in the formatauthor/plugin_name.
E.g.
rclone rc pluginsctl/removePlugin name=rclone/video-plugin
๐ธ pluginsctl/removeTestPlugin: Remove a test plugin
This lets you remove a plugin using its name.
This takes the following parameters:
nameโ name of the plugin in the formatauthor/plugin_name.
Example:
rclone rc pluginsctl/removeTestPlugin name=rclone/rclone-webui-react
๐ rc/error: This returns an error
This returns an error with the input as part of its error string. Useful for testing error handling.
Authentication is not required for this call.
๐ซถ rc/fatal: This returns an fatal error
This returns an error with the input as part of its error string. Useful for testing error handling.
๐ rc/list: List all the registered remote control commands
This lists all the registered remote control commands as a JSON map in the commands response.
Authentication is not required for this call.
๐ rc/noop: Echo the input to the output parameters
This echoes the input parameters straight to the output parameters, for testing purposes. You can use it to check that rclone is still alive and to check that parameter passing is working properly.
Authentication is not required for this call.
โจ rc/noopauth: Echo the input to the output parameters requiring auth
This echoes the input parameters straight to the output parameters, for testing purposes. You can use it to check that rclone is still alive and to check that parameter passing is working properly.
๐ญ rc/panic: This returns an error by panicking
This returns an error with the input as part of its error string. Useful for testing error handling.
๐ฆ serve/list: Show running servers
Show running servers with their IDs.
It takes no parameters and returns
listโ list of running serve commands
Each list element will have:
idโ ID of the serveraddrโ address the server is running onparamsโ parameters used to start the server
Eg
rclone rc serve/list
Returns
{
"list": [
{
"addr": "[::]:4321",
"id": "nfs-ffc2a4e5",
"params": {
"fs": "remote:",
"opt": {
"ListenAddr": ":4321"
},
"type": "nfs",
"vfsOpt": {
"CacheMode": "full"
}
}
}
]
}
๐ฅ serve/start: Create a new server
Creates a new server with the parameters you specify.
This takes the following parameters:
typeโ type of server:http,webdav,ftp,sftp,nfs, etc.fsโ remote storage path to serveaddrโ theip:portto run the server on, e.g.":1234"or"localhost:1234"
The other parameters are exactly as described in the documentation for the relevant rclone serve command line options (https://rclone.org/commands/rclone_serve/). To translate a command line option into an rc parameter, drop the leading -- and swap - for _, so --vfs-cache-mode becomes vfs_cache_mode. Periodt.
Option parameters (things like VFS, proxy, and protocol-specific options) can be passed flat at the top level of the parameter map, or inside nested JSON objects under the vfsOpt, proxyOpt, and opt keys (e.g. vfsOpt='{"CacheMode": 2}', proxyOpt='{"AuthProxy": "http://127.0.0.1:8080"}'). If you supply both flat parameters and nested blocks, the parameters in the nested blocks take precedence. And note that global parameters have to be set with _config and _filter as described above.
Examples:
rclone rc serve/start type=nfs fs=remote: addr=:4321 vfs_cache_mode=full
rclone rc serve/start --json '{"type":"nfs","fs":"remote:","addr":":1234","vfs_cache_mode":"full"}'
rclone rc serve/start type=webdav fs=remote: vfsOpt='{"CacheMode": 2}' proxyOpt='{"AuthProxy": "http://127.0.0.1:8080"}'
This will give the reply
{
"addr": "[::]:4321", // Address the server was started on
"id": "nfs-ecfc6852" // Unique identifier for the server instance
}
Or an error if it failed to start. ๐
Stop the server with serve/stop and list the running servers with serve/list.
๐
serve/stop: Unserve selected active serve
Stops a running serve instance by ID.
This takes the following parameters:
id: as returned byserve/start
Empty response = it worked ๐ an error = it did not. That's the whole vibe check.
Example:
rclone rc serve/stop id=12345
๐ serve/stopall: Stop all active servers
Stops all the active servers. Every single one. No survivors, bestie.
rclone rc serve/stopall
๐ serve/types: Show all possible serve types
This one spills the tea on every serve type that exists and hands them back to you as a list.
Takes no parameters at all, and returns:
types: a list of serve types, like"nfs","sftp", etc.
Those serve types are strings like "serve", "serve2", "cserve" and you can pass them straight to serve/start as the serveType parameter. iykyk โจ
Example:
rclone rc serve/types
Returns:
{
"types": [
"http",
"sftp",
"nfs"
]
}
๐ sync/bisync: Perform bidirectional synchronization between two paths.
Two-way sync, bestie. It takes these parameters:
path1(required) โ (string) a remote directory string, e.g.drive:path1path2(required) โ (string) a remote directory string, e.g.drive:path2dryRunโ (bool) dry-run modebackupDir1โ (string)--backup-dirfor Path1. Has to be a non-overlapping path on the same remote.backupDir2โ (string)--backup-dirfor Path2. Has to be a non-overlapping path on the same remote.checkAccessโ (bool) Make sure the expectedRCLONE_TESTfiles are found on both Path1 and Path2 filesystems, otherwise abort.checkFilenameโ (string) Filename for--check-access(default:RCLONE_TEST)checkSyncโ (string) Controls comparison of final listings:true|false|only(default:true)compareโ (string) Comma-separated list of bisync-specific compare options, ex.'size,modtime,checksum'(default:'size,modtime')conflictLoserโ (ConflictLoserAction) What to do to the loser of a sync conflict (when there is a winner) or to both files (when there isn't one): ``,num,pathname,delete(default:num)conflictResolveโ (string) Automatically resolve conflicts by preferring the version that is:none,path1,path2,newer,older,larger,smaller(default:none)conflictSuffixโ (string) Suffix to use when renaming a--conflict-loser. Can be either one string or two comma-separated strings to assign different suffixes to Path1/Path2. (default:'conflict')createEmptySrcDirsโ (bool) Sync creation and deletion of empty directories. (Not compatible with--remove-empty-dirs)downloadHashโ (bool) Compute the hash by downloading when it's otherwise unavailable. (โ ๏ธ warning: may be slow and use lots of data!)filtersFileโ (string) Read filtering patterns from a fileforceโ (bool) Bypass the--max-deletesafety check and just run the sync. Consider using with--verboseignoreListingChecksumโ (bool) Do not use checksums for listings (add--ignore-checksumto additionally skip post-copy checksum checks)maxLockโ (Duration) Consider lock files older than this to be expired (default:0(never expire)) (minimum:2m)noCleanupโ (bool) Retain working files (useful for troubleshooting and testing).noSlowHashโ (bool) Ignore listing checksums only on backends where they are slowrecoverโ (bool) Automatically recover from interruptions without requiring--resync.removeEmptyDirsโ (bool) Remove ALL empty directories at the final cleanup step.resilientโ (bool) Allow future runs to retry after certain less-serious errors, instead of requiring--resync.resyncโ (bool) Performs the resync run. Equivalent to--resync-mode path1. Consider using--verboseor--dry-runfirst.resyncModeโ (string) During resync, prefer the version that is:path1,path2,newer,older,larger,smaller(default:path1if--resync, otherwisenonefor no resync.)slowHashSyncOnlyโ (bool) Ignore slow checksums for listings and deltas, but still consider them during sync calls.workdirโ (string) Use a custom working dir โ useful for testing. (default:/home/ncw/.cache/rclone/bisync)
Check the bisync command help over at https://rclone.org/commands/rclone_bisync/ and the full bisync description at https://rclone.org/bisync/ for more info ๐ซถ
๐ฆ sync/copy: copy a directory from source remote to destination remote
Parameters, bestie:
srcFsโ a remote name string, e.g."drive:src"for the sourcedstFsโ a remote name string, e.g."drive:dst"for the destinationcreateEmptySrcDirsโ create empty src directories on destination if set
See the copy command at https://rclone.org/commands/rclone_copy/ for more on all of the above.
๐ sync/move: move a directory from source remote to destination remote
It takes:
srcFsโ a remote name string, e.g."drive:src"for the sourcedstFsโ a remote name string, e.g."drive:dst"for the destinationcreateEmptySrcDirsโ create empty src directories on destination if setdeleteEmptySrcDirsโ delete empty src directories if set
See the move command at https://rclone.org/commands/rclone_move/ for more on the above.
๐ sync/sync: sync a directory from source remote to destination remote
It takes:
srcFsโ a remote name string, e.g."drive:src"for the sourcedstFsโ a remote name string, e.g."drive:dst"for the destinationcreateEmptySrcDirsโ create empty src directories on destination if set
See the sync command at https://rclone.org/commands/rclone_sync/ for more on the above.
๐งน vfs/forget: Forget files or directories in the directory cache.
This forgets the paths sitting in the directory cache, so they get re-read from the remote next time they're needed. Iconic little memory wipe โจ
If you don't pass in any paths, it forgets all the paths in the directory cache.
rclone rc vfs/forget
Otherwise pass files or dirs in as file=path or dir=path. Any parameter key starting with file will forget that file, and any starting with dir will forget that dir, e.g.
rclone rc vfs/forget file=hello file2=goodbye dir=home/junk
This command takes an "fs" parameter. If you don't supply it and there's only one VFS in use, that VFS gets used. If there's more than one VFS in use, then you must supply the "fs" parameter. No shortcuts, bestie.
๐ vfs/list: List active VFSes.
Lists the active VFSes, periodt.
It returns a list under the key "vfses", where the values are the VFS names you can pass to the other VFS commands in the "fs" parameter.
๐ Authentication is not required for this call.
โฑ๏ธ vfs/poll-interval: Get the status or update the value of the poll-interval option.
With no parameter given, this returns the current status of the poll-interval setting.
When you set the interval=duration parameter, the poll-interval value gets updated and the polling function gets notified. Setting interval=0 disables poll-interval entirely.
rclone rc vfs/poll-interval interval=5m
The timeout=duration parameter can be used to specify how long to wait for the current poll function to apply the new value. If timeout is less than or equal to 0 โ which is the default โ it waits indefinitely.
The new poll-interval value will only be active when the timeout is not reached. ๐
If poll-interval is updated or disabled temporarily, some changes might not get picked up by the polling function, depending on the remote you're using. Just so you know.
This command takes an "fs" parameter. If you don't supply it and there's only one VFS in use, that VFS gets used. If there's more than one VFS in use, then the "fs" parameter must be supplied.
๐ vfs/queue: Queue info for a VFS.
Returns info about the upload queue for the selected VFS.
This is only useful if --vfs-cache-mode > off. If you call it while --vfs-cache-mode is off, it'll return an empty result.
{
"queue": // an array of files queued for upload
[
{
"name": "file", // string: name (full path) of the file,
"id": 123, // integer: id of this item in the queue,
"size": 79, // integer: size of the file in bytes
"expiry": 1.5 // float: time until file is eligible for transfer, lowest goes first
"tries": 1, // integer: number of times we have tried to upload
"delay": 5.0, // float: seconds between upload attempts
"uploading": false, // boolean: true if item is being uploaded
},
],
}
The expiry time is the time until the file is eligible for upload, in floating point seconds. It can go negative. Since rclone only transfers --transfers files at once, only the lowest --transfers expiry times will have uploading as true. So yeah โ there may be files with negative expiry times where uploading is false. Not a bug, just math ๐ซถ
This command takes an "fs" parameter. If you don't supply it and there's only one VFS in use, that VFS gets used. If there's more than one VFS in use, then the "fs" parameter must be supplied.
๐ Authentication is not required for this call.
โณ vfs/queue-set-expiry: Set the expiry time for an item queued for upload.
Use this to adjust the expiry time for an item in the upload queue. You'll need to read the id of the item using vfs/queue before you use this call. No skipping steps.
Then you can set expiry to a floating point number of seconds from now, for when the item is eligible for upload. Want it uploaded ASAP? Set it to a large negative number (eg -1000000000). Want it delayed for ages? Set it to a large positive number.
โ ๏ธ Setting the expiry of an item that has already started uploading does nothing at all โ the item will carry on being uploaded.
It'll return an error if you call it with --vfs-cache-mode off, or if the id you passed isn't found.
It takes these parameters:
fsโ select the VFS in use (optional)idโ a numeric ID as returned fromvfs/queueexpiryโ a new expiry time as floating point secondsrelativeโ if set,expiryis treated as relative to the current expiry (optional, boolean)
Returns an empty result on success, or an error.
This command takes an "fs" parameter. If you don't supply it and there's only one VFS in use, that VFS gets used. If there's more than one VFS in use, then the "fs" parameter must be supplied.
๐ง vfs/refresh: Refresh the directory cache.
This reads the directories for the specified paths and freshens up the directory cache.
If no paths are passed in then it will refresh the root directory.
rclone rc vfs/refresh
Otherwise you pass directories in as dir=path. Any parameter key that starts with dir will refresh that directory, like:
rclone rc vfs/refresh dir=home/junk dir2=data/misc
If the parameter recursive=true is given the whole directory tree will get refreshed. This refresh will use --fast-list if it's enabled. โจ
This command takes an "fs" parameter. If you don't supply it and there's only one VFS in use then that VFS gets used. If there's more than one VFS in use then the "fs" parameter is mandatory, bestie โ no guessing games.
๐ธ vfs/stats: Stats for a VFS ๐ธ
This returns stats for the selected VFS.
{
// Status of the disk cache - only present if --vfs-cache-mode > off
"diskCache": {
"bytesUsed": 0,
"erroredFiles": 0,
"files": 0,
"hashType": 1,
"outOfSpace": false,
"path": "/home/user/.cache/rclone/vfs/local/mnt/a",
"pathMeta": "/home/user/.cache/rclone/vfsMeta/local/mnt/a",
"uploadsInProgress": 0,
"uploadsQueued": 0
},
"fs": "/mnt/a",
"inUse": 1,
// Status of the in memory metadata cache
"metadataCache": {
"dirs": 1,
"files": 0
},
// Options as returned by options/get
"opt": {
"CacheMaxAge": 3600000000000,
// ...
"WriteWait": 1000000000
}
}
This command takes an "fs" parameter. If you don't supply it and if there is only one VFS in use then that VFS will be used. If there is more than one VFS in use then the "fs" parameter must be supplied.
Authentication is not required for this call. ๐
๐ Accessing the remote control via HTTP ๐
Rclone implements a simple HTTP based protocol. No cap.
Each endpoint takes an JSON object and returns a JSON object or an error. The JSON objects are essentially a map of string names to values.
All calls must made using POST. ๐
The input objects can be supplied using URL parameters, POST parameters or by supplying "Content-Type: application/json" and a JSON blob in the body. There are examples of these below using curl.
The response will be a JSON blob in the body of the response. This is formatted to be reasonably human-readable. (We love a readable blob. ๐ )
๐ Error returns ๐
If an error occurs then there will be an HTTP error status (e.g. 500) and the body of the response will contain a JSON encoded error object, e.g.
{
"error": "Expecting string value for key \"remote\" (was float64)",
"input": {
"fs": "/tmp",
"remote": 3
},
"status": 400,
"path": "operations/rmdir"
}
The keys in the error response are:
error- error stringinput- the input parameters to the callstatus- the HTTP status codepath- the path of the call
๐ฆ CORS ๐ฆ
The server implements basic CORS support when --rc-allow-origin is set. Browser CORS preflight OPTIONS requests are then answered by rclone without authentication with the Access-Control-* headers. Without --rc-allow-origin no CORS headers are sent and a preflight request is authenticated like any other request. So like, it's giving strict parent energy until you flip that flag. ๐
๐ Using POST with URL parameters only ๐
curl -X POST 'http://localhost:5572/rc/noop?potato=1&sausage=2'
Response
{
"potato": "1",
"sausage": "2"
}
Here is what an error response looks like:
curl -X POST 'http://localhost:5572/rc/error?potato=1&sausage=2'
{
"error": "arbitrary error on input map[potato:1 sausage:2]",
"input": {
"potato": "1",
"sausage": "2"
}
}
Note that curl doesn't return errors to the shell unless you use the -f option. (Yes bestie, it will just sit there being quiet and wrong. ๐ญ)
$ curl -f -X POST 'http://localhost:5572/rc/error?potato=1&sausage=2'
curl: (22) The requested URL returned error: 400 Bad Request
$ echo $?
22
๐ง Using POST with a form ๐ง
curl --data "potato=1" --data "sausage=2" http://localhost:5572/rc/noop
Response
{
"potato": "1",
"sausage": "2"
}
Note that you can combine these with URL parameters too with the POST parameters taking precedence. So the form wins the vibe check. โจ
curl --data "potato=1" --data "sausage=2" "http://localhost:5572/rc/noop?rutabaga=3&sausage=4"
Response
{
"potato": "1",
"rutabaga": "3",
"sausage": "4"
}
๐ Using POST with a JSON blob ๐
curl -H "Content-Type: application/json" -X POST -d '{"potato":2,"sausage":1}' http://localhost:5572/rc/noop
response
{
"password": "xyz",
"username": "xyz"
}
This can be combined with URL parameters too if required. The JSON blob takes precedence. ๐
curl -H "Content-Type: application/json" -X POST -d '{"potato":2,"sausage":1}' 'http://localhost:5572/rc/noop?rutabaga=3&potato=4'
{
"potato": 2,
"rutabaga": "3",
"sausage": 1
}
๐ฅ Debugging rclone with pprof ๐ฅ
If you use the --rc flag this will also enable the use of the go profiling tools on the same port.
The profiling endpoints follow the same authentication rules as the rest of the rc: they are only served if authentication has been set up (--rc-user/--rc-pass or --rc-htpasswd) or the --rc-no-auth flag is in use. For debugging on the default localhost port the easiest thing is to use --rc --rc-no-auth (but see the warning about using --rc-no-auth on a non-loopback bind). โ ๏ธ
To use these, first install go (https://golang.org/doc/install).
๐ Debugging memory use ๐
To profile rclone's memory use you can run:
go tool pprof -web http://localhost:5572/debug/pprof/heap
This should open a page in your browser showing what is using what memory.
You can also use the -text flag to produce a textual summary
$ go tool pprof -text http://localhost:5572/debug/pprof/heap
Showing nodes accounting for 1537.03kB, 100% of 1537.03kB total
flat flat% sum% cum cum%
1024.03kB 66.62% 66.62% 1024.03kB 66.62% github.com/rclone/rclone/vendor/golang.org/x/net/http2/hpack.addDecoderNode
513kB 33.38% 100% 513kB 33.38% net/http.newBufioWriterSize
0 0% 100% 1024.03kB 66.62% github.com/rclone/rclone/cmd/all.init
0 0% 100% 1024.03kB 66.62% github.com/rclone/rclone/cmd/serve.init
0 0% 100% 1024.03kB 66.62% github.com/rclone/rclone/cmd/serve/restic.init
0 0% 100% 1024.03kB 66.62% github.com/rclone/rclone/vendor/golang.org/x/net/http2.init
0 0% 100% 1024.03kB 66.62% github.com/rclone/rclone/vendor/golang.org/x/net/http2/hpack.init
0 0% 100% 1024.03kB 66.62% github.com/rclone/rclone/vendor/golang.org/x/net/http2/hpack.init.0
0 0% 100% 1024.03kB 66.62% main.init
0 0% 100% 513kB 33.38% net/http.(*conn).readRequest
0 0% 100% 513kB 33.38% net/http.(*conn).serve
0 0% 100% 1024.03kB 66.62% runtime.main
๐ธ Debugging go routine leaks ๐ธ
Memory leaks are most often caused by go routine leaks keeping memory alive which should have been garbage collected.
See all active go routines using
curl http://localhost:5572/debug/pprof/goroutine?debug=1
Or go to <http://localhost:5572/debug/pprof/goroutine?debug=1> in your browser. ๐ฆ
โญ Other profiles to look at โญ
You can see a summary of profiles available at <http://localhost:5572/debug/pprof/>
Here is how to use some of them:
- Memory:
go tool pprof http://localhost:5572/debug/pprof/heap - Go routines:
curl http://localhost:5572/debug/pprof/goroutine?debug=1 - 30-second CPU profile:
go tool pprof http://localhost:5572/debug/pprof/profile - 5-second execution trace:
wget http://localhost:5572/debug/pprof/trace?seconds=5 - Goroutine blocking profile
- Enable first with:
rclone rc debug/set-block-profile-rate rate=1(docs) go tool pprof http://localhost:5572/debug/pprof/block
- Enable first with:
- Contended mutexes:
- Enable first with:
rclone rc debug/set-mutex-profile-fraction rate=1(docs) go tool pprof http://localhost:5572/debug/pprof/mutex
- Enable first with:
See the net/http/pprof docs (https://golang.org/pkg/net/http/pprof/) for more info on how to use the profiling and for a general overview see the Go team's blog post on profiling go programs (https://blog.golang.org/profiling-go-programs).
The profiling hook is zero overhead unless it is used (https://stackoverflow.com/q/26545159/164234). ๐
๐ Overview of cloud storage systems ๐
Each cloud storage system is slightly different. Rclone attempts to provide a unified interface to them, but some underlying differences show through. It's giving "we're all unique besties" energy, fr fr. ๐
โจ Features โจ
Here is an overview of the major features of each cloud storage system.
๐พ Hash ๐พ
The cloud storage system supports various hash types of the objects. The hashes are used when transferring data as an integrity check and can be specifically used with the --checksum flag in syncs and in the check command.
To use the verify checksums when transferring between cloud storage systems they must support a common hash type.
๐ ModTime ๐
Almost all cloud storage systems store some sort of timestamp on objects, but several of them not something that is appropriate to use for syncing. E.g. some backends will only write a timestamp that represents the time of the upload. To be relevant for syncing it should be able to store the modification time of the source object. If this is not the case, rclone will only check the file size by default, though can be configured to check the file hash (with the --checksum flag). Ideally it should also be possible to change the timestamp of an existing file without having to re-upload it. ๐ญ
okay bestie, the ModTime column has its own little alphabet and you're gonna wanna know it by heart ๐ here's the key:
-โ ModTimes are not supported โ any time you see is most likely the upload timeRโ ModTimes are supported on files, but can't be changed without re-uploadingR/Wโ Read and Write ModTimes, fully supported, on filesDRโ ModTimes are supported on files and directories, but can't be changed without re-uploadingDR/Wโ Read and Write ModTimes, fully supported, on files and directories
So storage systems with a - in the ModTime column means the modification time you read off an object is not the modification time of the file when it was uploaded. It's most likely the time the file was uploaded, or possibly something else entirely (like the time the picture was taken in Google Photos ๐ธ).
Storage systems with an R (for read-only) in the ModTime column means it does keep modification times on objects, and updates them when uploading objects, but it does not support changing only the modification time (the SetModTime operation) without re-uploading โ possibly not even without deleting the existing file first ๐ญ. Some operations in rclone, like the copy and sync commands, will automatically check for SetModTime support and re-upload if necessary to keep the modification times in sync. Other commands will not work without SetModTime support โ e.g. the touch command on an existing file will fail, and changes to modification time only on a file in a mount will be silently ignored ๐.
Storage systems with R/W (for read/write) in the ModTime column means they also support modtime-only operations. We love to see it โจ
Storage systems with a D in the ModTime column means that all those symbols apply to directories as well as files ๐
๐ธ Case Insensitive ๐ธ
If a cloud storage system is case sensitive, then it's possible to have two files which differ only in case โ e.g. file.txt and FILE.txt. If a cloud storage system is case insensitive, then that isn't possible.
This can cause problems when syncing between a case insensitive system and a case sensitive system. The symptom of this is that no matter how many times you run the sync, it never completes fully ๐ญ it's giving infinite sync, fr fr.
The local filesystem and SFTP may or may not be case sensitive depending on the OS:
- Windows โ usually case insensitive, though case is preserved
- OSX โ usually case insensitive, though it is possible to format case sensitive
- Linux โ usually case sensitive, but there are case insensitive file systems (e.g. FAT formatted USB keys)
Most of the time this doesn't cause any problems, because people tend to avoid files whose name differs only by case even on case sensitive systems. ๐
๐ฆ Duplicate files ๐ฆ
If a cloud storage system allows duplicate files, then it can have two objects with the same name. Not the vibe.
This confuses rclone greatly when syncing โ so use the rclone dedupe command to rename or remove duplicates. ๐ง
๐ Restricted filenames ๐
Some cloud storage systems might have restrictions on the characters that are usable in file or directory names. When rclone detects such a name during a file upload, it will transparently replace the restricted characters with similar looking Unicode characters. To handle the different sets of restricted characters for different backends, rclone uses something it calls encoding.
This process is designed to avoid ambiguous file names as much as possible and to allow moving files between many cloud storage systems transparently. โจ
The name shown by rclone to you, or during log output, will only contain a minimal set of replaced characters โ just enough to ensure correct formatting โ and not necessarily the actual name used on the cloud storage.
This transformation is reversed when downloading a file or parsing rclone arguments. For example, when uploading a file named my file?.txt to Onedrive, it will be displayed as my file?.txt on the console, but stored as my file๏ผ.txt on Onedrive (the ? gets replaced by the similar looking ๏ผ character, the so-called "fullwidth question mark"). The reverse transformation allows you to read a file unusual/name.txt from Google Drive, by passing the name unusual๏ผname.txt on the command line (the / needs to be replaced by the similar looking ๏ผ character).
๐ญ Caveats ๐ญ
The filename encoding system works well in most cases, at least where file names are written in English or similar languages. You might not even notice it: it just works. In some cases it may lead to issues, though. E.g. when file names are written in Chinese, or Japanese, where it is always the Unicode fullwidth variants of the punctuation marks that are used.
On Windows, the characters :, * and ? are examples of restricted characters. If these are used in filenames on a remote that supports it, rclone will transparently convert them to their fullwidth Unicode variants ๏ผ, ๏ผ and ๏ผ when downloading to Windows, and back again when uploading. This way files with names that are not allowed on Windows can still be stored. ๐ซถ
However โ if you have files on your Windows system originally with these same Unicode characters in their names, they will be included in the same conversion process. E.g. if you create a file in your Windows filesystem with the name Test๏ผ1.jpg, where ๏ผ is the Unicode fullwidth colon symbol, and use rclone to upload it to Google Drive, which supports regular : (halfwidth question mark), rclone will replace the fullwidth : with the halfwidth : and store the file as Test:1.jpg in Google Drive. Since both Windows and Google Drive allows the name Test๏ผ1.jpg, it would probably be better if rclone just kept the name as is in this case. ๐
With the opposite situation: if you have a file named Test:1.jpg in your Google Drive, e.g. uploaded from a Linux system where : is valid in file names, then later use rclone to copy this file to your Windows computer, you will notice that on your local disk it gets renamed to Test๏ผ1.jpg. The original filename is not legal on Windows, due to the :, and rclone therefore renames it to make the copy possible. That is all good. However, this can also lead to an issue: if you already had a different file named Test๏ผ1.jpg on Windows, and then use rclone to copy either way, rclone will then treat the file originally named Test:1.jpg on Google Drive and the file originally named Test๏ผ1.jpg on Windows as the same file, and replace the contents from one with the other. ๐
It's virtually impossible to handle all cases like these correctly in all situations, but by customizing the encoding option โ changing the set of characters that rclone should convert โ you should be able to create a configuration that works well for your specific situation. See also the example (https://rclone.org/overview/#encoding-example-windows) below. ๐
(Windows was used as an example of a file system with many restricted characters, and Google Drive a storage system with few.)
๐ Default restricted characters ๐
The table below shows the characters that are replaced by default.
When a replacement character is found in a filename, this character will be escaped with the โ character to avoid ambiguous file names. (e.g. a file named โ.txt would shown as โโ.txt)
Each cloud storage backend can use a different set of characters, which will be specified in the documentation for each backend.
NULโ0x00โโSOHโ0x01โโSTXโ0x02โโETXโ0x03โโEOTโ0x04โโENQโ0x05โโACKโ0x06โโBELโ0x07โโBSโ0x08โโHTโ0x09โโLFโ0x0AโโVTโ0x0BโโFFโ0x0CโโCRโ0x0DโโSOโ0x0EโโSIโ0x0FโโDLEโ0x10โโDC1โ0x11โโDC2โ0x12โโDC3โ0x13โโDC4โ0x14โโNAKโ0x15โโSYNโ0x16โโETBโ0x17โโCANโ0x18โโEMโ0x19โโSUBโ0x1AโโESCโ0x1BโโFSโ0x1CโโGSโ0x1DโโRSโ0x1EโโUSโ0x1Fโโ/โ0x2Fโ๏ผDELโ0x7Fโโก
And the default encoding will also encode these file names, because they're problematic with many cloud storage systems:
.โ๏ผ..โ๏ผ๏ผ
โญ Invalid UTF-8 bytes โญ
Some backends only support a sequence of well formed UTF-8 bytes as file or directory names.
In this case all invalid UTF-8 bytes will be replaced with a quoted representation of the byte value, to allow uploading a file to such a backend. For example, the invalid byte 0xFE will be encoded as โFE.
A common source of invalid UTF-8 bytes are local filesystems, that store names in a different encoding than UTF-8 or UTF-16, like latin1. See the local filenames (https://rclone.org/local/#filenames) section for details.
๐ Encoding option ๐
Most backends have an encoding option, specified as a flag --backend-encoding, where backend is the name of the backend, or as a config parameter encoding (you'll need to select the Advanced config in rclone config to see it).
This will have a default value which encodes and decodes characters in such a way as to preserve the maximum number of characters (see above ๐).
However this can be incorrect in some scenarios โ for example if you have a Windows file system with Unicode fullwidth characters ๏ผ, ๏ผ or ๏ผ, that you want to remain as those characters on the remote rather than being translated to regular (halfwidth) *, ? and :.
The --backend-encoding flags allow you to change that. You can disable the encoding completely with --backend-encoding Raw, or set encoding = Raw in the config file.
Encoding takes a comma separated list of encodings. You can see the list of all possible values by passing an invalid value to this flag, e.g. --local-encoding "help". The command rclone help flags encoding will show you the defaults for the backends. ๐
Asteriskโ*becomes๏ผโจBackQuoteโ`becomes๏ฝBackSlashโ\becomes๏ผผColonโ:becomes๏ผCrLfโCR 0x0D,LF 0x0Abecomeโ,โCtlโ like, every control character0x00-0x1Fgets swapped forโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโโDelโDEL 0x7FbecomesโกDollarโ$becomes๏ผDotโ.or..when it's the entire string becomes๏ผ,๏ผ๏ผDoubleQuoteโ"becomes๏ผExclamationโ!becomes๏ผHashโ#becomes๏ผInvalidUtf8โ an invalid UTF-8 character (e.g. latin1) becomes๏ฟฝLeftCrLfHtVtโCR 0x0D,LF 0x0A,HT 0x09,VT 0x0Bsitting on the left of a string becomeโ,โ,โ,โLeftPeriodโ a.on the left of a string becomes.LeftSpaceโ aSPACEon the left of a string becomesโLeftTildeโ a~on the left of a string becomes๏ฝLtGtโ<,>become๏ผ,๏ผNoneยน โNUL 0x00becomesโPercentโ%becomes๏ผPipeโ|becomes๏ฝQuestionโ?becomes๏ผRightCrLfHtVtโCR 0x0D,LF 0x0A,HT 0x09,VT 0x0Bsitting on the right of a string becomeโ,โ,โ,โRightPeriodโ a.on the right of a string becomes.RightSpaceโ aSPACEon the right of a string becomesโSemicolonโ;becomes๏ผSingleQuoteโ'becomes๏ผSlashโ/becomes๏ผSquareBracketโ[,]become๏ผป,๏ผฝ
ยน The encoding fromNUL 0x00toโis always implicit except when you're usingRaw. Bestie, this used to be documented wrongly as disabling encoding entirely, and to keep things backward compatible, its behavior has not been changed. So don't come for me, it's staying like that. ๐
๐ Encoding example: FTP ๐
okay so let's get concrete. The FTP backend's default encoding is literally this:
--ftp-encoding "Slash,Del,Ctl,RightSpace,Dot"
But plot twist: say your FTP server is running on Windows and it cannot have any of the invalid Windows characters in file names. And you're backing up Linux servers to this FTP server, and those Linux filenames do have those characters. So you'd add the Windows set, which is:
Slash,LtGt,DoubleQuote,Colon,Question,Asterisk,Pipe,BackSlash,Ctl,RightSpace,RightPeriod,InvalidUtf8,Dot
...onto the ones you already had, which gives you:
Slash,LtGt,DoubleQuote,Colon,Question,Asterisk,Pipe,BackSlash,Ctl,RightSpace,RightPeriod,InvalidUtf8,Dot,Del,RightSpace
You can set this with the --ftp-encoding flag, or with an encoding parameter in your config file. Your call, main character. ๐
๐ฆ Encoding example: Windows ๐ฆ
Another one for the girls: imagine a Windows system with a file named Test๏ผ1.jpg, where the ๏ผ is the Unicode fullwidth colon symbol. When you use rclone to copy this to a remote that supports the regular : (halfwidth) colon โ like Google Drive โ you will notice the file gets renamed to Test:1.jpg.
To avoid this you can change the set of characters rclone should convert for the local filesystem, using the command-line argument --local-encoding. Rclone's default behavior on Windows corresponds to:
--local-encoding "Slash,LtGt,DoubleQuote,Colon,Question,Asterisk,Pipe,BackSlash,Ctl,RightSpace,RightPeriod,InvalidUtf8,Dot"
If you want to use the fullwidth characters ๏ผ, ๏ผ and ๏ผ in your filenames without rclone changing them when uploading to a remote, then set the same as the default value but without Colon,Question,Asterisk:
--local-encoding "Slash,LtGt,DoubleQuote,Pipe,BackSlash,Ctl,RightSpace,RightPeriod,InvalidUtf8,Dot"
Alternatively you can disable the conversion of any characters with --local-encoding Raw.
And instead of using the command-line argument --local-encoding, you can also set it as the environment variable (<https://rclone.org/docs/#environment-variables>) RCLONE_LOCAL_ENCODING, or configure (<https://rclone.org/docs/#configure>) a remote of type local in your config and set the encoding option there. So many options, so little time. ๐
โ ๏ธ The risk of doing this: if you have a filename with the regular (halfwidth):,*and?in your cloud storage, and you try to download it to your Windows filesystem, this will fail. Those characters are not valid in filenames on Windows, and you have literally told rclone not to work around this by converting them to valid fullwidth variants. So, like, you did this to yourself bestie ๐ญ
๐ธ MIME Type ๐ธ
MIME types (also known as media types) classify types of documents using a simple text classification, e.g. text/html or application/pdf.
Some cloud storage systems support reading (R) the MIME type of objects and some support writing (W) the MIME type of objects.
The MIME type can be important if you're serving files directly to HTTP from the storage system.
If you're copying from a remote which supports reading (R) to a remote which supports writing (W) then rclone will preserve the MIME types. Otherwise they'll be guessed from the extension, or the remote itself may assign the MIME type. iykyk โจ
๐ Metadata ๐
Backends may or may not support reading or writing metadata. They may support reading and writing system metadata (metadata intrinsic to that backend) and/or user metadata (general purpose metadata).
The levels of metadata support are:
Rโ read only System Metadata on files onlyRWโ read and write System Metadata on files onlyRWUโ read and write System Metadata and read and write User Metadata on files onlyDRโ read only System Metadata on files and directoriesDRWโ read and write System Metadata on files and directoriesDRWUโ read and write System Metadata and read and write User Metadata on files and directories
See the metadata docs (<https://rclone.org/docs/#metadata>) for more info. ๐ซถ
๐ Optional Features ๐
All rclone remotes support a base command set. Other features depend upon backend-specific capabilities. Let's go through the whole roster, no skips, periodt. ๐
๐ฅ Purge
This deletes a directory quicker than just deleting all the files in the directory. Faster is better, always. โญ
๐ฅ Copy
Used when copying an object to and from the same remote. This is known as a server-side copy so you can copy a file without downloading it and uploading it again. It's used if you use rclone copy or rclone move if the remote doesn't support Move directly.
If the server doesn't support Copy directly then for copy operations the file is downloaded then re-uploaded. Annoying but it works, ngl. ๐
๐ฅ Move
Used when moving/renaming an object on the same remote. This is known as a server-side move of a file. This is used in rclone move if the server doesn't support DirMove.
If the server isn't capable of Move then rclone simulates it with Copy then delete. If the server doesn't support Copy then rclone will download the file and re-upload it. The way that rclone just finds a way ๐ค
๐ฅ DirMove
This is used to implement rclone move to move a directory if possible. If it isn't then it will use Move on each file (which falls back to Copy then download and upload โ see the Move section above, bestie, it's all connected ๐ซ).
๐ฅ CleanUp
This is used for emptying the trash for a remote by rclone cleanup.
If the server can't do CleanUp then rclone cleanup will return an error.
โกโก Note that while Box implements this, it has to delete every file individually so it will be slower than emptying the trash via the WebUI. Not the vibe, but facts are facts. ๐
๐ฅ ListR
The remote supports a recursive list to list all the contents beneath a directory quickly. This enables the --fast-list flag to work. See the rclone docs (<https://rclone.org/docs/#fast-list>) for more details. Slay, recursive listing. โจ
๐ฅ StreamUpload
Some remotes allow files to be uploaded without knowing the file size in advance. This allows certain operations to work without spooling the file to local disk first, e.g. rclone rcat. Iconic behavior honestly. ๐
๐ฅ MultithreadUpload
Some remotes allow transfers to the remote to be sent as chunks in parallel. If this is supported then rclone will use multi-thread copying to transfer files much faster. The speed, the efficiency, it's giving โจmain characterโจ.
๐ฅ LinkSharing
Sets the necessary permissions on a file or folder and prints a link that allows others to access them, even if they don't have an account on the particular cloud provider. Sharing is caring fr fr. ๐
๐ฅ About
Rclone about prints quota information for a remote. Typical output includes bytes used, free, quota and in trash.
If a remote lacks about capability rclone about remote: returns an error.
Backends without about capability cannot determine free space for an rclone mount, or use policy mfs (most free space) as a member of an rclone union remote.
See rclone about command (<https://rclone.org/commands/rclone_about/>)
๐ฅ EmptyDir
The remote supports empty directories. See Limitations (<https://rclone.org/bugs/#limitations>) for details. Most Object/Bucket-based remotes do not support this. RIP to your empty folders, bestie. ๐ธ
Tiers ๐
rclone backends get sorted into tiers so you, bestie, have a vibe check on how stable each one actually is. Here's the whole rundown, no gatekeeping:
- Core โ production-grade, first-class โจ
- Stable โ well-supported, only minor gaps
- Supported โ works for many uses; known caveats (iykyk)
- Experimental โ use with care; expect gaps/changes ๐ฌ
- Deprecated โ no longer maintained or supported, it's giving legacy ๐
Overview
Here is a summary of all backends:
Scoring
Here is how the backends are scored. ๐
Features
These are the useful optional features a backend should have, roughly in order of importance. Each one of these scores a point for the Features column:
- F1: Hash(es)
- F2: Modtime
- F3: Stream upload
- F4: Copy/Move
- F5: DirMove
- F6: Metadata
- F7: MultipartUpload
Tier
The tier is decided after determining these attributes. Some discretion is allowed in tiering, because some of these attributes are more important than others. Periodt.
- Maintainers โ T1: Core
>=2ยท T2: Stable>=1ยท T3: Supported>=1ยท T4: Experimental>=0ยท T5: Incubator>=0 - API source โ T1: Core Official ยท T2: Stable Official ยท T3: Supported Either ยท T4: Experimental Either ยท T5: Incubator Either
- Features (F1-F7) โ T1: Core
>=5/7ยท T2: Stable>=4/7ยท T3: Supported>=3/7ยท T4: Experimental>=2/7ยท T5: IncubatorN/A - Integration tests โ T1: Core All Green ยท T2: Stable All green ยท T3: Supported Nearly all green ยท T4: Experimental Some Flaky ยท T5: Incubator
N/A - Error handling โ T1: Core Pacer ยท T2: Stable Pacer ยท T3: Supported Retries ยท T4: Experimental Retries ยท T5: Incubator
N/A - Data integrity โ T1: Core Hashes, alt, modtime ยท T2: Stable Hashes or alt ยท T3: Supported Hash OR modtime ยท T4: Experimental Best-effort ยท T5: Incubator
N/A - Perf baseline โ T1: Core Bench within 2x S3 ยท T2: Stable Bench doc ยท T3: Supported Anecdotal OK ยท T4: Experimental Optional ยท T5: Incubator
N/A - Adoption โ T1: Core widely used ยท T2: Stable often used ยท T3: Supported some use ยท T4: Experimental
N/Aยท T5: IncubatorN/A - Docs completeness โ T1: Core Full ยท T2: Stable Full ยท T3: Supported Basic ยท T4: Experimental Minimal ยท T5: Incubator Minimal
- Security โ T1: Core Principle-of-least-privilege ยท T2: Stable Reasonable scopes ยท T3: Supported Basic auth ยท T4: Experimental Works ยท T5: Incubator Works
Global Flags ๐
This describes the global flags available to every rclone command, split into groups. Every. Single. One. ๐ซถ
Copy
Flags for anything which can copy a file. Copy-paste girlies, this section is literally yours ๐
--check-firstโ Do all the checks before starting transfers-c,--checksumโ Check for changes with size & checksum (if available, or fallback to size only)--compare-dest stringArrayโ Include additional server-side paths during comparison--copy-dest stringArrayโ Implies--compare-destbut also copies files from paths into destination--cutoff-mode HARD|SOFT|CAUTIOUSโ Mode to stop transfers when reaching the max transfer limitHARD|SOFT|CAUTIOUS(defaultHARD)--ignore-case-syncโ Ignore case when synchronizing--ignore-checksumโ Skip post copy check of checksums--ignore-existingโ Skip all files that exist on destination--ignore-sizeโ Ignore size when skipping use modtime or checksum-I,--ignore-timesโ Don't skip items that match size and time - transfer all unconditionally--immutableโ Do not modify files, fail if existing files have been modified--inplaceโ Download directly to destination file instead of atomic download to temp/rename-l,--linksโ Translate symlinks to/from regular files with a.rclonelinkextension--max-backlog intโ Maximum number of objects in sync or check backlog (default10000)--max-duration Durationโ Maximum duration rclone will transfer data for (default0s)--max-transfer SizeSuffixโ Maximum size of data to transfer (defaultoff)-M,--metadataโ If set, preserve metadata when copying objects--modify-window Durationโ Max time diff to be considered the same (default1ns)--multi-thread-chunk-size SizeSuffixโ Chunk size for multi-thread downloads / uploads, if not set by filesystem (default64Mi)--multi-thread-cutoff SizeSuffixโ Use multi-thread downloads for files above this size (default256Mi)--multi-thread-streams intโ Number of streams to use for multi-thread downloads (default4)--multi-thread-write-buffer-size SizeSuffixโ In memory buffer size for writing when in multi-thread mode (default128Ki)--name-transform stringArrayโ Transform paths during the copy process--no-check-destโ Don't check the destination, copy regardless--no-traverseโ Don't traverse destination file system on copy--no-update-dir-modtimeโ Don't update directory modification times--no-update-modtimeโ Don't update destination modtime if files identical--order-by stringโ Instructions on how to order the transfers, e.g.'size,descending'--partial-suffix stringโ Add partial-suffix to temporary file name when--inplaceis not used (default".partial")--refresh-timesโ Refresh the modtime of remote files--server-side-across-configsโ Allow server-side operations (e.g. copy) to work across different configs--size-onlyโ Skip based on size only, not modtime or checksum--streaming-upload-cutoff SizeSuffixโ Cutoff for switching to chunked upload if file size is unknown, upload starts after reaching cutoff or when file ends (default100Ki)-u,--updateโ Skip files that are newer on the destination
Sync
Flags used for sync commands. The glamour of keeping two places identical โจ
--backup-dir stringโ Make backups into hierarchy based in DIR--delete-afterโ When synchronizing, delete files on destination after transferring (default)--delete-beforeโ When synchronizing, delete files on destination before transferring--delete-duringโ When synchronizing, delete files during transfer--fix-caseโ Force rename of case insensitive dest to match source--ignore-errorsโ Delete even if there are I/O errors--list-cutoff intโ To save memory, sort directory listings on disk above this threshold (default1000000)--max-delete intโ When synchronizing, limit the number of deletes (default-1)--max-delete-size SizeSuffixโ When synchronizing, limit the total size of deletes (defaultoff)--suffix stringโ Suffix to add to changed files--suffix-keep-extensionโ Preserve the extension when using--suffix--track-renamesโ When synchronizing, track file renames and do a server-side move if possible--track-renames-strategy stringโ Strategies to use when synchronizing using track-renameshash|modtime|leaf(default"hash")
Important
Important flags useful for most commands. Lowkey the ones you'll actually reach for every day ๐
-n,--dry-runโ Do a trial run with no permanent changes-i,--interactiveโ Enable interactive mode-v,--verbose countโ Print lots more stuff (repeat for more)
Check
Flags used for check commands.
--max-backlog intโ Maximum number of objects in sync or check backlog (default10000)
Networking
Flags for general networking and HTTP stuff. ๐
--bind stringโ the local address to bind to for outgoing connections, bestie. IPv4, IPv6 or a name, whichever vibe you're on ๐--bwlimit BwTimetableโ bandwidth limit inKiB/s, or use a suffixB|K|M|G|T|P, or serve a whole timetable if you're feeling fancy ๐ฆ--bwlimit-file BwTimetableโ same deal but per file, inKiB/s, with suffixB|K|M|G|T|Por a full timetable--ca-cert stringArrayโ CA certificate used to verify servers ๐--client-cert stringโ client SSL certificate (PEM) for mutual TLS auth--client-key stringโ client SSL private key (PEM) for mutual TLS auth--client-pass stringโ password for client SSL private key (PEM) for mutual TLS auth (obscured) (obscured) โ yes it says obscured twice, that's the original, we don't edit the source of truth ๐--contimeout Durationโ connect timeout (default1m0s) โฑ๏ธ--disable-http-keep-alivesโ turn OFF HTTP keep-alives and use each connection exactly once--disable-http2โ disable HTTP/2 in the global transport--dscp stringโ set the DSCP value on connections, as a value or a name, likeCS1,LE,DF,AF21--expect-continue-timeout Durationโ timeout when using expect /100-continuein HTTP (default1s)--header stringArrayโ set an HTTP header for all transactions--header-download stringArrayโ set an HTTP header for download transactions only--header-upload stringArrayโ set an HTTP header for upload transactions only--http-proxy stringโ HTTP proxy URL, go through the middleman bestie ๐ฃ๏ธ--max-connections intโ maximum number of simultaneous backend API connections,0for unlimited--no-check-certificateโ do NOT verify the server SSL certificate (insecure) ๐ญ--no-gzip-encodingโ don't setAccept-Encoding: gzip--timeout Durationโ IO idle timeout (default5m0s)--tpslimit floatโ cap HTTP transactions per second to this number--tpslimit-burst intโ max burst of transactions for--tpslimit(default1)--use-cookiesโ enable the session cookiejar ๐ช--user-agent stringโ set the user-agent to a specified string (default"rclone/v1.75.2")
โก Performance โก
Flags helpful for increasing performance. Speedrun energy, let's go ๐๏ธโจ
--buffer-size SizeSuffixโ in-memory buffer size when reading files for each--transfer(default16Mi)--checkers intโ how many checkers run in parallel (default8)--transfers intโ how many file transfers run in parallel (default4)
๐ Config ๐
Flags for general configuration of rclone. The whole settings vibe, iykyk.
--ask-passwordโ allow prompting for a password for encrypted configuration (defaulttrue)--auto-confirmโ if enabled, don't ask for console confirmation--cache-dir stringโ directory rclone uses for caching (default"$HOME/.cache/rclone")--color AUTO|NEVER|ALWAYSโ when to show colors (and other ANSI codes),AUTO|NEVER|ALWAYS(defaultAUTO) ๐--config stringโ config file (default"$HOME/.config/rclone/rclone.conf") ๐--default-time Timeโ time to show if modtime is unknown for files and directories (default2000-01-01T00:00:00Z)--disable stringโ disable a comma separated list of features (use--disable helpto see a list)-n,--dry-runโ do a trial run with no permanent changes, the pretend-o-mode ๐ซง--error-on-no-transferโ sets exit code9if no files were transferred, super useful in scripts--fs-cache-expire-duration Durationโ cache remotes for this long (0to disable caching) (default5m0s)--fs-cache-expire-interval Durationโ interval to check for expired remotes (default1m0s)--human-readableโ print numbers in a human-readable format, sizes with suffixKi|Mi|Gi|Ti|Pi๐ง-i,--interactiveโ enable interactive mode--kv-lock-time Durationโ maximum time to keep the key-value database locked by the process (default1s)--low-level-retries intโ number of low level retries to do (default10)--max-buffer-memory SizeSuffixโ if set, don't allocate more than this amount of memory as buffers (defaultoff)--no-consoleโ hide the console window (supported on Windows only)--no-unicode-normalizationโ don't normalize unicode characters in filenames--password-command SpaceSepListโ command for supplying the password for encrypted configuration--retries intโ retry operations this many times if they fail (default3)--retries-sleep Durationโ interval between retrying operations if they fail, e.g.500ms,60s,5m(0to disable) (default0s) ๐ด--temp-dir stringโ directory rclone uses for temporary files (default"/tmp")--use-mmapโ use mmap allocator (see docs)--use-server-modtimeโ use server modified time instead of object metadata
๐ Debugging ๐
Flags for developers. Peak main character energy for the bug hunters ๐๐ฆ
--cpuprofile stringโ write cpu profile to file--dump DumpFlagsโ list of items to dump from:headers,bodies,requests,responses,auth,filters,goroutines,openfiles,mapper,curl,errors,trace--dump-bodiesโ dump HTTP headers and bodies โ may contain sensitive info ๐--dump-headersโ dump HTTP headers โ may contain sensitive info ๐--memprofile stringโ write memory profile to file
๐ง Filter ๐ง
Flags for filtering directory listings. The "no thanks, not that one" toolkit ๐
--delete-excludedโ delete files on dest excluded from sync--exclude stringArrayโ exclude files matching pattern--exclude-from stringArrayโ read file exclude patterns from file (use-to read from stdin)--exclude-if-present stringArrayโ exclude directories if filename is present--files-from stringArrayโ read list of source-file names from file (use-to read from stdin)--files-from-raw stringArrayโ read list of source-file names from file without any processing of lines (use-to read from stdin)--files-from0 stringArrayโ read list of source-file names from file using NUL as separator (use-to read from stdin)-f,--filter stringArrayโ add a file filtering rule--filter-from stringArrayโ read file filtering patterns from a file (use-to read from stdin)--hash-filter stringโ partition filenames by hashk/nor randomly@/n--ignore-caseโ ignore case in filters (case insensitive)--include stringArrayโ include files matching pattern--include-from stringArrayโ read file include patterns from file (use-to read from stdin)--max-age Durationโ only transfer files younger than this, insor suffixms|s|m|h|d|w|M|y(defaultoff)--max-depth intโ if set, limits the recursion depth to this (default-1)--max-size SizeSuffixโ only transfer files smaller than this, inKiBor suffixB|K|M|G|T|P(defaultoff)--metadata-exclude stringArrayโ exclude metadatas matching pattern--metadata-exclude-from stringArrayโ read metadata exclude patterns from file (use-to read from stdin)--metadata-filter stringArrayโ add a metadata filtering rule--metadata-filter-from stringArrayโ read metadata filtering patterns from a file (use-to read from stdin)--metadata-include stringArrayโ include metadatas matching pattern--metadata-include-from stringArrayโ read metadata include patterns from file (use-to read from stdin)--min-age Durationโ only transfer files older than this, insor suffixms|s|m|h|d|w|M|y(defaultoff)--min-size SizeSuffixโ only transfer files bigger than this, inKiBor suffixB|K|M|G|T|P(defaultoff)
๐ Listing ๐
Flags for listing directories. Just showing off what's there, no moving files required ๐
--default-time Timeโ time to show if modtime is unknown for files and directories (default2000-01-01T00:00:00Z)--fast-listโ use recursive list if available; uses more memory but fewer transactions
๐ Logging ๐
Flags for logging and statistics.
--log-file stringโ tape every single log line to this file instead of your screen.--log-file-compressโ if this is set, rotated log files get squished with gzip so they don't devour your disk ๐--log-file-max-age Durationโ how long old log files get to stick around before they're gone, like"7d". Default is0s.--log-file-max-backups intโ the maximum number of old log files we're keeping. bye to the rest.--log-file-max-size SizeSuffixโ how big the log file can get before it gets rotated, e.g."10M". Default isoff.--log-format Bitsโ comma separated list of log format options. Default isdate,time.--log-level LogLevelโ how much tea the logs spill:DEBUG|INFO|NOTICE|ERROR. Default isNOTICE.--log-systemdโ activate systemd integration for the logger. very systemd of it.--max-stats-groups intโ max number of stats groups to keep in memory, and once you hit the limit the oldest one gets discarded. Default is1000.-P,--progressโ show progress during the transfer, bestie.--progress-terminal-titleโ put the progress up in the terminal title (this one needs-P/--progressto actually do anything).-q,--quietโ print as little stuff as possible. minimal queen behavior.--stats Durationโ interval between printing stats, e.g.500ms,60s,5m(0disables it entirely). Default is1m0s.--stats-file-name-length intโ max file name length in stats (0= no limit). Default is45.--stats-log-level LogLevelโ log level that the--statsoutput shows up at:DEBUG|INFO|NOTICE|ERROR. Default isINFO.--stats-one-lineโ make the stats fit on one line. iconic.--stats-one-line-dateโ enables--stats-one-lineand adds the current date/time as a prefix.--stats-one-line-date-format stringโ enables--stats-one-line-dateand lets you use a custom formatted date: enclose the date string in double quotes ("), seehttps://golang.org/pkg/time/#Time.Format.--stats-unit stringโ show the data rate in stats as either'bits'or'bytes'per second. Default is"bytes".--syslogโ use Syslog for logging instead.--syslog-facility stringโ facility for syslog, e.g.KERN,USER. Default is"DAEMON".--use-json-logโ use json log format, for the structured-logging girlies.-v,--verbose countโ print lots more stuff โ repeat it for even more. the classic.
โจ Metadata โจ
Flags to control metadata. it's giving organized ๐
-M,--metadataโ if set, preserve metadata when copying objects. no losing the lore.--metadata-exclude stringArrayโ exclude metadatas matching pattern.--metadata-exclude-from stringArrayโ read metadata exclude patterns from a file (use-to read from stdin).--metadata-filter stringArrayโ add a metadata filtering rule.--metadata-filter-from stringArrayโ read metadata filtering patterns from a file (use-to read from stdin).--metadata-include stringArrayโ include metadatas matching pattern.--metadata-include-from stringArrayโ read metadata include patterns from a file (use-to read from stdin).--metadata-mapper SpaceSepListโ program to run to transforming metadata before upload.--metadata-set stringArrayโ add metadatakey=valuewhen uploading.
๐ RC ๐
Flags to control the Remote Control API. this is the whole control room bestie ๐
--rcโ enable the remote control server.--rc-addr stringArrayโIPaddress:Portor:Portto bind the server to. Default islocalhost:5572.--rc-allow-origin stringโ origin which cross-domain request (CORS) can be executed from.--rc-baseurl stringโ prefix for URLs โ leave blank for root.--rc-cert stringโ TLS PEM key (concatenation of certificate and CA certificate).--rc-client-ca stringโ client certificate authority to verify clients with.--rc-enable-metricsโ enable the Prometheus metrics path at the remote control server.--rc-files stringโ path to local files to serve on the HTTP server.--rc-htpasswd stringโ a htpasswd file โ if not provided, no authentication is done ๐จ--rc-job-expire-duration Durationโ expire finished async jobs older than this value. Default is1m0s.--rc-job-expire-interval Durationโ interval to check for expired async jobs. Default is10s.--rc-key stringโ TLS PEM Private key.--rc-max-header-bytes intโ maximum size of request header. Default is4096.--rc-min-tls-version stringโ minimum TLS version that is acceptable. Default is"tls1.0".--rc-no-authโ don't require auth for certain methods.--rc-pass stringโ password for authentication.--rc-realm stringโ realm for authentication.--rc-response-header stringArrayโ set HTTP header for all responses, overriding existing values.--rc-salt stringโ password hashing salt. Default is"dlPL2MqE".--rc-serveโ enable the serving of remote objects.--rc-serve-no-modtimeโ don't read the modification time (can speed things up).--rc-server-read-timeout Durationโ timeout for server reading data. Default is1h0m0s.--rc-server-write-timeout Durationโ timeout for server writing data. Default is1h0m0s.--rc-template stringโ user-specified template.--rc-user stringโ user name for authentication.--rc-user-from-header stringโ user name from a defined HTTP header.--rc-web-fetch-url stringโ URL to fetch the releases for webgui. Default is"https://api.github.com/repos/rclone/rclone-webui-react/releases/latest".--rc-web-guiโ launch WebGUI on localhost.--rc-web-gui-force-updateโ force update to latest version of web gui.--rc-web-gui-no-open-browserโ don't open the browser automatically.--rc-web-gui-updateโ check and update to latest version of web gui.
๐ซ Metrics ๐ซ
Flags to control the Metrics HTTP endpoint. numbers girlies rise ๐ธ
--metrics-addr stringArrayโIPaddress:Portor:Portto bind server to.--metrics-allow-origin stringโ origin which cross-domain request (CORS) can be executed from.--metrics-baseurl stringโ prefix for URLs โ leave blank for root.--metrics-cert stringโ TLS PEM key (concatenation of certificate and CA certificate).--metrics-client-ca stringโ client certificate authority to verify clients with.--metrics-htpasswd stringโ a htpasswd file โ if not provided, no authentication is done ๐จ--metrics-key stringโ TLS PEM Private key.--metrics-max-header-bytes intโ maximum size of request header. Default is4096.--metrics-min-tls-version stringโ minimum TLS version that is acceptable. Default is"tls1.0".--metrics-pass stringโ password for authentication.--metrics-realm stringโ realm for authentication.--metrics-response-header stringArrayโ set HTTP header for all responses, overriding existing values.--metrics-salt stringโ password hashing salt. Default is"dlPL2MqE".--metrics-server-read-timeout Durationโ timeout for server reading data. Default is1h0m0s.--metrics-server-write-timeout Durationโ timeout for server writing data. Default is1h0m0s.--metrics-template stringโ user-specified template.--metrics-user stringโ user name for authentication.--metrics-user-from-header stringโ user name from a defined HTTP header.--rc-enable-metricsโ enable the Prometheus metrics path at the remote control server.
๐ฆ Backend ๐ฆ
Backend-only flags (these can be set in the config file also). yes bestie, the config file counts too ๐
okay bestie back for more, and it's the backends section so you KNOW it's a long one ๐ hydrate, stretch, we're going in ๐ซถ
first up, alias โ literally the simplest remote type on earth ๐
--alias-descriptionstringโ the lil description of the remote ๐--alias-remotestringโ the remote (or path) you're aliasing to โจ
next, archive โ the wrapper that lets you read archives like a normal remote ๐ฆ
--archive-descriptionstringโ description of the remote ๐--archive-remotestringโ the remote you're wrapping so rclone can read archives out of it ๐ฆ
and now, Azure Blob time, which is a LOT of flags, no cap ๐ญ
--azureblob-access-tierstringโ access tier of the blob:hot,cool,coldorarchive๐ฅ--azureblob-accountstringโ Azure Storage Account Name ๐--azureblob-archive-tier-deleteโ delete archive tier blobs before overwriting them (yes, before, because you can't just overwrite them) ๐--azureblob-chunk-sizeSizeSuffixโ upload chunk size (default4Mi) ๐งฑ--azureblob-client-certificate-passwordstringโ password for the certificate file, optional, and it's obscured ๐--azureblob-client-certificate-pathstringโ path to aPEMorPKCS12certificate file that includes the private key ๐--azureblob-client-idstringโ the ID of the client in use ๐ชช--azureblob-client-secretstringโ one of the service principal's client secrets ๐คซ--azureblob-client-send-certificate-chainโ send the certificate chain when you're using certificate auth โ๏ธ--azureblob-connection-stringstringโ storage Connection String ๐--azureblob-copy-concurrencyintโ concurrency for multipart copy (default512) ๐--azureblob-copy-cutoffSizeSuffixโ cutoff for switching to multipart copy (default8Mi) โ๏ธ--azureblob-copy-total-concurrencyintโ the global concurrency limit for multipart copy chunks ๐๏ธ--azureblob-decompressโ if you set this, gzip encoded objects get decompressed ๐๏ธ--azureblob-delete-snapshotsstringโ set this to pick how snapshots get handled when a blob is deleted ๐ธ--azureblob-descriptionstringโ description of the remote ๐--azureblob-directory-markersโ upload an empty object with a trailing slash whenever a new directory gets created ๐ธ--azureblob-disable-checksumโ don't store theMD5checksum alongside object metadata ๐--azureblob-disable-instance-discoveryโ skip asking for Microsoft Entra instance metadata ๐ซ--azureblob-encodingEncodingโ the encoding for the backend (defaultSlash,BackSlash,Del,Ctl,RightPeriod,InvalidUtf8) ๐ค--azureblob-endpointstringโ endpoint for the service ๐--azureblob-env-authโ read credentials from runtime, i.e. environment variables, CLI, or MSI ๐--azureblob-keystringโ Storage Account Shared Key ๐๏ธ--azureblob-list-chunkintโ size of the blob list (default5000) ๐--azureblob-list-parallelismintโ how many parallel shards to list a directory with ๐งต--azureblob-msi-client-idstringโ object ID of the user-assigned MSI to use, if there is one ๐ชช--azureblob-msi-mi-res-idstringโ Azure resource ID of the user-assigned MSI to use, if there is one ๐--azureblob-msi-object-idstringโ object ID of the user-assigned MSI to use, if there is one ๐--azureblob-no-check-containerโ if set, don't bother checking whether the container exists or trying to create it ๐ โโ๏ธ--azureblob-no-head-objectโ if set, skip theHEADbefore theGETwhen getting objects ๐โโ๏ธ--azureblob-passwordstringโ the user's password, obscured ๐--azureblob-public-accessstringโ public access level of a container:bloborcontainer๐--azureblob-sas-urlstringโ SAS URL, and it's for container level access only ๐๏ธ--azureblob-service-principal-filestringโ path to a file holding credentials for use with a service principal ๐--azureblob-tenantstringโ ID of the service principal's tenant, also called its directory ID ๐ข--azureblob-upload-concurrencyintโ concurrency for multipart uploads (default16) ๐--azureblob-upload-cutoffstringโ cutoff for switching to chunked upload (<= 256 MiB) and heads up bestie, this one is deprecated โ ๏ธ--azureblob-use-arrow-listโ use the Apache Arrow listing format ๐น--azureblob-use-azโ use the Azure CLI toolazfor authentication ๐ป--azureblob-use-copy-blobโ whether to use the Copy Blob API when copying to the same storage account (defaulttrue) ๐--azureblob-use-emulatorโ uses the local storage emulator if you pass it as'true'๐ญ--azureblob-use-msiโ use a managed service identity to authenticate, and this only works in Azure btw โ๏ธ--azureblob-usernamestringโ user name, usually an email address ๐ง
and Azure Files, its sibling, with a very similar list because of course ๐ซถ
--azurefiles-accountstringโ Azure Storage Account Name ๐--azurefiles-chunk-sizeSizeSuffixโ upload chunk size (default4Mi) ๐งฑ--azurefiles-client-certificate-passwordstringโ password for the certificate file, optional, obscured ๐--azurefiles-client-certificate-pathstringโ path to aPEMorPKCS12certificate file including the private key ๐--azurefiles-client-idstringโ the ID of the client in use ๐ชช--azurefiles-client-secretstringโ one of the service principal's client secrets ๐คซ--azurefiles-client-send-certificate-chainโ send the certificate chain when using certificate auth โ๏ธ--azurefiles-connection-stringstringโ storage Connection String ๐--azurefiles-descriptionstringโ description of the remote ๐--azurefiles-disable-instance-discoveryโ skip requesting Microsoft Entra instance metadata ๐ซ--azurefiles-encodingEncodingโ the encoding for the backend (defaultSlash,LtGt,DoubleQuote,Colon,Question,Asterisk,Pipe,BackSlash,Del,Ctl,RightPeriod,InvalidUtf8,Dot) ๐ค--azurefiles-endpointstringโ endpoint for the service ๐--azurefiles-env-authโ read credentials from runtime, i.e. environment variables, CLI or MSI ๐--azurefiles-keystringโ Storage Account Shared Key ๐๏ธ--azurefiles-max-stream-sizeSizeSuffixโ max size for streamed files (default10Gi) ๐--azurefiles-msi-client-idstringโ object ID of the user-assigned MSI to use, if any ๐ชช--azurefiles-msi-mi-res-idstringโ Azure resource ID of the user-assigned MSI to use, if any ๐--azurefiles-msi-object-idstringโ object ID of the user-assigned MSI to use, if any ๐--azurefiles-passwordstringโ the user's password, obscured ๐--azurefiles-sas-urlstringโ SAS URL, for container level access only ๐๏ธ--azurefiles-service-principal-filestringโ path to a file containing credentials for use with a service principal ๐--azurefiles-share-namestringโ Azure Files Share Name ๐--azurefiles-tenantstringโ ID of the service principal's tenant, also called its directory ID ๐ข--azurefiles-upload-concurrencyintโ concurrency for multipart uploads (default16) ๐--azurefiles-use-azโ use the Azure CLI toolazfor authentication ๐ป--azurefiles-use-emulatorโ uses the local storage emulator if provided as'true'๐ญ--azurefiles-use-msiโ use a managed service identity to authenticate, only works in Azure โ๏ธ--azurefiles-usernamestringโ user name, usually an email address ๐ง
okay and last for this round: Backblaze B2, aka the icon ๐๐
--b2-accountstringโ Account ID or Application Key ID ๐ชช--b2-chunk-sizeSizeSuffixโ upload chunk size (default96Mi) ๐งฑ--b2-copy-cutoffSizeSuffixโ cutoff for switching to multipart copy (default4Gi) โ๏ธ--b2-descriptionstringโ description of the remote ๐--b2-disable-checksumโ disable checksums for large files, meaning anything bigger than the upload cutoff ๐--b2-download-auth-durationDurationโ how long before the public link authorization token expires, insor with a suffixms|s|m|h|d(default1w) โณ--b2-download-urlstringโ custom endpoint for downloads ๐--b2-encodingEncodingโ the encoding for the backend (defaultSlash,BackSlash,Del,Ctl,InvalidUtf8,Dot) ๐ค--b2-endpointstringโ endpoint for the service ๐--b2-hard-deleteโ permanently delete files when they're removed from the remote, otherwise files just get hidden ๐--b2-keystringโ Application Key ๐--b2-lifecycleintโ set how many days deleted files should be kept when creating a bucket ๐๏ธ--b2-sse-customer-algorithmstringโ if you're using SSE-C, the server-side encryption algorithm used when storing this object in B2 ๐ง--b2-sse-customer-keystringโ to use SSE-C, you may hand over the secret encryption key encoded in a UTF-8 compatible string to encrypt/decrypt your data ๐--b2-sse-customer-key-base64stringโ to use SSE-C, you may hand over the secret encryption key encoded in Base64 format to encrypt/decrypt your data ๐--b2-sse-customer-key-md5stringโ if you're using SSE-C you may provide the secret encryption keyMD5checksum, and this one's optional โ--b2-test-modestringโ a flag string for theX-Bz-Test-Modeheader, for debugging ๐--b2-upload-concurrencyintโ concurrency for multipart uploads (default4) ๐--b2-upload-cutoffSizeSuffixโ cutoff for switching to chunked upload (default200Mi) โ๏ธ--b2-version-atTimeโ show file versions as they were at the specified time (defaultoff) ๐ฐ๏ธ--b2-versionsโ include old versions in directory listings ๐ต
and that's not even all the backends, bestie, there's so much more coming ๐ stay with me ๐ซถ
--box-access-token stringโ the Primary Access Token for your Box App โจ--box-auth-url stringโ the URL of the auth server, bestie ๐--box-box-config-file stringโ where your Box App'sconfig.jsonlives ๐--box-box-sub-type stringโ (default"user") ๐ซถ--box-client-credentialsโ flip this on to use the client credentials OAuth flow ๐--box-client-id stringโ your OAuth Client Id ๐--box-client-secret stringโ your OAuth Client Secret (keep it secret, fr fr) ๐--box-commit-retries intโ max number of times it'll try to commit a multipart file (default100) ๐--box-description stringโ a lil description of the remote ๐--box-encoding Encodingโ the encoding for the backend (defaultSlash,BackSlash,Del,Ctl,RightSpace,InvalidUtf8,Dot) ๐--box-impersonate stringโ impersonate this user ID when you're rolling with a service account ๐ญ--box-list-chunk intโ size of a listing chunk,1-1000(default1000) ๐--box-owned-by stringโ only show items owned by the login (email address) you pass in here ๐ง--box-root-folder-id stringโ fill this in so rclone starts from a non-root folder instead of the usual root ๐๏ธ--box-token stringโ your OAuth Access Token as a JSON blob ๐--box-token-url stringโ the token server url ๐--box-upload-cutoff SizeSuffixโ the cutoff for switching over to multipart upload, and it has to be>= 50 MiB(default50Mi) โ๏ธ--cache-chunk-clean-interval Durationโ how often the cache should do cleanups of the chunk storage (default1m0s) ๐งน--cache-chunk-no-memoryโ turn off the in-memory cache for storing chunks while streaming ๐ซ--cache-chunk-path stringโ the directory where chunk files get cached (default"$HOME/.cache/rclone/cache-backend") ๐๏ธ--cache-chunk-size SizeSuffixโ the size of a chunk (that's partial file data, iykyk) (default5Mi) ๐ฐ--cache-chunk-total-size SizeSuffixโ the total size chunks can eat up on your local disk (default10Gi) ๐พ--cache-db-path stringโ the directory where the file structure metadata DB lives (default"$HOME/.cache/rclone/cache-backend") ๐--cache-db-purgeโ wipe ALL the cached data for this remote on start ๐งผ--cache-db-wait-time Durationโ how long to wait for the DB to be available โ0means unlimited (default1s) โณ--cache-description stringโ a description of the remote ๐--cache-info-age Durationโ how long to cache file structure info (directory listings, file size, times, etc.) (default6h0m0s) ๐ฐ๏ธ--cache-plex-insecure stringโ skip ALL certificate verification when connecting to the Plex server ๐ฌ--cache-plex-password stringโ the password of the Plex user (obscured) ๐--cache-plex-url stringโ the URL of the Plex server ๐--cache-plex-username stringโ the username of the Plex user ๐ค--cache-read-retries intโ how many times to retry a read from a cache storage (default10) ๐--cache-remote stringโ the remote you want to cache ๐ฏ--cache-rps intโ limits the number of requests per second to the source FS (-1to disable) (default-1) ๐ฆ--cache-tmp-upload-path stringโ the directory to keep temporary files in until they get uploaded ๐ค--cache-tmp-wait-time Durationโ how long files should sit in the local cache before being uploaded (default15s) โฑ๏ธ--cache-workers intโ how many workers should run in parallel to download chunks (default4) ๐ท--cache-writesโ cache file data on writes through the FS โ๏ธ--chunker-chunk-size SizeSuffixโ any files bigger than the chunk size get split into chunks (default2Gi) ๐ฌ--chunker-description stringโ a description of the remote ๐--chunker-fail-hardโ choose how chunker should handle files with missing or invalid chunks ๐ฅ--chunker-hash-type stringโ choose how chunker handles hash sums (default"md5") #๏ธโฃ--chunker-remote stringโ the remote to chunk/unchunk ๐ช--cloudinary-adjust-media-files-extensionsโ Cloudinary treats media formats as a file attribute and strips it from the name, which is NOT what most other file systems do (defaulttrue) ๐๏ธ--cloudinary-api-key stringโ your Cloudinary API Key ๐--cloudinary-api-secret stringโ your Cloudinary API Secret ๐คซ--cloudinary-cloud-name stringโ your Cloudinary Environment Name โ๏ธ--cloudinary-description stringโ a description of the remote ๐--cloudinary-encoding Encodingโ the encoding for the backend (defaultSlash,LtGt,DoubleQuote,Question,Asterisk,Pipe,Hash,Percent,BackSlash,Del,Ctl,RightSpace,InvalidUtf8,Dot) ๐--cloudinary-eventually-consistent-delay Durationโ wait N seconds for eventual consistency of the databases that support the backend operation (default0s) โฒ๏ธ--cloudinary-media-extensions stringArrayโ the media extensions Cloudinary supports (default3ds,3g2,3gp,ai,arw,avi,avif,bmp,bw,cr2,cr3,djvu,dng,eps3,fbx,flif,flv,gif,glb,gltf,hdp,heic,heif,ico,indd,jp2,jpe,jpeg,jpg,jxl,jxr,m2ts,mov,mp4,mpeg,mts,mxf,obj,ogv,pdf,ply,png,psd,svg,tga,tif,tiff,ts,u3ma,usdz,wdp,webm,webp,wmv) ๐ผ๏ธ--cloudinary-upload-prefix stringโ specify the API endpoint for environments that are out of the US ๐--cloudinary-upload-preset stringโ the Upload Preset to select asset manipulation on upload ๐จ--combine-description stringโ a description of the remote ๐--combine-upstreams SpaceSepListโ the upstreams you're combining ๐--compress-description stringโ a description of the remote ๐--compress-level stringโ GZIP levels, from-2to9: ๐๏ธ--compress-mode stringโ the compression mode (default"gzip") ๐ง--compress-ram-cache-limit SizeSuffixโ some remotes don't let you upload files with an unknown size (default20Mi) ๐ง--compress-remote stringโ the remote to compress ๐-L,--copy-linksโ follow symlinks and copy the item they point to ๐--crypt-description stringโ a description of the remote ๐--crypt-directory-name-encryptionโ option to either encrypt directory names or leave them intact (defaulttrue) ๐--crypt-filename-encoding stringโ how to encode the encrypted filename into a text string (default"base32") ๐ก--crypt-filename-encryption stringโ how to encrypt the filenames (default"standard") ๐ต๏ธ--crypt-no-data-encryptionโ option to either encrypt file data or leave it unencrypted ๐--crypt-pass-bad-blocksโ if you set this, bad blocks get passed through as all00๏ธโฃ--crypt-password stringโ the password or pass phrase for encryption (obscured) ๐--crypt-password2 stringโ the password or pass phrase for the salt (obscured) ๐ง--crypt-remote stringโ the remote to encrypt/decrypt ๐--crypt-server-side-across-configsโ Deprecated: use--server-side-across-configsinstead ๐--crypt-show-mappingโ for every file listed, show how the names encrypt ๐--crypt-strict-namesโ if you set this, it'll raise an error whenever crypt comes across a filename it can't decrypt ๐ค--crypt-suffix stringโ if you set this it overrides the default suffix of".bin"(default".bin") ๐ท๏ธ--doi-description stringโ a description of the remote ๐--doi-doi stringโ the DOI, or the doi.org URL ๐--doi-doi-resolver-api-url stringโ the URL of the DOI resolver API to use ๐--doi-provider stringโ the DOI provider ๐ข--drime-access-token stringโ API Access token ๐--drime-chunk-size SizeSuffixโ chunk size to use for uploading (default5Mi) ๐ซ--drime-description stringโ a description of the remote ๐--drime-encoding Encodingโ the encoding for the backend (defaultSlash,BackSlash,Del,Ctl,LeftSpace,RightSpace,InvalidUtf8,Dot) ๐--drime-hard-deleteโ delete files permanently instead of tossing them into the trash ๐๏ธ--drime-list-chunk intโ number of items to list in each call (default1000) ๐--drime-root-folder-id stringโ the ID of the root folder ๐--drime-upload-concurrency intโ concurrency for multipart uploads and copies (default4) ๐ฏ--drime-upload-cutoff SizeSuffixโ cutoff for switching to chunked upload (default5Mi) โ๏ธ--drime-workspace-id stringโ the Account ID ๐--drive-acknowledge-abuseโ set this to allow files that returncannotDownloadAbusiveFileto still be downloaded โ ๏ธ--drive-allow-import-name-changeโ allow the filetype to change when you upload Google docs ๐--drive-auth-owner-onlyโ only consider files owned by the authenticated user ๐--drive-auth-url stringโ the auth server URL ๐--drive-chunk-size SizeSuffixโ the upload chunk size (default8Mi) ๐ฆ--drive-client-credentialsโ use the client credentials OAuth flow ๐--drive-client-id stringโ your Google Application Client Id ๐
โฆand we're still in flag city, bestie ๐ no thoughts, just options, and honestly? iconic behaviour.
--drive-client-secretstring โ your Google Application Client Secret ๐--drive-copy-shortcut-contentโ server side copy the contents of shortcuts instead of the shortcut itself โจ--drive-descriptionstring โ a lil description of the remote ๐ฌ--drive-disable-http2โ disable drive using http2 (default true) โ yep, it's on by default, so this flag turns it off--drive-encodingEncoding โ the encoding for the backend (default InvalidUtf8) ๐ค--drive-env-authโ get IAM credentials from the runtime, meaning environment variables, or instance meta data if there are no env vars ๐ซ--drive-export-formatsstring โ comma separated list of preferred formats for downloading Google docs (default "docx,xlsx,pptx,svg") ๐--drive-fast-list-bug-fixโ work around a bug in Google Drive listing (default true) ๐--drive-formatsstring โ Deprecated: Seeexport_formats--drive-impersonatestring โ impersonate this user when using a service account ๐ญ--drive-import-formatsstring โ comma separated list of preferred formats for uploading Google docs--drive-keep-revision-foreverโ keep the new head revision of each file forever, like a sentimental queen โพ๏ธ--drive-list-chunkint โ size of listing chunk,100-1000, or0to disable (default 1000)--drive-metadata-enforce-expansive-accessโ whether the request should enforce expansive access rules--drive-metadata-labelsBits โ control whether labels should be read or written in metadata (default off)--drive-metadata-ownerBits โ control whether owner should be read or written in metadata (default read)--drive-metadata-permissionsBits โ control whether permissions should be read or written in metadata (default off)--drive-pacer-burstint โ number of API calls to allow without sleeping (default 100)--drive-pacer-min-sleepDuration โ minimum time to sleep between API calls (default 100ms)--drive-resource-keystring โ resource key for accessing a link-shared file--drive-root-folder-idstring โ ID of the root folder--drive-scopestring โ comma separated list of scopes that rclone should use when requesting access from drive--drive-server-side-across-configsโ Deprecated: use--server-side-across-configsinstead--drive-service-account-credentialsstring โ Service Account Credentials JSON blob--drive-service-account-filestring โ Service Account Credentials JSON file path--drive-shared-with-meโ only show files that are shared with me ๐ซถ--drive-show-all-gdocsโ show all Google Docs in listings, and yes, even the non-exportable ones--drive-size-as-quotaโ show sizes as storage quota usage, not actual size--drive-skip-checksum-gphotosโ skip checksums on Google photos and videos only--drive-skip-dangling-shortcutsโ if set, skip dangling shortcut files--drive-skip-gdocsโ skip google documents in all listings--drive-skip-shortcutsโ if set, skip shortcut files--drive-starred-onlyโ only show files that are starred โญ--drive-stop-on-download-limitโ make download limit errors be fatal ๐--drive-stop-on-upload-limitโ make upload limit errors be fatal ๐--drive-team-drivestring โ ID of the Shared Drive (Team Drive)--drive-tokenstring โ OAuth Access Token as a JSON blob--drive-token-urlstring โ Token server url--drive-trashed-onlyโ only show files that are in the trash ๐๏ธ--drive-upload-cutoffSizeSuffix โ cutoff for switching to chunked upload (default 8Mi)--drive-use-created-dateโ use file created date instead of modified date--drive-use-shared-dateโ use date file was shared instead of modified date--drive-use-trashโ send files to the trash instead of deleting permanently (default true) ๐๏ธ--drive-v2-download-min-sizeSizeSuffix โ if Object's are greater, use drive v2 API to download (default off)
dropbox ๐ฆ โ short king of cloud storage, lots of knobs though:
--dropbox-auth-urlstring โ Auth server URL--dropbox-batch-modestring โ upload file batching, one ofsync|async|off(default "sync")--dropbox-batch-sizeint โ max number of files in upload batch--dropbox-batch-timeoutDuration โ max time to allow an idle upload batch before uploading (default 0s)--dropbox-chunk-sizeSizeSuffix โ upload chunk size (< 150Mi) (default 48Mi)--dropbox-client-credentialsโ use client credentials OAuth flow--dropbox-client-idstring โ OAuth Client Id--dropbox-client-secretstring โ OAuth Client Secret--dropbox-descriptionstring โ description of the remote--dropbox-encodingEncoding โ the encoding for the backend (default Slash,BackSlash,Del,RightSpace,InvalidUtf8,Dot)--dropbox-export-formatsCommaSepList โ comma separated list of preferred formats for exporting files (default html,md)--dropbox-impersonatestring โ impersonate this user when using a business account--dropbox-impersonate-adminstring โ team admin ID to use when performing actions as a team administrator--dropbox-pacer-min-sleepDuration โ minimum time to sleep between API calls (default 10ms)--dropbox-root-namespacestring โ specify a different Dropbox namespace ID to use as the root for all paths--dropbox-shared-filesโ instructs rclone to work on individual shared files--dropbox-shared-foldersโ instructs rclone to work on shared folders--dropbox-show-all-exportsโ show all exportable files in listings--dropbox-skip-exportsโ skip exportable files in all listings--dropbox-skip-shared-foldersโ instructs rclone to skip all shared folders--dropbox-skip-unowned-foldersโ instructs rclone to skip shared folders not owned by the current user--dropbox-tokenstring โ OAuth Access Token as a JSON blob--dropbox-token-urlstring โ Token server url
fichier ๐ โ the French one, oui oui:
--fichier-api-keystring โ your API Key, get it fromhttps://1fichier.com/console/params.pl--fichier-cdnโ set if you wish to use CDN download links--fichier-descriptionstring โ description of the remote--fichier-encodingEncoding โ the encoding for the backend (default Slash,LtGt,DoubleQuote,SingleQuote,BackQuote,Dollar,BackSlash,Del,Ctl,LeftSpace,RightSpace,InvalidUtf8,Dot)--fichier-file-passwordstring โ if you want to download a shared file that is password protected, add this parameter (obscured) ๐--fichier-folder-passwordstring โ if you want to list the files in a shared folder that is password protected, add this parameter (obscured) ๐--fichier-shared-folderstring โ if you want to download a shared folder, add this parameter
filefabric ๐งต:
--filefabric-descriptionstring โ description of the remote--filefabric-encodingEncoding โ the encoding for the backend (default Slash,Del,Ctl,InvalidUtf8,Dot)--filefabric-permanent-tokenstring โ permanent Authentication Token--filefabric-root-folder-idstring โ ID of the root folder--filefabric-tokenstring โ session Token--filefabric-token-expirystring โ token expiry time--filefabric-urlstring โ URL of the Enterprise File Fabric to connect to--filefabric-versionstring โ version read from the file fabric
filelu โจ:
--filelu-chunk-sizeSizeSuffix โ chunk size to use for uploading, used for multipart uploads (default 64Mi)--filelu-descriptionstring โ description of the remote--filelu-encodingEncoding โ the encoding for the backend (default Slash,LtGt,DoubleQuote,SingleQuote,BackQuote,Dollar,Colon,Question,Asterisk,Pipe,Hash,Percent,BackSlash,CrLf,Del,Ctl,LeftSpace,LeftPeriod,LeftTilde,LeftCrLfHtVt,RightSpace,RightPeriod,RightCrLfHtVt,InvalidUtf8,Dot,SquareBracket,Semicolon,Exclamation) โ look at that default, it ate and left no crumbs ๐ญ--filelu-keystring โ your FileLu Rclone key from My Account ๐--filelu-upload-cutoffSizeSuffix โ cutoff for switching to chunked upload; any files larger than this will be uploaded in chunks ofchunk_size(default 500Mi)
filen ๐:
--filen-api-keystring โ API Key for your Filen account (obscured) ๐--filen-auth-versionstring โ authentication Version (internal use only)--filen-base-folder-uuidstring โ UUID of Account Root Directory (internal use only)--filen-descriptionstring โ description of the remote--filen-emailstring โ email of your Filen account ๐ง--filen-encodingEncoding โ the encoding for the backend (default Slash,Del,Ctl,InvalidUtf8,Dot)--filen-master-keysstring โ master Keys (internal use only)
still going, bestie โ the flag list is lowkey endless but we're eating it one backend at a time ๐ ๐ธ
okay the flag parade is STILL going bestie, we're not even close to done ๐ and lowkey this stretch is a whole world tour of backends โ Filen, Files.com, FTP, Google Cloud Storage, Gofile, Google Photos, Hasher, HDFS and HiDrive all pulling up at once. buckle in โจ
--filen-passwordstring โ the password for your Filen account, all secret-squirrel and hidden from view (obscured) ๐--filen-private-keystring โ your Private RSA Key โ internal use only, don't go touching this unless you know exactly what you're doing ๐--filen-public-keystring โ your Public RSA Key โ also internal use only, same vibe, hands off bestie ๐ซถ--filen-upload-concurrencyint โ how many chunked uploads can happen at once (default16) ๐--filescom-api-keystring โ the API key that gets you into Files.com ๐--filescom-descriptionstring โ a lil description of the remote, for your own notes ๐--filescom-encodingEncoding โ the encoding for this backend (defaultSlash,BackSlash,Del,Ctl,RightSpace,RightCrLfHtVt,InvalidUtf8,Dot) ๐ค--filescom-passwordstring โ the password that gets you into Files.com, obscured ofc ๐คซ--filescom-sitestring โ your site subdomain (likemysite) or your custom domain (likemyfiles.customdomain.com) ๐--filescom-usernamestring โ the username that gets you into Files.com ๐ค--ftp-allow-insecure-tls-ciphersโ allow insecure TLS ciphers, yes it's giving risky ๐--ftp-ask-passwordโ lets rclone ask you for the FTP password when it needs it ๐--ftp-close-timeoutDuration โ max time to wait for a response to close (default1m0s) โณ--ftp-concurrencyint โ max number of simultaneous FTP connections, or0for unlimited (iykyk, unlimited is a mood) ๐ฅ--ftp-descriptionstring โ a cute description of the remote ๐--ftp-disable-epsvโ stop using EPSV even if the server says it supports it ๐ซ--ftp-disable-mlsdโ stop using MLSD even if the server says it supports it ๐ซ--ftp-disable-tls13โ disable TLS 1.3, aka the workaround for FTP servers rockin' buggy TLS ๐--ftp-disable-utf8โ stop using UTF-8 even if the server says it supports it ๐ซ--ftp-encodingEncoding โ the encoding for this backend (defaultSlash,Del,Ctl,RightSpace,Dot) ๐ค--ftp-explicit-tlsโ use Explicit FTPS, that's FTP over TLS periodt ๐--ftp-force-list-hiddenโ useLIST -ato force listing of hidden files and folders. heads up: this will disable the use of MLSD โ ๏ธ--ftp-hoststring โ the FTP host to connect to ๐ฅ๏ธ--ftp-http-proxystring โ URL for an HTTP CONNECT proxy ๐--ftp-idle-timeoutDuration โ max time before closing idle connections (default1m0s) ๐ด--ftp-no-check-certificateโ do NOT verify the TLS certificate of the server, lowkey risky bestie ๐--ftp-no-check-uploadโ don't check that the upload actually went OK ๐--ftp-passstring โ your FTP password, obscured ofc ๐คซ--ftp-portint โ the FTP port number (default21) ๐ข--ftp-shut-timeoutDuration โ max time to wait for the data connection's closing status (default1m0s) โณ--ftp-socks-proxystring โ Socks 5 proxy host ๐งฆ--ftp-tlsโ use Implicit FTPS, that's FTP over TLS again, different flavor ๐--ftp-tls-cache-sizeint โ size of the TLS session cache for all control and data connections (default32) ๐๏ธ--ftp-userstring โ your FTP username (default"$USER") ๐ค--ftp-writing-mdtmโ use MDTM to set the modification time, aka the VsFtpd quirk ๐ฐ๏ธ--gcs-access-tokenstring โ a short-lived access token ๐๏ธ--gcs-anonymousโ access public buckets and objects with no credentials at all, just vibes ๐ถ๏ธ--gcs-auth-urlstring โ the auth server URL ๐--gcs-bucket-aclstring โ the Access Control List for any new buckets you make ๐--gcs-bucket-policy-onlyโ access checks should use bucket-level IAM policies ๐--gcs-client-credentialsโ use the client credentials OAuth flow ๐--gcs-client-idstring โ your OAuth Client Id ๐ชช--gcs-client-secretstring โ your OAuth Client Secret, keep it secret bestie ๐คซ--gcs-decompressโ if you set this, it will decompress gzip encoded objects ๐ฆ--gcs-descriptionstring โ a lil description of the remote โ๏ธ--gcs-directory-markersโ upload an empty object with a trailing slash whenever a new directory is created ๐--gcs-encodingEncoding โ the encoding for this backend (defaultSlash,CrLf,InvalidUtf8,Dot) ๐ค--gcs-endpointstring โ a custom endpoint for the storage API. leave it blank to just use the provider default ๐ฐ๏ธ--gcs-env-authโ grab your GCP IAM credentials from runtime โ that's environment variables, or instance meta data if there are no env vars ๐ฑ--gcs-locationstring โ the location for the newly created buckets ๐--gcs-no-check-bucketโ if set, don't even attempt to check that the bucket exists or create it ๐ซ--gcs-object-aclstring โ the Access Control List for new objects ๐--gcs-project-numberstring โ your project number ๐ข--gcs-service-account-filestring โ path to your Service Account Credentials JSON file ๐--gcs-storage-classstring โ the storage class to use when storing objects in Google Cloud Storage ๐๏ธ--gcs-tokenstring โ your OAuth Access Token, dropped in as a JSON blob ๐๏ธ--gcs-token-urlstring โ the token server url ๐--gcs-user-projectstring โ your user project ๐ค--gofile-access-tokenstring โ the API Access token ๐๏ธ--gofile-account-idstring โ your Account ID ๐ชช--gofile-descriptionstring โ a description of the remote, cute cute โ๏ธ--gofile-encodingEncoding โ the encoding for this backend (defaultSlash,LtGt,DoubleQuote,Colon,Question,Asterisk,Pipe,BackSlash,Del,Ctl,LeftPeriod,RightPeriod,InvalidUtf8,Dot,Exclamation) ๐ค--gofile-list-chunkint โ how many items to list in each call (default1000) ๐--gofile-root-folder-idstring โ the ID of the root folder ๐--gphotos-auth-urlstring โ the auth server URL ๐--gphotos-batch-modestring โ uploading file batching, one ofsync|async|off(default"sync") ๐ฆ--gphotos-batch-sizeint โ max number of files allowed in an upload batch ๐ข--gphotos-batch-timeoutDuration โ max time to let an idle upload batch sit around before it uploads (default0s) โณ--gphotos-client-credentialsโ use the client credentials OAuth flow ๐--gphotos-client-idstring โ your OAuth Client Id ๐ชช--gphotos-client-secretstring โ your OAuth Client Secret, shhh ๐คซ--gphotos-descriptionstring โ a description of the remote โ๏ธ--gphotos-encodingEncoding โ the encoding for this backend (defaultSlash,CrLf,InvalidUtf8,Dot) ๐ค--gphotos-include-archivedโ also view and download your archived media ๐๏ธ--gphotos-proxystring โ use thegphotosdlproxy for downloading the full resolution images ๐ผ๏ธ--gphotos-read-onlyโ set this to make the Google Photos backend read only ๐--gphotos-read-sizeโ set this to read the size of media items ๐--gphotos-start-yearint โ the year limits the photos to be downloaded to those uploaded after the given year (default2000) ๐--gphotos-tokenstring โ your OAuth Access Token, as a JSON blob ๐๏ธ--gphotos-token-urlstring โ the token server url ๐--hasher-auto-sizeSizeSuffix โ auto-update the checksum for files smaller than this size, disabled by default โจ--hasher-descriptionstring โ a description of the remote โ๏ธ--hasher-hashesCommaSepList โ a comma separated list of the supported checksum types (defaultmd5,sha1) ๐งฎ--hasher-max-ageDuration โ max time to keep checksums hanging out in the cache (0= no cache,off= cache forever) (defaultoff) โณ--hasher-remotestring โ the remote to cache checksums for (e.g.myRemote:path) ๐๏ธ--hdfs-data-transfer-protectionstring โ Kerberos data transfer protection, pick your fighter:authentication|integrity|privacy๐--hdfs-descriptionstring โ a description of the remote โ๏ธ--hdfs-encodingEncoding โ the encoding for this backend (defaultSlash,Colon,Del,Ctl,InvalidUtf8,Dot) ๐ค--hdfs-namenodeCommaSepList โ your Hadoop name nodes and ports ๐--hdfs-service-principal-namestring โ the Kerberos service principal name for the namenode ๐--hdfs-usernamestring โ your Hadoop user name ๐ค--hidrive-auth-urlstring โ the auth server URL ๐--hidrive-chunk-sizeSizeSuffix โ the chunksize for chunked uploads (default48Mi) ๐งฉ--hidrive-client-credentialsโ use the client credentials OAuth flow ๐--hidrive-client-idstring โ your OAuth Client Id ๐ชช--hidrive-client-secretstring โ your OAuth Client Secret, keep it tucked away ๐คซ--hidrive-descriptionstring โ a description of the remote โ๏ธ--hidrive-disable-fetching-member-countโ do not fetch the number of objects in directories unless it's absolutely necessary ๐--hidrive-encodingEncoding โ the encoding for this backend (defaultSlash,Dot) ๐ค--hidrive-endpointstring โ the endpoint for the service (default"https://api.hidrive.strato.com/2.1") ๐ฐ๏ธ
and that's the roundup for this batch bestie, but the flag list keeps unfolding like a lil accordion of power tools, so don't go anywhere ๐
--hidrive-root-prefixstring โ the root/parent folder for all paths, aka where your HiDrive journey starts (default"/") ๐--hidrive-scope-accessstring โ the access permissions rclone should ask HiDrive for when requesting access (default"rw") ๐--hidrive-scope-rolestring โ the user-level rclone should request from HiDrive (default"user") ๐ค--hidrive-tokenstring โ OAuth Access Token, handed over as a JSON blob ๐๏ธ--hidrive-token-urlstring โ Token server url--hidrive-upload-concurrencyint โ concurrency for chunked uploads (default4) ๐--hidrive-upload-cutoffSizeSuffix โ cutoff/threshold for chunked uploads (default96Mi)--http-descriptionstring โ a lil description of the remote ๐ท๏ธ--http-headersCommaSepList โ set HTTP headers for all transactions--http-no-escapeโ do not escape URL metacharacters in path names ๐ซ--http-no-headโ don't use HEAD requests ๐--http-no-slashโ set this if the site doesn't end directories with/--http-urlstring โ URL of the HTTP host to connect to ๐--huaweidrive-auth-urlstring โ Auth server URL--huaweidrive-chunk-sizeSizeSuffix โ upload chunk size (default8Mi)--huaweidrive-client-credentialsโ use the client credentials OAuth flow--huaweidrive-client-idstring โ OAuth Client Id--huaweidrive-client-secretstring โ OAuth Client Secret ๐คซ--huaweidrive-descriptionstring โ a lil description of the remote ๐ท๏ธ--huaweidrive-encodingEncoding โ the encoding for the backend (defaultSlash,LtGt,DoubleQuote,Colon,Question,Asterisk,Pipe,BackSlash,Del,Ctl,LeftSpace,LeftPeriod,LeftTilde,RightSpace,RightPeriod,InvalidUtf8,Dot)--huaweidrive-list-chunkint โ size of listing chunk,1-1000(default1000) ๐--huaweidrive-root-folder-idstring โ ID of the root folder--huaweidrive-tokenstring โ OAuth Access Token, as a JSON blob ๐๏ธ--huaweidrive-token-urlstring โ Token server url--huaweidrive-upload-cutoffSizeSuffix โ cutoff for switching to resumable upload (default20Mi)--iclouddrive-apple-idstring โ your Apple ID ๐--iclouddrive-client-idstring โ Client ID for iCloud API access (default"d39ba9916b7251055b22c7f910e2ea796ee65e98b2ddecea8f5dde8d9d1a815d")--iclouddrive-descriptionstring โ a lil description of the remote ๐ท๏ธ--iclouddrive-encodingEncoding โ the encoding for the backend (defaultSlash,BackSlash,Del,Ctl,InvalidUtf8,Dot)--iclouddrive-passwordstring โ Password (obscured) ๐คซ--iclouddrive-servicestring โ which iCloud service to use (default"drive") โ๏ธ--imagekit-descriptionstring โ a lil description of the remote ๐ท๏ธ--imagekit-encodingEncoding โ the encoding for the backend (defaultSlash,LtGt,DoubleQuote,Dollar,Question,Hash,Percent,BackSlash,Del,Ctl,InvalidUtf8,Dot,SquareBracket)--imagekit-endpointstring โ you can find your ImageKit.io URL endpoint in your [dashboard](https://imagekit.io/dashboard/developer/api-keys) ๐--imagekit-only-signedRestrict unsigned image URLs โ if you've configured Restrict unsigned image URLs in your dashboard settings, set this totrue--imagekit-private-keystring โ you can find your ImageKit.io private key in your [dashboard](https://imagekit.io/dashboard/developer/api-keys) ๐--imagekit-public-keystring โ you can find your ImageKit.io public key in your [dashboard](https://imagekit.io/dashboard/developer/api-keys) ๐--imagekit-upload-tagsstring โ tags to add to the uploaded files, e.g."tag1,tag2"๐ท๏ธ--imagekit-versionsโ include old versions in directory listings ๐ต--internetarchive-access-key-idstring โ IAS3 Access Key--internetarchive-descriptionstring โ a lil description of the remote ๐ท๏ธ--internetarchive-disable-checksumโ don't ask the server to test against the MD5 checksum calculated by rclone (defaulttrue)--internetarchive-encodingEncoding โ the encoding for the backend (defaultSlash,LtGt,CrLf,Del,Ctl,InvalidUtf8,Dot)--internetarchive-endpointstring โ IAS3 Endpoint (default"https://s3.us.archive.org")--internetarchive-front-endpointstring โ host of the InternetArchive Frontend (default"https://archive.org")--internetarchive-item-deriveโ whether to trigger derive on the IA item or not. if set tofalse, the item will not be derived by IA upon upload (defaulttrue)--internetarchive-item-metadatastringArray โ metadata to be set on the IA item; heads up, this is different from file-level metadata that you can set using--metadata-set--internetarchive-secret-access-keystring โ IAS3 Secret Key (password) ๐คซ--internetarchive-wait-archiveDuration โ timeout for waiting for the server's processing tasks (specificallyarchiveandbook_op) to finish (default0s) โณ--internxt-chunk-sizeSizeSuffix โ chunk size for multipart uploads (default30Mi)--internxt-descriptionstring โ a lil description of the remote ๐ท๏ธ--internxt-emailstring โ email of your Internxt account ๐ง--internxt-encodingEncoding โ the encoding for the backend (defaultSlash,BackSlash,CrLf,RightPeriod,InvalidUtf8,Dot)--internxt-passstring โ Password (obscured) ๐คซ--internxt-skip-hash-validationโ skip hash validation when downloading files (defaulttrue)--internxt-upload-concurrencyint โ concurrency for multipart uploads (default4) ๐--internxt-upload-cutoffSizeSuffix โ cutoff for switching to multipart upload (default100Mi)--jottacloud-auth-urlstring โ Auth server URL--jottacloud-client-credentialsโ use the client credentials OAuth flow--jottacloud-client-idstring โ OAuth Client Id--jottacloud-client-secretstring โ OAuth Client Secret ๐คซ--jottacloud-descriptionstring โ a lil description of the remote ๐ท๏ธ--jottacloud-encodingEncoding โ the encoding for the backend (defaultSlash,LtGt,DoubleQuote,Colon,Question,Asterisk,Pipe,Percent,Del,Ctl,InvalidUtf8,Dot)--jottacloud-hard-deleteโ delete files permanently instead of yeeting them into the trash ๐๏ธ--jottacloud-md5-memory-limitSizeSuffix โ files bigger than this get cached on disk to calculate the MD5 if required (default10Mi)--jottacloud-no-versionsโ avoid server side versioning by deleting files and recreating files instead of overwriting them ๐--jottacloud-tokenstring โ OAuth Access Token, as a JSON blob ๐๏ธ--jottacloud-token-urlstring โ Token server url--jottacloud-trashed-onlyโ only show files that are in the trash ๐๏ธ--jottacloud-upload-resume-limitSizeSuffix โ files bigger than this can be resumed if the upload fail's (default10Mi) (yes, that apostrophe is exactly as written, bestie)--koofr-descriptionstring โ a lil description of the remote ๐ท๏ธ--koofr-encodingEncoding โ the encoding for the backend (defaultSlash,BackSlash,Del,Ctl,InvalidUtf8,Dot)--koofr-endpointstring โ the Koofr API endpoint to use--koofr-mountidstring โ mount ID of the mount to use--koofr-passwordstring โ your password for rclone, generate one athttps://app.koofr.net/app/admin/preferences/password(obscured) ๐--koofr-providerstring โ choose your storage provider--koofr-setmtimeโ does the backend support setting modification time (defaulttrue) โฐ--koofr-userstring โ your user name--linkbox-descriptionstring โ a lil description of the remote ๐ท๏ธ--linkbox-emailstring โ email for login ๐ง--linkbox-passwordstring โ password for login (obscured) ๐คซ--linkbox-tokenstring โ token fromhttps://www.linkbox.to/admin/account๐๏ธ--local-case-insensitiveโ force the filesystem to report itself as case insensitive--local-case-sensitiveโ force the filesystem to report itself as case sensitive--local-descriptionstring โ a lil description of the remote ๐ท๏ธ--local-encodingEncoding โ the encoding for the backend (defaultSlash,Dot)--local-fatal-if-no-spaceโ make out-of-space errors fatal during transfers ๐--local-hashesCommaSepList โ comma separated list of supported checksum types--local-linksโ translate symlinks to/from regular files with a.rclonelinkextension for the local backend ๐--local-metadata-restore-special-bitsโ restore the setuid, setgid and sticky bits from metadata--local-no-check-updatedโ don't check to see if the files change during upload ๐--local-no-cloneโ disable reflink cloning for server-side copies--local-no-preallocateโ disable preallocation of disk space for transferred files--local-no-set-modtimeโ disable setting modtime โฐ--local-no-sparseโ disable sparse files for multi-thread downloads--local-nouncโ turns OFF the UNC long-path-name conversion thing on Windows. Windows girlies, this one's for u ๐--local-time-type mtime|atime|btime|ctimeโ picks which kinda time gets handed back (defaultmtime). btwbtime= birth time,ctime= the change-y one, so choose wisely bestie ๐--local-unicode-normalizationโ hits ur paths and filenames with unicode NFC normalization. โจ Cleanup era. โจ--local-zero-size-linksโ assumes theStatsize of links is zero (and just reads them instead). Deprecated, so likeโฆ do not ๐--mailru-auth-url stringโ the auth server URL.--mailru-check-hashโ decides what copy does when a file checksum is mismatched or invalid (defaulttrue). No cap, it's policing ur hashes ๐ต๏ธโ๏ธ--mailru-client-credentialsโ use the client credentials OAuth flow.--mailru-client-id stringโ ur OAuth Client Id.--mailru-client-secret stringโ ur OAuth Client Secret. Keep it secret bestie ๐คซ--mailru-description stringโ a lil description of the remote ๐--mailru-encoding Encodingโ the encoding for the backend (defaultSlash,LtGt,DoubleQuote,Colon,Question,Asterisk,Pipe,BackSlash,Del,Ctl,InvalidUtf8,Dot).--mailru-pass stringโ ur password (obscured) ๐--mailru-speedup-enableโ skips the full upload if there's already another file with the same data hash (defaulttrue). Main character energy: why re-upload when the vibes are already there ๐--mailru-speedup-file-patterns stringโ a comma separated list of file name patterns that are eligible for speedup (put by hash) (default"*.mkv,*.avi,*.mp4,*.mp3,*.zip,*.gz,*.rar,*.pdf").--mailru-speedup-max-disk SizeSuffixโ here u can switch OFF speedup (put by hash) for the big files (default3Gi).--mailru-speedup-max-memory SizeSuffixโ anything bigger than this size always gets hashed on disk instead (default32Mi).--mailru-token stringโ OAuth Access Token, as a JSON blob.--mailru-token-url stringโ the token server url.--mailru-user stringโ ur user name (usually the email) ๐ค
ok next up, MEGA my beloved ๐
--mega-2fa stringโ the 2FA code for ur MEGA account, if u set one up. Two-factor bestie, protect urself ๐--mega-debugโ outputs more debug info from Mega. Spill the tea โ--mega-description stringโ a description of the remote.--mega-encoding Encodingโ the encoding for the backend (defaultSlash,InvalidUtf8,Dot).--mega-hard-deleteโ deletes files permanently instead of yeeting them into the trash. ๐ No undo, bestie. RIP to those files fr fr--mega-pass stringโ password (obscured).--mega-use-httpsโ use HTTPS for transfers. As u should. Secure queen ๐--mega-user stringโ user name.--memory-description stringโ description of the remote.--memory-discardโ if u set this, ALL writes get thrown away and reads will return an error. Like a lil void that eats ur data ๐ญ (fr, only if u know what ur doing)--netstorage-account stringโ sets the NetStorage account name.--netstorage-description stringโ description of the remote.--netstorage-host stringโ the domain + path of the NetStorage host to connect to.--netstorage-protocol stringโ pick between HTTP or HTTPS (default"https"). https girlies rise ๐--netstorage-secret stringโ sets the NetStorage account secret / G2O key for authentication (obscured). ๐ค-x,--one-file-systemโ don't cross filesystem boundaries (unix/macOS only). Staying in ur lane, lowkey iconic ๐ฆ
ONEDRIVE TIME ๐ (she has SO many flags, she's that girl)
--onedrive-access-scopes SpaceSepListโ sets the scopes rclone asks for (defaultFiles.Read Files.ReadWrite Files.Read.All Files.ReadWrite.All Sites.Read.All offline_access).--onedrive-auth-url stringโ auth server URL.--onedrive-av-overrideโ lets u download files the server thinks have a virus. Careful bestie, that's a yikes ๐--onedrive-chunk-size SizeSuffixโ the chunk size for uploading files with โ must be a multiple of 320k (327,680 bytes) (default10Mi). Math is mathing ๐--onedrive-client-credentialsโ use the client credentials OAuth flow.--onedrive-client-id stringโ OAuth Client Id.--onedrive-client-secret stringโ OAuth Client Secret.--onedrive-deltaโ if set, rclone uses delta listing to do recursive listings. Sneaky efficient โจ--onedrive-description stringโ description of the remote.--onedrive-drive-id stringโ the ID of the drive to use.--onedrive-drive-type stringโ the type of the drive (personal | business | documentLibrary).--onedrive-encoding Encodingโ the encoding for the backend (defaultSlash,LtGt,DoubleQuote,Colon,Question,Asterisk,Pipe,BackSlash,Del,Ctl,LeftSpace,LeftTilde,RightSpace,RightPeriod,InvalidUtf8,Dot).--onedrive-expose-onenote-filesโ set this to make OneNote files actually show up in directory listings. Not them hiding from u ๐--onedrive-hard-deleteโ permanently deletes files when u remove them. Gone gone, no trash can ๐--onedrive-hash-type stringโ tells it which hash the backend is using (default"auto"). Let her choose, she's got it ๐--onedrive-link-password stringโ sets the password for links created by thelinkcommand.--onedrive-link-scope stringโ sets the scope of the links created by thelinkcommand (default"anonymous").--onedrive-link-type stringโ sets the type of the links created by thelinkcommand (default"view").--onedrive-list-chunk intโ size of the listing chunk (default1000).--onedrive-metadata-permissions Bitsโ controls whether permissions get read or written in metadata (defaultoff).--onedrive-no-versionsโ removes all versions on modifying operations. History? Don't know her โ๏ธ--onedrive-region stringโ choose the national cloud region for OneDrive (default"global"). ๐--onedrive-root-folder-id stringโ ID of the root folder.--onedrive-server-side-across-configsโ Deprecated: use--server-side-across-configsinstead. She's retired bestie, let her rest ๐ซถ--onedrive-tenant stringโ ID of the service principal's tenant. Also called its directory ID.--onedrive-tenant-url stringโ the tenant URL for non-admin OneDrive access.--onedrive-token stringโ OAuth Access Token as a JSON blob.--onedrive-token-url stringโ token server url.--onedrive-upload-cutoff SizeSuffixโ the cutoff for switching to chunked upload (defaultoff).
and nowโฆ Oracle Object Storage, aka OOS ๐
--oos-attempt-resume-uploadโ if true, it tries to resume a previously started multipart upload for the object. Picking up where she left off ๐ช--oos-chunk-size SizeSuffixโ chunk size to use for uploading (default5Mi).--oos-compartment stringโ specify the compartment OCID, in case u need to list buckets.--oos-config-file stringโ path to the OCI config file (default"~/.oci/config").--oos-config-profile stringโ profile name inside the oci config file (default"Default").--oos-copy-cutoff SizeSuffixโ cutoff for switching to multipart copy (default4.656Gi).--oos-copy-timeout Durationโ timeout for copy (default1m0s).--oos-decompressโ if u set this, it decompresses gzip encoded objects. Unzipping the vibe ๐ซง--oos-description stringโ description of the remote.--oos-disable-checksumโ doesn't store the MD5 checksum with the object metadata. Trust issues, honestly ๐--oos-encoding Encodingโ the encoding for the backend (defaultSlash,InvalidUtf8,Dot).--oos-endpoint stringโ endpoint for the Object storage API.--oos-leave-parts-on-errorโ if true, it avoids calling abort upload on a failure, leaving all the successfully uploaded parts there for u to manually recover. Messy but recoverable ๐--oos-max-upload-parts intโ max number of parts in a multipart upload (default10000).--oos-namespace stringโ object storage namespace.--oos-no-check-bucketโ if set, it won't bother checking if the bucket exists or creating it. Straight to business ๐--oos-provider stringโ choose ur Auth Provider (default"env_auth").--oos-region stringโ object storage Region.--oos-sse-customer-algorithm stringโ if u use SSE-C, this is the optional header that specifies"AES256"as the encryption algorithm.--oos-sse-customer-key stringโ to use SSE-C, the optional header that specifies the base64-encoded 256-bit encryption key to use to--oos-sse-customer-key-file stringโ to use SSE-C, a file containing the base64-encoded string of the AES-256 encryption key associated--oos-sse-customer-key-sha256 stringโ if using SSE-C, the optional header that specifies the base64-encoded SHA256 hash of the encryption--oos-sse-kms-key-id stringโ if u use ur own master key in vault, this header specifies the--oos-storage-tier stringโ the storage class to use when storing new objects in storage. https://docs.oracle.com/en-us/iaas/Content/Object/Concepts/understandingstoragetiers.htm (default"Standard").--oos-upload-concurrency intโ concurrency for multipart uploads (default10).--oos-upload-cutoff SizeSuffixโ cutoff for switching to chunked upload (default200Mi).
last lil group for this part, OpenDrive bestie ๐
--opendrive-access stringโ files and folders get uploaded with this access permission (defaultprivate) (default"private").--opendrive-chunk-size SizeSuffixโ files get uploaded in chunks of this size (default10Mi).--opendrive-description stringโ a lil free-text blurb for this remote, just so future you knows what it is ๐--opendrive-encoding Encodingโ the encoding for the backend, defaulting toSlash,LtGt,DoubleQuote,Colon,Question,Asterisk,Pipe,BackSlash,LeftSpace,LeftCrLfHtVt,RightSpace,RightCrLfHtVt,InvalidUtf8,Dotโจ--opendrive-password stringโ password, and yes it's obscured ๐--opendrive-username stringโ username, bestie--pcloud-auth-url stringโ the auth server URL--pcloud-client-credentialsโ use the client credentials OAuth flow--pcloud-client-id stringโ OAuth Client Id--pcloud-client-secret stringโ OAuth Client Secret--pcloud-description stringโ description of the remote ๐--pcloud-encoding Encodingโ the encoding for the backend (defaultSlash,BackSlash,Del,Ctl,InvalidUtf8,Dot)--pcloud-hostname stringโ the hostname to connect to (default"api.pcloud.com")--pcloud-password stringโ your pcloud password, obscured ๐ซฃ--pcloud-root-folder-id stringโ fill this in if you want rclone to start somewhere other than the root folder (default"d0")--pcloud-token stringโ OAuth Access Token, handed over as a JSON blob--pcloud-token-url stringโ token server url--pcloud-username stringโ your pcloud username--pikpak-chunk-size SizeSuffixโ chunk size for multipart uploads (default5Mi)--pikpak-description stringโ description of the remote ๐ธ--pikpak-device-id stringโ the Device ID used for authorization--pikpak-encoding Encodingโ the encoding for the backend (defaultSlash,LtGt,DoubleQuote,Colon,Question,Asterisk,Pipe,BackSlash,Ctl,LeftSpace,RightSpace,RightPeriod,InvalidUtf8,Dot) โ yes that's a whole mouthful, no cap--pikpak-hash-memory-limit SizeSuffixโ files bigger than this get cached on disk so the hash can be calculated if it's needed (default10Mi)--pikpak-no-media-linkโ use the original file links instead of media links ๐--pikpak-pass stringโ Pikpak password, obscured--pikpak-root-folder-id stringโ the ID of the root folder--pikpak-trashed-onlyโ only show the files chilling in the trash ๐๏ธ--pikpak-upload-concurrency intโ concurrency for multipart uploads (default4)--pikpak-upload-cutoff SizeSuffixโ the cutoff for switching over to chunked upload (default200Mi)--pikpak-use-trashโ send files to the trash instead of deleting them forever (defaulttrue) โ much safer vibe honestly--pikpak-user stringโ Pikpak username--pikpak-user-agent stringโ HTTP user agent for pikpak (default"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:129.0) Gecko/20100101 Firefox/129.0") โ she's cosplaying Firefox, iconic--pixeldrain-api-key stringโ the API key for your pixeldrain account--pixeldrain-api-url stringโ the API endpoint to connect to; in the vast majority of cases it's totally fine to leave this alone (default"https://pixeldrain.com/api")--pixeldrain-description stringโ description of the remote ๐--pixeldrain-root-folder-id stringโ the root of the filesystem to use (default"me")--premiumizeme-auth-url stringโ auth server URL--premiumizeme-client-credentialsโ use the client credentials OAuth flow--premiumizeme-client-id stringโ OAuth Client Id--premiumizeme-client-secret stringโ OAuth Client Secret--premiumizeme-description stringโ description of the remote--premiumizeme-encoding Encodingโ the encoding for the backend (defaultSlash,DoubleQuote,BackSlash,Del,Ctl,InvalidUtf8,Dot)--premiumizeme-token stringโ OAuth Access Token as a JSON blob--premiumizeme-token-url stringโ token server url--protondrive-2fa stringโ the 2FA code ๐--protondrive-app-version stringโ the app version string--protondrive-description stringโ description of the remote--protondrive-enable-cachingโ caches the files and folders metadata so it makes fewer API calls (defaulttrue) ๐ง--protondrive-encoding Encodingโ the encoding for the backend (defaultSlash,LeftSpace,RightSpace,InvalidUtf8,Dot)--protondrive-mailbox-password stringโ the mailbox password of your two-password proton account, obscured--protondrive-original-file-sizeโ return the file size as it was before encryption (defaulttrue)--protondrive-otp-secret-key stringโ the OTP secret key, obscured ๐คซ--protondrive-password stringโ the password of your proton account, obscured--protondrive-replace-existing-draftโ create a new revision when a filename conflict gets detected--protondrive-username stringโ the username of your proton account--putio-auth-url stringโ auth server URL--putio-client-credentialsโ use the client credentials OAuth flow--putio-client-id stringโ OAuth Client Id--putio-client-secret stringโ OAuth Client Secret--putio-description stringโ description of the remote--putio-encoding Encodingโ the encoding for the backend (defaultSlash,BackSlash,Del,Ctl,InvalidUtf8,Dot)--putio-token stringโ OAuth Access Token as a JSON blob--putio-token-url stringโ token server url--qingstor-access-key-id stringโ QingStor Access Key ID--qingstor-chunk-size SizeSuffixโ chunk size to use for uploading (default4Mi)--qingstor-connection-retries intโ number of connection retries (default3)--qingstor-description stringโ description of the remote--qingstor-encoding Encodingโ the encoding for the backend (defaultSlash,Ctl,InvalidUtf8)--qingstor-endpoint stringโ enter an endpoint URL to connect to the QingStor API--qingstor-env-authโ get QingStor credentials from runtime--qingstor-secret-access-key stringโ QingStor Secret Access Key (password) ๐--qingstor-upload-concurrency intโ concurrency for multipart uploads (default1)--qingstor-upload-cutoff SizeSuffixโ cutoff for switching to chunked upload (default200Mi)--qingstor-zone stringโ the zone to connect to--quatrix-api-key stringโ API key for accessing your Quatrix account--quatrix-description stringโ description of the remote--quatrix-effective-upload-time stringโ wanted upload time for one chunk (default"4s") โฑ๏ธ--quatrix-encoding Encodingโ the encoding for the backend (defaultSlash,BackSlash,Del,Ctl,InvalidUtf8,Dot)--quatrix-hard-deleteโ delete files permanently instead of putting them in the trash ๐ โ no undo, bestie, be so serious--quatrix-host stringโ the host name of your Quatrix account--quatrix-maximal-summary-chunk-size SizeSuffixโ the maximal summary for all chunks; it should not be less than'transfers'*'minimal_chunk_size'(default95.367Mi)--quatrix-minimal-chunk-size SizeSuffixโ the minimal size for one chunk (default9.537Mi)--quatrix-skip-project-foldersโ skip project folders in operations ๐--s3-access-key-id stringโ AWS Access Key ID--s3-acl stringโ the canned ACL used when creating buckets and storing or copying objects--s3-bucket-acl stringโ the canned ACL used when creating buckets--s3-bucket-object-lock-enabledโ enable Object Lock when creating new buckets ๐--s3-bypass-governance-retentionโ allow deleting or modifying objects that are locked with GOVERNANCE mode โ ๏ธ โ this one is a big deal, fr fr, governance locks exist for a reason--s3-chunk-size SizeSuffixโ chunk size to use for uploading (default5Mi)--s3-copy-cutoff SizeSuffixโ cutoff for switching to multipart copy (default4.656Gi)--s3-decompressโ if set, this will decompress gzip encoded objects--s3-description stringโ description of the remote โจ--s3-directory-bucketโ set this to use AWS Directory Buckets--s3-directory-markersโ upload an empty object with a trailing slash when a new directory gets created--s3-disable-checksumโ don't store the MD5 checksum with the object metadata--s3-disable-http2โ disable usage of http2 for S3 backends--s3-download-url stringโ custom endpoint for downloads--s3-encoding Encodingโ the encoding for the backend (defaultSlash,InvalidUtf8,Dot)--s3-endpoint stringโ endpoint for the S3 API--s3-env-authโ get AWS credentials from runtime (environment variables, or EC2/ECS meta data if there are no env vars)--s3-force-path-styleโ if true use path style access, if false use virtual hosted style (defaulttrue)--s3-ibm-api-key stringโ IBM API Key to be used to obtain an IAM token ๐--s3-ibm-iam-endpoint stringโ the IBM IAM Endpoint ur supposed to auth against ๐--s3-ibm-resource-instance-id stringโ ur IBM service instance id, bestie--s3-leave-parts-on-errorโ if true, rclone will NOT call abort upload when something dies ๐ญ so every part that did make it up stays on S3 for u to recover by hand. it's giving "i'll deal with it later", but for real--s3-list-chunk intโ how big each listing chunk is, aka the response list for every singleListObjectS3 request (default1000)--s3-list-url-encode Tristateโ do we url encode listings or nah:true/false/unset(defaultunset)--s3-list-version intโ which version of theListObjectsAPI to use:1,2, or0for auto โจ--s3-list-versions-oldest-first Tristateโ flip this on if ur backend hands back object versions oldest first (defaultunset)--s3-location-constraint stringโ the location constraint, and lowkey it must be set to match the Region ๐ซถ--s3-max-upload-parts intโ max number of parts in a multipart upload (default10000)--s3-might-gzip Tristateโ set this if the backend might gzip objects (defaultunset)--s3-no-check-bucketโ if set, pls do not attempt to check the bucket exists, and don't create it either ๐--s3-no-headโ skips the HEAD on uploaded objects, so no integrity check. ur choice, queen--s3-no-head-objectโ if set, no HEAD before GET when getting objects--s3-no-system-metadataโ suppress the setting and reading of system metadata entirely--s3-object-lock-legal-hold-status stringโ Object Lock legal hold status to apply when uploading or copying objects ๐--s3-object-lock-mode stringโ Object Lock mode to apply when uploading or copying objects--s3-object-lock-retain-until-date stringโ Object Lock retention until date to apply when uploading or copying objects--s3-object-lock-set-after-uploadโ sets Object Lock with separate API calls after the upload, vv extra but ok--s3-object-lock-supported Tristateโ does ur provider even support S3 Object Lock (defaultunset)--s3-profile stringโ the profile to use in the shared credentials file--s3-provider stringโ choose ur S3 provider, main character decision fr--s3-region stringโ region to connect to--s3-requester-paysโ turns on the requester pays option when interacting with an S3 bucket ๐ธ--s3-role-arn stringโ the ARN of the IAM role to assume--s3-role-external-id stringโ external ID for that assumed role--s3-role-session-duration stringโ session duration for the assumed role--s3-role-session-name stringโ session name for the assumed role--s3-sdk-log-mode Bitsโ set this to debug the SDK (defaultOff) ๐--s3-secret-access-key stringโ ur AWS Secret Access Key, aka the password. guard it with ur life ๐--s3-server-side-encryption stringโ the server-side encryption algorithm used when storing this object in S3--s3-session-token stringโ an AWS session token--s3-shared-credentials-file stringโ path to the shared credentials file--s3-sign-accept-encoding Tristateโ set if rclone should includeAccept-Encodingas part of the signature (defaultunset)--s3-sse-customer-algorithm stringโ if ur using SSE-C, this is the server-side encryption algorithm used when storing this object in S3--s3-sse-customer-key stringโ to use SSE-C u may hand over the secret encryption key used to encrypt/decrypt ur data ๐--s3-sse-customer-key-base64 stringโ if ur using SSE-C u must provide the secret encryption key encoded in base64 format to encrypt/decrypt ur data--s3-sse-customer-key-md5 stringโ if ur using SSE-C u may optionally provide the secret encryption key MD5 checksum (optional)--s3-sse-kms-key-id stringโ if ur using KMS ID u must provide the ARN of the Key--s3-storage-class stringโ the storage class to use when storing new objects in S3--s3-upload-concurrency intโ concurrency for multipart uploads and copies (default4)--s3-upload-cutoff SizeSuffixโ the cutoff for switching to chunked upload (default200Mi)--s3-use-accelerate-endpointโ if true, use the AWS S3 accelerated endpoint ๐๏ธ--s3-use-accept-encoding-gzip Accept-Encoding: gzipโ whether to send theAccept-Encoding: gzipheader (defaultunset)--s3-use-already-exists Tristateโ set if rclone should reportBucketAlreadyExistserrors when it creates a bucket (defaultunset)--s3-use-arn-regionโ if true, enables arn region support for the service--s3-use-data-integrity-protections Tristateโ if true, use AWS S3 data integrity protections (defaultunset)--s3-use-dual-stackโ if true, use the AWS S3 dual-stack endpoint (IPv6 support, slay) ๐--s3-use-multipart-etag Tristateโ whether to use ETag in multipart uploads for verification (defaultunset)--s3-use-multipart-uploads Tristateโ set if rclone should use multipart uploads (defaultunset)--s3-use-presigned-requestโ whether to use a presigned request orPutObjectfor single part uploads--s3-use-unsigned-payload Tristateโ whether to use an unsigned payload inPutObject(defaultunset)--s3-use-x-id Tristateโ set if rclone should addx-idURL parameters (defaultunset)--s3-v2-authโ if true, use v2 authentication--s3-version-at Timeโ show file versions as they were at the specified time (defaultoff) โฐ--s3-version-deletedโ show deleted file markers when using versions ๐ชฆ--s3-versionsโ include old versions in directory listings
okay and that's the S3 saga wrapped, ur officially an S3 girlie ๐ โจ
now moving onto the seafile girlies ๐
--seafile-2faโ two-factor authentication, set it to'true'if the account has 2FA enabled ๐--seafile-create-libraryโ should rclone create a library if it doesn't exist--seafile-description stringโ description of the remote--seafile-encoding Encodingโ the encoding for the backend (defaultSlash,DoubleQuote,BackSlash,Ctl,InvalidUtf8,Dot)--seafile-library stringโ name of the library--seafile-library-key stringโ library password, for encrypted libraries only (obscured) ๐--seafile-pass stringโ password (obscured)--seafile-url stringโ URL of the seafile host to connect to--seafile-user stringโ user name, usually ur email address ๐ง
and finally, SFTP, the classic. sit down bestie, this one's long ๐ฆ
--sftp-ask-passwordโ allow asking for the SFTP password when it's needed--sftp-blake3sum-command stringโ the command used to read BLAKE3 hashes--sftp-chunk-size SizeSuffixโ upload and download chunk size (default32Ki)--sftp-ciphers SpaceSepListโ a space separated list of ciphers used for session encryption, ordered by preference--sftp-concurrency intโ the maximum number of outstanding requests for one file (default64)--sftp-connections intโ max number of SFTP simultaneous connections,0for unlimited--sftp-copy-is-hardlinkโ set this to enable server side copies using hardlinks ๐--sftp-crc32sum-command stringโ the command used to read CRC-32 hashes--sftp-description stringโ description of the remote--sftp-disable-concurrent-readsโ if set, don't use concurrent reads--sftp-disable-concurrent-writesโ if set, don't use concurrent writes--sftp-disable-hashcheckโ disables running SSH commands to figure out whether remote file hashing is even available--sftp-encoding Encodingโ the encoding for the backend (defaultSlash,Del,Ctl,Dot)--sftp-hashes CommaSepListโ a comma separated list of supported checksum types--sftp-host stringโ SSH host to connect to--sftp-host-key-algorithms SpaceSepListโ space separated list of host key algorithms, ordered by preference--sftp-host-keys CommaSepListโ pinned host keys for this remote, used to verify the server ๐--sftp-http-proxy stringโ URL for the HTTP CONNECT proxy--sftp-idle-timeout Durationโ max time before idle connections get closed (default1m0s)--sftp-key-exchange SpaceSepListโ space separated list of key exchange algorithms, ordered by preference--sftp-key-file stringโ path to the PEM-encoded private key file--sftp-key-file-pass stringโ the passphrase to decrypt that PEM-encoded private key file (obscured) ๐คซ--sftp-key-pem stringโ raw PEM-encoded private key, straight up--sftp-key-use-agentโ when set, it forces the usage of the SSH agent--sftp-known-hosts-file stringโ optional path to aknown_hostsfile--sftp-macs SpaceSepListโ space separated list of MACs (message authentication code) algorithms, ordered by preference--sftp-md5sum-command stringโ the command used to read MD5 hashes--sftp-pass stringโ SSH password, leave it blank to use the SSH agent instead (obscured)
Okay bestie, buckle up, this is the backend flag era and we're going โจmethodicallyโจ ๐
๐ฆ SFTP says hi ๐ฆ
--sftp-path-overridestring โ overrides the path that gets used by SSH shell commands ๐ ๏ธ--sftp-pin-host-keyโ pins the server's host key on first connection, aka Trust On First Use ๐--sftp-portint โ SSH port number (default22)--sftp-pubkeystring โ SSH public certificate, for public-certificate-based auth ๐--sftp-pubkey-filestring โ optional path to your public key file--sftp-server-commandstring โ tells rclone the path or command to run a sftp server on the remote host--sftp-set-envSpaceSepList โ environment variables to pass to sftp and commands ๐ฑ--sftp-set-modtimeโ set the modified time on the remote if it's set (defaulttrue)--sftp-sha1sum-commandstring โ the command used to read SHA-1 hashes--sftp-sha256sum-commandstring โ the command used to read SHA-256 hashes--sftp-shell-typestring โ the type of SSH shell on the remote server, if any--sftp-skip-linksโ set it to skip any symlinks and any other non-regular files ๐--sftp-socks-proxystring โ Socks 5 proxy host--sftp-sshSpaceSepList โ path and arguments to an external ssh binary--sftp-subsystemstring โ specifies the SSH2 subsystem on the remote host (default"sftp")--sftp-use-fstatโ if set, usefstatinstead ofstat๐--sftp-use-insecure-cipherโ enables the use of insecure ciphers and key exchange methods
bestie, that flag has "insecure" right in the name for a reason, so don't be casual with it ๐
--sftp-userstring โ SSH username (default"$USER")--sftp-xxh128sum-commandstring โ the command used to read XXH128 hashes--sftp-xxh3sum-commandstring โ the command used to read XXH3 hashes
๐ Shade era ๐
--shade-api-keystring โ an API key for your account--shade-chunk-sizeSizeSuffix โ chunk size to use for uploading (default64Mi)--shade-descriptionstring โ description of the remote ๐--shade-drive-idstring โ the ID of your drive, you can see it in the drive settings. Individual rclone configs must be made per drive ๐--shade-encodingEncoding โ the encoding for the backend (defaultSlash,BackSlash,Del,Ctl,InvalidUtf8,Dot)--shade-endpointstring โ endpoint for the service--shade-max-upload-partsint โ maximum amount of parts in a multipart upload (default10000)--shade-tokenstring โ JWT Token for performing Shade FS operations. Don't set this value โ rclone will set it automatically, fr fr--shade-token-expirystring โ JWT Token Expiration time. Don't set this value โ rclone will set it automatically, same deal ๐ซ--shade-upload-concurrencyint โ concurrency for multipart uploads and copies. This is the number of chunks of the same file that are uploaded concurrently for multipart uploads and copies (default4)
๐ Sharefile, iconic ๐
--sharefile-auth-urlstring โ auth server URL--sharefile-chunk-sizeSizeSuffix โ upload chunk size (default64Mi)--sharefile-client-credentialsโ use client credentials OAuth flow ๐--sharefile-client-idstring โ OAuth Client Id--sharefile-client-secretstring โ OAuth Client Secret ๐คซ--sharefile-descriptionstring โ description of the remote--sharefile-encodingEncoding โ the encoding for the backend (defaultSlash,LtGt,DoubleQuote,Colon,Question,Asterisk,Pipe,BackSlash,Ctl,LeftSpace,LeftPeriod,RightSpace,RightPeriod,InvalidUtf8,Dot)--sharefile-endpointstring โ endpoint for API calls--sharefile-root-folder-idstring โ ID of the root folder ๐--sharefile-tokenstring โ OAuth Access Token as a JSON blob--sharefile-token-urlstring โ token server url--sharefile-upload-cutoffSizeSuffix โ cutoff for switching to multipart upload (default128Mi)
๐ Sia, the decentralized one ๐
--sia-api-passwordstring โ Sia Daemon API Password (obscured) ๐--sia-api-urlstring โ Sia daemon API URL, likehttp://sia.daemon.host:9980(default"http://127.0.0.1:9980")--sia-descriptionstring โ description of the remote--sia-encodingEncoding โ the encoding for the backend (defaultSlash,Question,Hash,Percent,Del,Ctl,InvalidUtf8,Dot)--sia-user-agentstring โ Siad User Agent (default"Sia-Agent")
๐ง Global-ish skipping โจ
--skip-linksโ don't warn about skipped symlinks ๐ค--skip-specialsโ don't warn about skipped pipes, sockets and device objects
๐ SMB, corporate but make it cute ๐
--smb-case-insensitiveโ whether the server is configured to be case-insensitive (defaulttrue)--smb-descriptionstring โ description of the remote--smb-domainstring โ domain name for NTLM authentication (default"WORKGROUP")--smb-encodingEncoding โ the encoding for the backend (defaultSlash,LtGt,DoubleQuote,Colon,Question,Asterisk,Pipe,BackSlash,Ctl,RightSpace,RightPeriod,InvalidUtf8,Dot)--smb-hide-special-shareโ hide special shares (e.g.print$) which users aren't supposed to access (defaulttrue) ๐--smb-hoststring โ SMB server hostname to connect to--smb-idle-timeoutDuration โ max time before closing idle connections (default1m0s) ๐ค--smb-kerberos-ccachestring โ path to the Kerberos credential cache (krb5cc)--smb-passstring โ SMB password (obscured) ๐--smb-portint โ SMB port number (default445)--smb-spnstring โ service principal name--smb-use-kerberosโ use Kerberos authentication ๐ซ--smb-userstring โ SMB username
๐ Storj, decentralized again but different ๐
--storj-access-grantstring โ access grant--storj-api-keystring โ API key--storj-descriptionstring โ description of the remote--storj-passphrasestring โ encryption passphrase ๐--storj-providerstring โ choose an authentication method (default"existing")--storj-satellite-addressstring โ satellite address (default"us1.storj.io") ๐ฐ๏ธ
๐ธ Sugarsync, sweet name ๐ธ
--sugarsync-access-key-idstring โ Sugarsync Access Key ID--sugarsync-app-idstring โ Sugarsync App ID--sugarsync-authorizationstring โ Sugarsync authorization--sugarsync-authorization-expirystring โ Sugarsync authorization expiry โฐ--sugarsync-deleted-idstring โ Sugarsync deleted folder id--sugarsync-descriptionstring โ description of the remote--sugarsync-encodingEncoding โ the encoding for the backend (defaultSlash,Ctl,InvalidUtf8,Dot)--sugarsync-hard-deleteโ permanently delete files if true โ ๏ธ
"permanently" is doing a lot of heavy lifting in that sentence, bestie. No undo button, no recycle bin, just vibes and regret ๐
--sugarsync-private-access-keystring โ Sugarsync Private Access Key ๐--sugarsync-refresh-tokenstring โ Sugarsync refresh token--sugarsync-root-idstring โ Sugarsync root id--sugarsync-userstring โ Sugarsync user
๐ Swift, the OpenStack main character ๐
--swift-application-credential-idstring โ Application Credential ID (OS_APPLICATION_CREDENTIAL_ID)--swift-application-credential-namestring โ Application Credential Name (OS_APPLICATION_CREDENTIAL_NAME)--swift-application-credential-secretstring โ Application Credential Secret (OS_APPLICATION_CREDENTIAL_SECRET)--swift-authstring โ authentication URL for server (OS_AUTH_URL)--swift-auth-tokenstring โ Auth Token from alternate authentication โ optional (OS_AUTH_TOKEN)--swift-auth-versionint โ AuthVersion โ optional โ set to (1,2,3) if your auth URL has no version (ST_AUTH_VERSION)--swift-chunk-sizeSizeSuffix โ above this size files will be chunked (default5Gi)--swift-descriptionstring โ description of the remote--swift-domainstring โ user domain โ optional (v3 auth) (OS_USER_DOMAIN_NAME)--swift-encodingEncoding โ the encoding for the backend (defaultSlash,InvalidUtf8)--swift-endpoint-typestring โ endpoint type to choose from the service catalogue (OS_ENDPOINT_TYPE) (default"public")--swift-env-authโ get swift credentials from environment variables in standard OpenStack form ๐ฑ--swift-fetch-until-empty-pageโ when paginating, always fetch unless we received an empty page--swift-keystring โ API key or password (OS_PASSWORD) ๐--swift-leave-parts-on-errorโ if true, avoid calling abort upload on a failure--swift-no-chunkโ don't chunk files during streaming upload--swift-no-large-objectsโ disable support for static and dynamic large objects--swift-partial-page-fetch-thresholdint โ when paginating, fetch if the current page is within this percentage of the limit
--swift-regionstring โ the region name, optional bestie (OS_REGION_NAME).--swift-storage-policystring โ the storage policy to use when creating a new container.--swift-storage-urlstring โ storage URL, optional (OS_STORAGE_URL).--swift-tenantstring โ tenant name, optional for v1 auth, otherwise you need this ortenant_id(OS_TENANT_NAMEorOS_PROJECT_NAME).--swift-tenant-domainstring โ tenant domain, optional (v3 auth) (OS_PROJECT_DOMAIN_NAME).--swift-tenant-idstring โ tenant ID, optional for v1 auth, this ortenantrequired otherwise (OS_TENANT_ID).--swift-use-segments-containerTristate โ choose destination for large object segments (default unset).--swift-userstring โ user name to log in (OS_USERNAME).--swift-user-idstring โ user ID to log in, optional, and ngl most swift systems just use user and leave this blank (v3 auth) (OS_USER_ID).- <coral>
--ulozto-app-token</coral> string โ the application token identifying the app. An app API key can be either found in the API - <coral>
--ulozto-description</coral> string โ description of the remote. - <coral>
--ulozto-encoding</coral> Encoding โ the encoding for the backend (defaultSlash,BackSlash,Del,Ctl,InvalidUtf8,Dot). - <coral>
--ulozto-list-page-size</coral> int โ the size of a single page for list commands. 1-500 (default 500). - <coral>
--ulozto-password</coral> string โ the password for the user (obscured). - <coral>
--ulozto-root-folder-slug</coral> string โ if set, rclone will use this folder as the root folder for all operations. For example, - <coral>
--ulozto-username</coral> string โ the username of the principal to operate as. --union-action-policystring โ policy to choose upstream on ACTION category (default"epall").--union-cache-timeint โ cache time of usage and free space, in seconds (default 120).--union-create-policystring โ policy to choose upstream on CREATE category (default"epmfs").--union-descriptionstring โ description of the remote.--union-min-free-spaceSizeSuffix โ minimum viable free space for lfs/eplfs policies (default1Gi).--union-search-policystring โ policy to choose upstream on SEARCH category (default"ff").--union-upstreamsstring โ list of space separated upstreams.--webdav-auth-redirectโ preserve authentication on redirect.--webdav-bearer-tokenstring โ bearer token instead of user/pass (e.g. a Macaroon).--webdav-bearer-token-commandstring โ command to run to get a bearer token.--webdav-descriptionstring โ description of the remote.--webdav-encodingstring โ the encoding for the backend.--webdav-headersCommaSepList โ set HTTP headers for all transactions.--webdav-nextcloud-chunk-sizeSizeSuffix โ Nextcloud upload chunk size (default10Mi).--webdav-owncloud-exclude-mountsโ exclude ownCloud mounted storages.--webdav-owncloud-exclude-sharesโ exclude ownCloud shares.--webdav-pacer-min-sleepDuration โ minimum time to sleep between API calls (default10ms).--webdav-passstring โ password (obscured).--webdav-unix-socketstring โ path to a unix domain socket to dial to, instead of opening a TCP connection directly.--webdav-urlstring โ URL of http host to connect to.--webdav-userstring โ user name.--webdav-vendorstring โ name of the WebDAV site/service/software you are using. iykyk which one you've got.--yandex-auth-urlstring โ auth server URL.--yandex-client-credentialsโ use client credentials OAuth flow.--yandex-client-idstring โ OAuth Client Id.--yandex-client-secretstring โ OAuth Client Secret.--yandex-descriptionstring โ description of the remote.--yandex-encodingEncoding โ the encoding for the backend (defaultSlash,Del,Ctl,InvalidUtf8,Dot).--yandex-hard-deleteโ delete files permanently rather than putting them into the trash. no undo bestie, be so serious.--yandex-spoof-uaโ set the user agent to match an official version of the yandex disk client. May help with upload performance (default true).--yandex-tokenstring โ OAuth Access Token as a JSON blob.--yandex-token-urlstring โ token server url.--yandex-upload-waitDuration โ wait this long after an upload before setting the modification time (default0s).--zoho-auth-urlstring โ auth server URL.--zoho-client-credentialsโ use client credentials OAuth flow.--zoho-client-idstring โ OAuth Client Id.--zoho-client-secretstring โ OAuth Client Secret.--zoho-descriptionstring โ description of the remote.--zoho-encodingEncoding โ the encoding for the backend (defaultDel,Ctl,InvalidUtf8).--zoho-list-folder-burstint โ same-folder listings allowed back-to-back before--zoho-list-folder-limitpaces them (default 6).--zoho-list-folder-limitint โ max listings of the SAME folder allowed per--zoho-list-folder-window(default 19).--zoho-list-folder-windowDuration โ the window for--zoho-list-folder-limit(default1m0s).--zoho-regionstring โ Zoho region to connect to.--zoho-root-folder-idstring โ ID of the root folder.--zoho-tokenstring โ OAuth Access Token as a JSON blob.--zoho-token-urlstring โ token server url.--zoho-tpslimitfloat โ max number of API transactions per second (default 6).--zoho-tpslimit-burstint โ number of API calls to allow back-to-back without sleeping, for--zoho-tpslimit(default 1).--zoho-upload-cutoffSizeSuffix โ cutoff for switching to large file upload api (>= 10 MiB) (default10Mi).
๐ณ Docker Volume Plugin ๐ณ
โจ Introduction โจ
okay so history lesson but make it cute. Docker 1.9 added support for creating named volumes (https://docs.docker.com/storage/volumes/) through the command-line interface (https://docs.docker.com/engine/reference/commandline/volume_create/), and mounting them in containers, as a way to share data between them. Then since Docker 1.10 you can create named volumes with Docker Compose (https://docs.docker.com/compose/) โ you just describe them in docker-compose.yml files (https://docs.docker.com/compose/compose-file/compose-file-v2/#volume-configuration-reference) for use by container groups on a single host. And as of Docker 1.12, volumes are supported by Docker Swarm (https://docs.docker.com/engine/swarm/key-concepts/) included with Docker Engine, created from descriptions in swarm compose v3 files (https://docs.docker.com/compose/compose-file/compose-file-v3/#volume-configuration-reference) for use with swarm stacks across multiple cluster nodes. the way docker kept levelling up ๐ญ
Docker Volume Plugins (https://docs.docker.com/engine/extend/plugins_volume/) augment the default local volume driver baked into Docker with stateful volumes shared across containers and hosts. And here's the part that eats: unlike local volumes, your data will not be deleted when such a volume is removed. periodt, the data stays.
Plugins can run managed by the docker daemon, as a native system service (under systemd, sysv or upstart) or as a standalone executable. Rclone can run as docker volume plugin in all these modes. It interacts with the local docker daemon via plugin API (https://docs.docker.com/engine/extend/plugin_api/) and handles mounting of remote file systems into docker containers, so it must run on the same host as the docker daemon or on every Swarm node. no shortcuts bestie, that's the vibe check.
๐ธ Getting started ๐ธ
In the first example we will use the SFTP (https://rclone.org/sftp/) rclone volume with Docker engine on a standalone Ubuntu machine. iconic starting point tbh.
Start from installing Docker (https://docs.docker.com/engine/install/) on the host.
The FUSE driver is a prerequisite for rclone mounting and should be installed on host:
sudo apt-get -y install fuse3
Create two directories required by rclone docker plugin:
sudo mkdir -p /var/lib/docker-plugins/rclone/config
sudo mkdir -p /var/lib/docker-plugins/rclone/cache
Install the managed rclone docker plugin for your architecture (here amd64):
docker plugin install rclone/docker-volume-rclone:amd64 args="-v" --alias rclone --grant-all-permissions
docker plugin list
Create your SFTP volume (https://rclone.org/sftp/#standard-options):
docker volume create firstvolume -d rclone -o type=sftp -o sftp-host=_hostname_ -o sftp-user=_username_ -o sftp-pass=_password_ -o allow-other=true
Note that since all options are static, you don't even have to runrclone configor create therclone.conffile (but the config directory should still be present). ๐
In the simplest case you can use localhost as hostname and your SSH credentials as username and password. You can also change the remote path to your home directory on the host, for example -o path=/home/username. like, that's it, that's the whole flex.
Time to create a test container and mount the volume into it:
docker run --rm -it -v firstvolume:/mnt --workdir /mnt ubuntu:latest bash
If all goes well, you will enter the new container and change right to the mounted SFTP remote. You can type ls to list the mounted directory or otherwise play with it. Type exit when you are done. The container will stop but the volume will stay, ready to be reused. When it's not needed anymore, remove it:
docker volume list
docker volume remove firstvolume
Okay so now we're doing something โจspicyโจ โ a Google Drive volume on a multi-node Docker Swarm. ๐
You should start from installing Docker and FUSE, creating plugin directories and installing rclone plugin on every single swarm node. Then setup the Swarm โ the deets are at https://docs.docker.com/engine/swarm/swarm-mode/.
Google Drive volumes need an access token, which can be setup via web browser and will be periodically renewed by rclone. The managed plugin cannot run a browser (it's giving no-GUI energy ๐ญ) so we will use a technique similar to the rclone setup on a headless box โ link in bio: https://rclone.org/remote_setup/.
Run rclone config (that's https://rclone.org/commands/rclone_config_create/) on another machine equipped with web browser and graphical user interface. Create the Google Drive remote (standard options guide: https://rclone.org/drive/#standard-options). When done, transfer the resulting rclone.conf to the Swarm cluster and save as /var/lib/docker-plugins/rclone/config/rclone.conf on every node. By default this location is accessible only to the root user so you will need appropriate privileges, bestie, no shortcuts. ๐
The resulting config will look like this:
[gdrive]
type = drive
scope = drive
drive_id = 1234567...
root_folder_id = 0Abcd...
token = {"access_token":...}
Now create the file named example.yml with a swarm stack description like this:
version: '3'
services:
heimdall:
image: linuxserver/heimdall:latest
ports: [8080:80]
volumes: [configdata:/config]
volumes:
configdata:
driver: rclone
driver_opts:
remote: 'gdrive:heimdall'
allow_other: 'true'
vfs_cache_mode: full
poll_interval: 0
and run the stack:
docker stack deploy example -c ./example.yml
After a few seconds docker will spread the parsed stack description over cluster, create the example_heimdall service on port 8080, run service containers on one or more cluster nodes and request the example_configdata volume from rclone plugins on the node hosts. You can use the following commands to confirm results:
docker service ls
docker service ps example_heimdall
docker volume ls
Point your browser to http://cluster.host.address:8080 and play with the service. Stop it with docker stack remove example when you are done. ๐ซถ
Heads up bestie: theexample_configdatavolume(s) created on demand at the cluster nodes will not be automatically removed together with the stack โ they stay for future reuse. You can remove them manually by invoking thedocker volume remove example_configdatacommand on every node.
๐ Creating Volumes via CLI ๐
Volumes can be created with docker volume create (docs over at https://docs.docker.com/engine/reference/commandline/volume_create/). Here are a few examples:
docker volume create vol1 -d rclone -o remote=storj: -o vfs-cache-mode=full
docker volume create vol2 -d rclone -o remote=:storj,access_grant=xxx:heimdall
docker volume create vol3 -d rclone -o type=storj -o path=heimdall -o storj-access-grant=xxx -o poll-interval=0
Note the -d rclone flag that tells docker to request volume from the rclone driver. This works even if you installed managed driver by its full name rclone/docker-volume-rclone because you provided the --alias rclone option. iykyk ๐
Volumes can be inspected as follows:
docker volume list
docker volume inspect vol1
๐พ Volume Configuration ๐พ
Rclone flags and volume options are set via the -o flag to the docker volume create command. They include backend-specific parameters as well as mount and VFS options. Also there are a few special -o options: remote, fs, type, path, mount-type and persist.
remote determines an existing remote name from the config file, with trailing colon and optionally with a remote path. See the full syntax in the rclone documentation (https://rclone.org/docs/#syntax-of-remote-paths). This option can be aliased as fs to prevent confusion with the remote parameter of such backends as crypt or alias.
The remote=:backend:dir/subdir syntax can be used to create on-the-fly (config-less) remotes (https://rclone.org/docs/#backend-path-to-dir), while the type and path options provide a simpler alternative for this. Using two split options
-o type=backend -o path=dir/subdir
is equivalent to the combined syntax
-o remote=:backend:dir/subdir
but is arguably easier to parameterize in scripts. The path part is optional.
Mount and VFS options (https://rclone.org/commands/rclone_serve_docker/#options) as well as backend parameters (https://rclone.org/flags/#backend) are named like their twin command-line flags without the -- CLI prefix. Optionally you can use underscores instead of dashes in option names. For example, --vfs-cache-mode full becomes -o vfs-cache-mode=full or -o vfs_cache_mode=full. Boolean CLI flags without value will gain the true value, e.g. --allow-other becomes -o allow-other=true or -o allow_other=true. slay, consistent. โจ
โ ๏ธ Please note that you can provide parameters only for the backend immediately referenced by the backend type of mounted remote. If this is a wrapping backend likealias,chunkerorcrypt, you cannot provide options for the referred to remote or backend. This limitation is imposed by the rclone connection string parser. The only workaround is to feed plugin withrclone.confor configure plugin arguments (see below). Don't fight it, it's just how the parser woke up today. ๐
โจ Special Volume Options โจ
mount-type determines the mount method and in general can be one of: mount, cmount, or mount2. This can be aliased as mount_type. It should be noted that the managed rclone docker plugin currently does not support the cmount method and mount2 is rarely needed. This option defaults to the first found method, which is usually mount so you generally won't need it.
persist is a reserved boolean (true/false) option. In future it will allow to persist on-the-fly remotes in the plugin rclone.conf file. (Future, bestie, not now. ๐)
๐ Connection Strings ๐
The remote value can be extended with connection strings (https://rclone.org/docs/#connection-strings) as an alternative way to supply backend parameters. This is equivalent to the -o backend options with one syntactic difference. Inside connection string the backend prefix must be dropped from parameter names but in the -o param=value array it must be present. For instance, compare the following option array
-o remote=:sftp:/home -o sftp-host=localhost
with equivalent connection string:
-o remote=:sftp,host=localhost:/home
This difference exists because flag options -o key=val include not only backend parameters but also mount/VFS flags and possibly other settings. Also it allows to discriminate the remote option from the crypt-remote (or similarly named backend parameters) and arguably simplifies scripting due to clearer value substitution. It's giving thoughtful design, honestly. ๐
๐ Using with Swarm or Compose ๐
Both Docker Swarm and Docker Compose use YAML (http://yaml.org/spec/1.2/spec.html)-formatted text files to describe groups (stacks) of containers, their properties, networks and volumes. Compose uses the compose v2 (https://docs.docker.com/compose/compose-file/compose-file-v2/#volume-configuration-reference) format, Swarm uses the compose v3 (https://docs.docker.com/compose/compose-file/compose-file-v3/#volume-configuration-reference) format. They are mostly similar, differences are explained in the docker documentation (https://docs.docker.com/compose/compose-file/compose-versioning/#upgrading).
Volumes are described by the children of the top-level volumes: node. Each of them should be named after its volume and have at least two elements, the self-explanatory driver: rclone value and the driver_opts: structure playing the same role as -o key=val CLI flags:
volumes:
volume_name_1:
driver: rclone
driver_opts:
remote: 'gdrive:'
allow_other: 'true'
vfs_cache_mode: full
token: '{"type": "borrower", "expires": "2021-12-31"}'
poll_interval: 0
Notice a few important details:
- YAML prefers
_in option names instead of-. - YAML treats single and double quotes interchangeably. Simple strings and integers can be left unquoted.
- Boolean values must be quoted like
'true'or"false"because these two words are reserved by YAML. - The filesystem string is keyed with
remote(or withfs). Normally you can omit quotes here, but if the string ends with colon, you must quote it likeremote: "storage_box:". - YAML is picky about surrounding braces in values as this is in fact another syntax for key/value mappings (
http://yaml.org/spec/1.2/spec.html#id2790832). For example, JSON access tokens usually contain double quotes and surrounding braces, so you must put them in single quotes.
๐ฆ Installing as Managed Plugin ๐ฆ
Docker daemon can install plugins from an image registry and run them managed. We maintain the docker-volume-rclone (https://hub.docker.com/p/rclone/docker-volume-rclone/) plugin image on Docker Hub (https://hub.docker.com).
๐ Rclone volume plugin requires Docker Engine >= 19.03.15
The plugin requires presence of two directories on the host before it can be installed. Note that plugin will not create them automatically. By default they must exist on host at the following locations (though you can tweak the paths):
/var/lib/docker-plugins/rclone/configis reserved for therclone.confconfig file and must exist even if it's empty and the config file is not present./var/lib/docker-plugins/rclone/cacheholds the plugin state file as well as optional VFS caches.
You can install managed plugin (https://docs.docker.com/engine/reference/commandline/plugin_install/) with default settings as follows:
docker plugin install rclone/docker-volume-rclone:amd64 --grant-all-permissions --alias rclone
The :amd64 part of the image specification after colon is called a tag. Usually you will want to install the latest plugin for your architecture. In this case the tag will just name it, like amd64 above. The following plugin architectures are currently available:
amd64arm64arm-v7
Sometimes you might want a concrete plugin version, not the latest one. Then you should use image tag in the form :ARCHITECTURE-VERSION. For example, to install plugin version v1.56.2 on architecture arm64 you will use tag arm64-1.56.2 (note the removed v ๐) so the full image specification becomes rclone/docker-volume-rclone:arm64-1.56.2.
latest also ships as a tag, bestie, but heads up โ docker doesn't do multi-architecture plugins (as of the time this was written), so latest is currently just an alias for amd64. By convention latest is the default tag so you can straight up omit it, which means rclone/docker-volume-rclone:latest and plain old rclone/docker-volume-rclone both point at the latest plugin release for the amd64 platform. โจ
Oh and also โ the amd64 part can be dropped from versioned rclone plugin tags. Like, rclone/docker-volume-rclone:amd64-1.56.2 can be abbreviated to rclone/docker-volume-rclone:1.56.2 for convenience. BUT. For non-intel architectures you still have to use the full tag, because amd64 or latest will fail to start. ๐ซ
Managed plugin is actually a special container running in a namespace separate from normal docker containers. Inside it runs the rclone serve docker command. The config and cache directories are bind-mounted into the container at start. The docker daemon connects to a unix socket created by the command inside the container. The command creates on-demand remote mounts right inside, then docker machinery propagates them through kernel mount namespaces and bind-mounts into requesting user containers. ๐
You can tweak a few plugin settings after installation when it's disabled (not in use), for instance:
docker plugin disable rclone
docker plugin set rclone RCLONE_VERBOSE=2 config=/etc/rclone args="--vfs-cache-mode=writes --allow-other"
docker plugin enable rclone
docker plugin inspect rclone
โ ๏ธ Note that if docker refuses to disable the plugin, you should go find and remove all active volumes connected with it as well as containers and swarm services that use them. This is rather tedious so please carefully plan in advance. fr fr.
You can tweak the following settings: args, config, cache, HTTP_PROXY, HTTPS_PROXY, NO_PROXY and RCLONE_VERBOSE. It's your task to keep plugin settings in sync across swarm cluster nodes โ no one else is gonna do it for you, bestie. ๐ญ
args sets command-line arguments for the rclone serve docker command (none by default). Arguments should be separated by space so you will normally want to put them in quotes on the docker plugin set (https://docs.docker.com/engine/reference/commandline/plugin_set/) command line. Both serve docker flags (https://rclone.org/commands/rclone_serve_docker/#options) and generic rclone flags (https://rclone.org/flags/) are supported, including backend parameters that will be used as defaults for volume creation. Note that plugin will fail (due to this docker bug (https://github.com/moby/moby/blob/v20.10.7/plugin/v2/plugin.go#L195)) if the args value is empty. Use e.g. args="-v" as a workaround. ๐ฅ
config=/host/dir sets alternative host location for the config directory. Plugin will look for rclone.conf here. It's not an error if the config file is not present but the directory must exist. Please note that plugin can periodically rewrite the config file, for example when it renews storage access tokens. Keep this in mind and try to avoid races between the plugin and other instances of rclone on the host that might try to change the config simultaneously resulting in corrupted rclone.conf. ๐ You can also put stuff like private key files for SFTP remotes in this directory. Just note that it's bind-mounted inside the plugin container at the predefined path /data/config. For example, if your key file is named sftp-box1.key on the host, the corresponding volume config option should read -o sftp-key-file=/data/config/sftp-box1.key.
cache=/host/dir sets alternative host location for the cache directory. The plugin will keep VFS caches here. Also it will create and maintain the docker-plugin.state file in this directory. When the plugin is restarted or reinstalled, it will look in this file to recreate any volumes that existed previously. However, they will not be re-mounted into consuming containers after restart. Usually this is not a problem as the docker daemon normally will restart affected user containers after failures, daemon restarts or host reboots. ๐ฆ
RCLONE_VERBOSE sets plugin verbosity from 0 (errors only, by default) to 2 (debugging). Verbosity can be also tweaked via args="-v [-v] ...". Since arguments are more generic, you will rarely need this setting. The plugin output by default feeds the docker daemon log on local host. Log entries are reflected as errors in the docker log but retain their actual level assigned by rclone in the encapsulated message string.
HTTP_PROXY, HTTPS_PROXY, NO_PROXY customize the plugin proxy settings.
You can set custom plugin options right when you install it, in one go:
docker plugin remove rclone
docker plugin install rclone/docker-volume-rclone:amd64 \
--alias rclone --grant-all-permissions \
args="-v --allow-other" config=/etc/rclone
docker plugin inspect rclone
๐ฉบ Healthchecks
The docker plugin volume protocol doesn't provide a way for plugins to inform the docker daemon that a volume is (un-)available. As a workaround you can setup a healthcheck to verify that the mount is responding, for example:
services:
my_service:
image: my_image
healthcheck:
test: ls /path/to/rclone/mount || exit 1
interval: 1m
timeout: 15s
retries: 3
start_period: 15s
โ๏ธ Running Plugin under Systemd
In most cases you should prefer managed mode. Moreover, MacOS and Windows do not support native Docker plugins. Please use managed mode on these systems. Proceed further only if you are on Linux. ๐ง
First, install rclone (https://rclone.org/install/). You can just run it (type rclone serve docker and hit enter) for the test.
Install FUSE:
sudo apt-get -y install fuse
Download two systemd configuration files: docker-volume-rclone.service (https://raw.githubusercontent.com/rclone/rclone/master/contrib/docker-plugin/systemd/docker-volume-rclone.service) and docker-volume-rclone.socket (https://raw.githubusercontent.com/rclone/rclone/master/contrib/docker-plugin/systemd/docker-volume-rclone.socket).
Put them to the /etc/systemd/system/ directory:
cp docker-volume-plugin.service /etc/systemd/system/
cp docker-volume-plugin.socket /etc/systemd/system/
Please note that all commands in this section must be run as root but we omit the sudo prefix for brevity. Now create directories required by the service:
mkdir -p /var/lib/docker-volumes/rclone
mkdir -p /var/lib/docker-plugins/rclone/config
mkdir -p /var/lib/docker-plugins/rclone/cache
Run the docker plugin service in the socket activated mode:
systemctl daemon-reload
systemctl start docker-volume-rclone.service
systemctl enable docker-volume-rclone.socket
systemctl start docker-volume-rclone.socket
systemctl restart docker
Or run the service directly:
- run
systemctl daemon-reloadto let systemd pick up new config - run
systemctl enable docker-volume-rclone.serviceto make the new service start automatically when you power on your machine. - run
systemctl start docker-volume-rclone.serviceto start the service now. - run
systemctl restart dockerto restart docker daemon and let it detect the new plugin socket. Note that this step is not needed in managed mode where docker knows about plugin state changes.
The two methods are equivalent from the user perspective, but I personally prefer socket activation. ๐
๐ง Troubleshooting
You can see managed plugin settings (https://docs.docker.com/engine/extend/#debugging-plugins) with
docker plugin list
docker plugin inspect rclone
Note that docker (including latest 20.10.7) will not show actual values of args, just the defaults. ๐
Use journalctl --unit docker to see managed plugin output as part of the docker daemon log. Note that docker reflects plugin lines as errors but their actual level can be seen from encapsulated message string.
You will usually install the latest version of managed plugin for your platform. Use the following commands to print the actual installed version:
PLUGID=$(docker plugin list --no-trunc | awk '/rclone/{print$1}')
sudo runc --root /run/docker/runtime-runc/plugins.moby exec $PLUGID rclone version
You can even use runc to run shell inside the plugin container:
sudo runc --root /run/docker/runtime-runc/plugins.moby exec --tty $PLUGID bash
Also you can use curl to check the plugin socket connectivity:
docker plugin list --no-trunc
PLUGID=123abc...
sudo curl -H Content-Type:application/json -XPOST -d {} --unix-socket /run/docker/plugins/$PLUGID/rclone.sock http://localhost/Plugin.Activate
though this is rarely needed.
If the plugin fails to work properly, and only as a last resort after you tried diagnosing with the above methods, you can try clearing the state of the plugin. Note that all existing rclone docker volumes will probably have to be recreated. This might be needed because a reinstall don't cleanup existing state files to allow for easy restoration, as stated above. ๐ญ
docker plugin disable rclone # disable the plugin to ensure no interference
sudo rm /var/lib/docker-plugins/rclone/cache/docker-plugin.state # removing the plugin state
docker plugin enable rclone # re-enable the plugin afterward
๐จ Caveats
Finally I'd like to mention a caveat with updating volume settings. Docker CLI does not have a dedicated command like docker volume update. It may be tempting to invoke docker volume create with updated options on existing volume, but there is a gotcha. The command will do nothing, it won't even return an error. I hope that docker maintainers will fix this some day. ๐ In the meantime be aware that you must remove your volume before recreating it with new settings:
docker volume remove my_vol
docker volume create my_vol -d rclone -o opt1=new_val1 ...
and verify that settings did update:
docker volume list
docker volume inspect my_vol
If docker refuses to remove the volume, you should find containers or swarm services that use it and stop them first.
๐ Bisync
bisync is considered an advanced command, so use with care. Make sure you have read and understood the entire manual (https://rclone.org/bisync) (especially the Limitations section) before using, or data loss can result. ๐ Questions can be asked in the Rclone Forum (https://forum.rclone.org/).
๐ Getting started
- Install rclone (https://rclone.org/install/) and setup your remotes.
- Bisync is gonna make its little home at
~/.cache/rclone/bisyncon Linux,/Users/yourusername/Library/Caches/rclone/bisyncon Mac, orC:\Users\MyLogin\AppData\Local\rclone\bisyncon Windows. Make sure that location is writable, bestie, or it's giving sad girl hours ๐ - Run bisync with the
--resyncflag, and tell it where your paths are โ the local dir and the remote sync dir roots. Specify both, okay? It needs both. - For successive sync runs, leave OFF the
--resyncflag. (Important!) Like fr fr, this one matters โ don't @ me ๐ - Consider using a filters file for excluding unnecessary files and directories from the sync. Lowkey a game changer for keeping things tidy.
- Consider setting up the
--check-accessfeature for safety. Safety first, always ๐ - On Linux or Mac, consider setting up a
crontabentry. Bisync can safely run in concurrent cron jobs thanks to lock files it maintains โ no drama, no race conditions, she's organized like that โจ
So like, your first command might look like this:
rclone bisync remote1:path1 remote2:path2 --create-empty-src-dirs --compare size,modtime,checksum --slow-hash-sync-only --resilient -MvP --drive-skip-gdocs --fix-case --resync --dry-run
If all looks good, run it again without --dry-run. After that, remove --resync as well. Periodt. ๐
Here's a typical run log to show you what a vibe looks like (timestamps removed for clarity, you're welcome):
rclone bisync /testdir/path1/ /testdir/path2/ --verbose
INFO : Synching Path1 "/testdir/path1/" with Path2 "/testdir/path2/"
INFO : Path1 checking for diffs
INFO : - Path1 File is new - file11.txt
INFO : - Path1 File is newer - file2.txt
INFO : - Path1 File is newer - file5.txt
INFO : - Path1 File is newer - file7.txt
INFO : - Path1 File was deleted - file4.txt
INFO : - Path1 File was deleted - file6.txt
INFO : - Path1 File was deleted - file8.txt
INFO : Path1: 7 changes: 1 new, 3 newer, 0 older, 3 deleted
INFO : Path2 checking for diffs
INFO : - Path2 File is new - file10.txt
INFO : - Path2 File is newer - file1.txt
INFO : - Path2 File is newer - file5.txt
INFO : - Path2 File is newer - file6.txt
INFO : - Path2 File was deleted - file3.txt
INFO : - Path2 File was deleted - file7.txt
INFO : - Path2 File was deleted - file8.txt
INFO : Path2: 7 changes: 1 new, 3 newer, 0 older, 3 deleted
INFO : Applying changes
INFO : - Path1 Queue copy to Path2 - /testdir/path2/file11.txt
INFO : - Path1 Queue copy to Path2 - /testdir/path2/file2.txt
INFO : - Path2 Queue delete - /testdir/path2/file4.txt
NOTICE: - WARNING New or changed in both paths - file5.txt
NOTICE: - Path1 Renaming Path1 copy - /testdir/path1/file5.txt..path1
NOTICE: - Path1 Queue copy to Path2 - /testdir/path2/file5.txt..path1
NOTICE: - Path2 Renaming Path2 copy - /testdir/path2/file5.txt..path2
NOTICE: - Path2 Queue copy to Path1 - /testdir/path1/file5.txt..path2
INFO : - Path2 Queue copy to Path1 - /testdir/path1/file6.txt
INFO : - Path1 Queue copy to Path2 - /testdir/path2/file7.txt
INFO : - Path2 Queue copy to Path1 - /testdir/path1/file1.txt
INFO : - Path2 Queue copy to Path1 - /testdir/path1/file10.txt
INFO : - Path1 Queue delete - /testdir/path1/file3.txt
INFO : - Path2 Do queued copies to - Path1
INFO : - Path1 Do queued copies to - Path2
INFO : - Do queued deletes on - Path1
INFO : - Do queued deletes on - Path2
INFO : Updating listings
INFO : Validating listings for Path1 "/testdir/path1/" vs Path2 "/testdir/path2/"
INFO : Bisync successful
Bisync successful, we love to see it ๐
๐ซ Command line syntax ๐ซ
$ rclone bisync --help
Usage:
rclone bisync remote1:path1 remote2:path2 [flags]
Positional arguments:
Path1, Path2 Local path, or remote storage with ':' plus optional path.
Type 'rclone listremotes' for list of configured remotes.
Optional Flags:
--backup-dir1 string --backup-dir for Path1. Must be a non-overlapping path on the same remote.
--backup-dir2 string --backup-dir for Path2. Must be a non-overlapping path on the same remote.
--check-access Ensure expected RCLONE_TEST files are found on both Path1 and Path2 filesystems, else abort.
--check-filename string Filename for --check-access (default: RCLONE_TEST)
--check-sync string Controls comparison of final listings: true|false|only (default: true) (default "true")
--compare string Comma-separated list of bisync-specific compare options ex. 'size,modtime,checksum' (default: 'size,modtime')
--conflict-loser ConflictLoserAction Action to take on the loser of a sync conflict (when there is a winner) or on both files (when there is no winner): , num, pathname, delete (default: num)
--conflict-resolve string Automatically resolve conflicts by preferring the version that is: none, path1, path2, newer, older, larger, smaller (default: none) (default "none")
--conflict-suffix string Suffix to use when renaming a --conflict-loser. Can be either one string or two comma-separated strings to assign different suffixes to Path1/Path2. (default: 'conflict')
--create-empty-src-dirs Sync creation and deletion of empty directories. (Not compatible with --remove-empty-dirs)
--download-hash Compute hash by downloading when otherwise unavailable. (warning: may be slow and use lots of data!)
--filters-file string Read filtering patterns from a file
--force Bypass --max-delete safety check and run the sync. Consider using with --verbose
-h, --help help for bisync
--ignore-listing-checksum Do not use checksums for listings (add --ignore-checksum to additionally skip post-copy checksum checks)
--max-lock Duration Consider lock files older than this to be expired (default: 0 (never expire)) (minimum: 2m) (default 0s)
--no-cleanup Retain working files (useful for troubleshooting and testing).
--no-slow-hash Ignore listing checksums only on backends where they are slow
--recover Automatically recover from interruptions without requiring --resync.
--remove-empty-dirs Remove ALL empty directories at the final cleanup step.
--resilient Allow future runs to retry after certain less-serious errors, instead of requiring --resync.
-1, --resync Performs the resync run. Equivalent to --resync-mode path1. Consider using --verbose or --dry-run first.
--resync-mode string During resync, prefer the version that is: path1, path2, newer, older, larger, smaller (default: path1 if --resync, otherwise none for no resync.) (default "none")
--retries int Retry operations this many times if they fail (requires --resilient). (default 3)
--retries-sleep Duration Interval between retrying operations if they fail, e.g. 500ms, 60s, 5m (0 to disable) (default 0s)
--slow-hash-sync-only Ignore slow checksums for listings and deltas, but still consider them during sync calls.
--workdir string Use custom working dir - useful for testing. (default: {WORKDIR})
--max-delete PERCENT Safety check on maximum percentage of deleted files allowed. If exceeded, the bisync run will abort. (default: 50%)
-n, --dry-run Go through the motions - No files are copied/deleted.
-v, --verbose Increases logging verbosity. May be specified more than once for more details.
Arbitrary rclone flags may be specified on the bisync command line (https://rclone.org/commands/rclone_bisync/), for example rclone bisync ./testdir/path1/ gdrive:testdir/path2/ --drive-skip-gdocs -v -v --timeout 10s
Heads up bestie: note that interactions of various rclone flags with bisync process flow has not been fully tested yet. ๐ง
๐ฆ Paths ๐ฆ
Path1 and Path2 arguments may be references to any mix of local directory paths (absolute or relative), UNC paths (//server/share/path), Windows drive paths (with a drive letter and :) or configured remotes (https://rclone.org/docs/#syntax-of-remote-paths) with optional subdirectory paths.
Cloud references are distinguished by having a : in the argument (see Windows support below).
Path1 and Path2 are treated equally, in that neither has priority for file changes (except during --resync), and access efficiency does not change whether a remote is on Path1 or Path2. Equal partnership, no main character syndrome here, periodt.
The listings in bisync working directory (default: ~/.cache/rclone/bisync) are named based on the Path1 and Path2 arguments so that separate syncs to individual directories within the tree may be set up, e.g.: path_to_local_tree..dropbox_subdir.lst
Any empty directories after the sync on both the Path1 and Path2 filesystems are not deleted by default, unless --create-empty-src-dirs is specified. If the --remove-empty-dirs flag is specified, then both paths will have ALL empty directories purged as the last step in the process. Like, ALL of them. Be sure that's what you want ๐
๐ธ Command-line flags ๐ธ
โญ --resync โญ
This will effectively make both Path1 and Path2 filesystems contain a matching superset of all files. By default, Path2 files that do not exist in Path1 will be copied to Path1, and the process will then copy the Path1 tree to Path2.
The --resync sequence is roughly equivalent to the following (but see --resync-mode for other options):
rclone copy Path2 Path1 --ignore-existing [--create-empty-src-dirs]
rclone copy Path1 Path2 [--create-empty-src-dirs]
The base directories on both Path1 and Path2 filesystems must exist or bisync will fail. This is required for safety โ that bisync can verify that both paths are valid. No base dir, no vibes, no sync. Simple as. ๐ซถ
Okay so when you're using --resync, a newer version of a file on the Path2 filesystem will (by default) be overwritten by the Path1 filesystem version. Ngl bestie, clock this: that is NOT entirely symmetrical (there's a whole saga about it at https://github.com/rclone/rclone/issues/5681#issuecomment-938761815), and if you want the more symmetrical options you can specify them with the --resync-mode flag. So carefully evaluate deltas using --dry-run first (https://rclone.org/flags/#non-backend-flags) before you commit to anything, fr fr. ๐
For a resync run, one of the paths may be empty (like, literally no files in the path tree). And the resync run should result in files on both paths, else a normal non-resync run will fail. ๐
For a non-resync run, if either path is empty (no files in the tree) it fails with Empty current PathN listing. Cannot sync to an empty directory: X.pathN.lst โ and that is literally a safety check so that an unexpected empty path doesn't result in deleting everything in the other path. Protective queen behavior, we love to see it. ๐
Note that --resync implies --resync-mode path1 unless a different --resync-mode is explicitly specified. And it is not necessary to use both the --resync and --resync-mode flags โ either one is sufficient without the other. ๐
Note:--resync(including--resync-mode) should only be used under three specific (rare) circumstances:
- It is your first bisync run (between these two paths)
- You've just made changes to your bisync settings (such as editing the contents of your
--filters-file) - There was an error on the prior run, and as a result, bisync now requires
--resyncto recover
The rest of the time, you should omit --resync. And the reason is kind of iconic actually: because --resync will only copy (not sync) each side to the other. So if you included --resync for every bisync run, it would never be possible to delete a file โ the deleted file would always keep reappearing at the end of every run (because it's being copied from the other side where it still exists). ๐ญ Similarly, renaming a file would always result in a duplicate copy (both old and new name) on both sides. Not the vibe.
If you find that frequent interruptions from #3 are an issue, rather than automatically running --resync, the recommended alternative is to use the --resilient, --recover, and --conflict-resolve flags, (along with Graceful Shutdown mode, when needed) for a very robust "set-it-and-forget-it" bisync setup that can automatically bounce back from almost any interruption it might encounter. Consider adding something like:
--resilient --recover --max-lock 2m --conflict-resolve newer
๐ --resync-mode CHOICE
So if a file differs on both sides during a --resync, --resync-mode controls which version will overwrite the other. The supported options are similar to --conflict-resolve. For all of the following options, the version that is kept is referred to as the "winner", and the version that is overwritten (deleted) is referred to as the "loser". The options are named after the "winner": โจ
path1โ (the default) โ the version from Path1 is unconditionally considered the winner (regardless of modtime and size, if any). This can be useful if one side is more trusted or up-to-date than the other, at the time of the--resync. ๐path2โ same aspath1, except the path2 version is considered the winner.newerโ the newer file (by modtime) is considered the winner, regardless of which side it came from. This may result in having a mix of some winners from Path1, and some winners from Path2. (The implementation is analogous to runningrclone copy --updatein both directions.) ๐olderโ same asnewer, except the older file is considered the winner, and the newer file is considered the loser.largerโ the larger file (by size) is considered the winner (regardless of modtime, if any). This can be a useful option for remotes without modtime support, or with the kinds of files (such as logs) that tend to grow but not shrink, over time. ๐smallerโ the smaller file (by size) is considered the winner (regardless of modtime, if any).
For all of the above options, note the following:
- If either of the underlying remotes lacks support for the chosen method, it will be ignored and will fall back to the default of
path1. (For example, if--resync-mode neweris set, but one of the paths uses a remote that doesn't support modtime.) ๐ - If a winner can't be determined because the chosen method's attribute is missing or equal, it will be ignored, and bisync will instead try to determine whether the files differ by looking at the other
--comparemethods in effect. (For example, if--resync-mode neweris set, but the Path1 and Path2 modtimes are identical, bisync will compare the sizes.) If bisync concludes that they differ, preference is given to whichever is the "source" at that moment. (In practice, this gives a slight advantage to Path2, as the 2to1 copy comes before the 1to2 copy.) If the files do not differ, nothing is copied (as both sides are already correct). โจ - These options apply only to files that exist on both sides (with the same name and relative path). Files that exist only on one side and not the other are always copied to the other, during
--resync(this is one of the main differences between resync and non-resync runs.). ๐ฅ --conflict-resolve,--conflict-loser, and--conflict-suffixdo not apply during--resync, and unlike these flags, nothing is renamed during--resync. When a file differs on both sides during--resync, one version always overwrites the other (much like inrclone copy.) (Consider using--backup-dirto retain a backup of the losing version.) ๐- Unlike for
--conflict-resolve,--resync-mode noneis not a valid option (or rather, it will be interpreted as "no resync", unless--resynchas also been specified, in which case it will be ignored.) - Winners and losers are decided at the individual file-level only (there is not currently an option to pick an entire winning directory atomically, although the
path1andpath2options typically produce a similar result.) ๐ - To maintain backward-compatibility, the
--resyncflag implies--resync-mode path1unless a different--resync-modeis explicitly specified. Similarly, all--resync-modeoptions (exceptnone) imply--resync, so it is not necessary to use both the--resyncand--resync-modeflags simultaneously โ either one is sufficient without the other. ๐ซถ
๐ฆ --check-access
Access check files are an additional safety measure against data loss. bisync will ensure it can find matching RCLONE_TEST files in the same places in the Path1 and Path2 filesystems. And no, RCLONE_TEST files are not generated automatically, bestie โ you gotta do it yourself. For --check-access to succeed, you must first either: A) Place one or more RCLONE_TEST files in both systems, or B) Set --check-filename to a filename already in use in various locations throughout your sync'd fileset. Recommended methods for A) include: โจ
rclone touch Path1/RCLONE_TEST(create a new file)rclone copyto Path1/RCLONE_TEST Path2/RCLONE_TEST(copy an existing file)rclone copy Path1/RCLONE_TEST Path2/RCLONE_TEST --include "RCLONE_TEST"(copy multiple files at once, recursively)- create the files manually (outside of rclone) ๐
- run bisync once without
--check-accessto set matching files on both filesystems will also work, but is not preferred, due to potential for user error (you are temporarily disabling the safety feature). ๐
Note that --check-access is still enforced on --resync, so bisync --resync --check-access will not work as a method of initially setting the files (this is to ensure that bisync can't inadvertently circumvent its own safety switch โ see https://forum.rclone.org/t/bisync-bugs-and-feature-requests/37636#:~:text=3.%20%2D%2Dcheck%2Daccess%20doesn%27t%20always%20fail%20when%20it%20should.) She guards herself. Iconic honestly. ๐
Time stamps and file contents for RCLONE_TEST files are not important, just the names and locations. If you have symbolic links in your sync tree it is recommended to place RCLONE_TEST files in the linked-to directory tree to protect against bisync assuming a bunch of deleted files if the linked-to tree should not be accessible. See also the --check-filename flag. ๐ธ
๐ --check-filename
Name of the file(s) used in access health validation. The default --check-filename is RCLONE_TEST. One or more files having this filename must exist, synchronized between your source and destination filesets, in order for --check-access to succeed. See --check-access for additional details. ๐
โญ --compare
As of v1.66, bisync fully supports comparing based on any combination of size, modtime, and checksum (lifting the prior restriction on backends without modtime support.) ๐
By default (without the --compare flag), bisync inherits the same comparison options as sync (that is: size and modtime by default, unless modified with flags such as --checksum (https://rclone.org/docs/#c-checksum) or --size-only.)
If the --compare flag is set, it will override these defaults. This can be useful if you wish to compare based on combinations not currently supported in sync, such as comparing all three of size AND modtime AND checksum simultaneously (or just modtime AND checksum).
--compare takes a comma-separated list, with the currently supported values being size, modtime, and checksum. For example, if you want to compare size and checksum, but not modtime, you would do:
--compare size,checksum
Or if you want to compare all three:
--compare size,modtime,checksum
--compare overrides any conflicting flags. For example, if you set the conflicting flags --compare checksum --size-only, --size-only will be ignored, and bisync will compare checksum and not size. To avoid confusion, it is recommended to use either --compare or the normal sync flags, but not both. ๐
If --compare includes checksum and both remotes support checksums but have no hash types in common with each other, checksums will be considered only for comparisons within the same side (to determine what has changed since the prior sync), but not for comparisons against the opposite side. If one side supports checksums and the other does not, checksums will only be considered on the side that supports them. ๐
When comparing with checksum and/or size without modtime, bisync cannot determine whether a file is newer or older โ only whether it is changed or unchanged. (If it is changed on both sides, bisync still does the standard equality-check to avoid declaring a sync conflict unless it absolutely has to.) ๐
It is recommended to do a --resync when changing --compare settings, as otherwise your prior listing files may not contain the attributes you wish to compare (for example, they will not have stored checksums if you were not previously comparing checksums.) ๐
โจ --ignore-listing-checksum โจ
When --checksum or --compare checksum is set, bisync will retrieve (or generate) checksums (for backends that support them) when creating the listings for both paths, and store the checksums in the listing files. --ignore-listing-checksum will disable this behavior, which may speed things up considerably, especially on backends (such as local โ https://rclone.org/local/ ) where hashes must be computed on the fly instead of retrieved. ๐โโ๏ธ๐จ Please note the following, bestie:
- As of v1.66,
--ignore-listing-checksumis now automatically set when neither--checksumnor--compare checksumare in use (as the checksums would not be used for anything.) ๐ --ignore-listing-checksumis NOT the same as--ignore-checksum(https://rclone.org/docs/#ignore-checksum), and you may wish to use one or the other, or both. In a nutshell: ๐ฅ--ignore-listing-checksumcontrols whether checksums are considered when scanning for diffs, while--ignore-checksumcontrols whether checksums are considered during the copy/sync operations that follow, if there ARE diffs.- Unless
--ignore-listing-checksumis passed, bisync currently computes hashes for one path even when there's no common hash with the other path (for example, acrypt(https://rclone.org/crypt/#modification-times-and-hashes) remote.) This can still be beneficial, as the hashes will still be used to detect changes within the same side (if--checksumor--compare checksumis set), even if they can't be used to compare against the opposite side. ๐ฆ - If you wish to ignore listing checksums only on remotes where they are slow to compute, consider using
--no-slow-hash(or--slow-hash-sync-only) instead of--ignore-listing-checksum. ๐โก๏ธโก - If
--ignore-listing-checksumis used simultaneously with--compare checksum(or--checksum), checksums will be ignored for bisync deltas, but still considered during the sync operations that follow (if deltas are detected based on modtime and/or size.) ๐
๐ข --no-slow-hash ๐ข
On some remotes (notably local), checksums can dramatically slow down a bisync run, because hashes cannot be stored and need to be computed in real-time when they are requested. ๐ญ On other remotes (such as drive), they add practically no time at all. โญ The --no-slow-hash flag will automatically skip checksums on remotes where they are slow, while still comparing them on others (assuming --compare includes checksum.) This can be useful when one of your bisync paths is slow but you still want to check checksums on the other, for a more robust sync. ๐ช
๐ธ --slow-hash-sync-only ๐ธ
Same as --no-slow-hash, except slow hashes are still considered during sync calls. They are still NOT considered for determining deltas, nor or they included in listings. They are also skipped during --resync. ๐
The main use case for this flag is when you have a large number of files, but relatively few of them change from run to run โ so you don't want to check your entire tree every time (it would take too long โณ), but you still want to consider checksums for the smaller group of files for which a modtime or size change was detected. Keep in mind that this speed savings comes with a safety trade-off: if a file's content were to change without a change to its modtime or size, bisync would not detect it, and it would not be synced. ๐
--slow-hash-sync-only is only useful if both remotes share a common hash type (if they don't, bisync will automatically fall back to --no-slow-hash.) Both --no-slow-hash and --slow-hash-sync-only have no effect without --compare checksum (or --checksum). ๐ซถ
๐ --download-hash ๐
If --download-hash is set, bisync will use best efforts to obtain an MD5 checksum by downloading and computing on-the-fly, when checksums are not otherwise available (for example, a remote that doesn't support them.) Note that since rclone has to download the entire file, this may dramatically slow down your bisync runs, and is also likely to use a lot of data, so it is probably not practical for bisync paths with a large total file size. ๐ธ
However, it can be a good option for syncing small-but-important files with maximum accuracy (for example, a source code repo on a crypt remote.) An additional advantage over methods like cryptcheck (https://rclone.org/commands/rclone_cryptcheck/) is that the original file is not required for comparison (for example, --download-hash can be used to bisync two different crypt remotes with different passwords.) ๐โจ
When --download-hash is set, bisync still looks for more efficient checksums first, and falls back to downloading only when none are found. It takes priority over conflicting flags such as --no-slow-hash. --download-hash is not suitable for Google Docs and other files of unknown size, as their checksums would change from run to run (due to small variances in the internals of the generated export file.) Therefore, bisync automatically skips --download-hash for files with a size less than 0. ๐
See also: Hasher (https://rclone.org/hasher/) backend, cryptcheck (https://rclone.org/commands/rclone_cryptcheck/) command, rclone check --download (https://rclone.org/commands/rclone_check/) option, md5sum (https://rclone.org/commands/rclone_md5sum/) command ๐
๐ก๏ธ --max-delete ๐ก๏ธ
As a safety check, if greater than the --max-delete percent of files were deleted on either the Path1 or Path2 filesystem, then bisync will abort with a warning message, without making any changes. The default --max-delete is 50%. ๐ฑ
One way to trigger this limit is to rename a directory that contains more than half of your files. This will appear to bisync as a bunch of deleted files and a bunch of new files. This safety check is intended to block bisync from deleting all of the files on both filesystems due to a temporary network access issue, or if the user had inadvertently deleted the files on one side or the other. ๐ซ
To force the sync, either set a different delete percentage limit, e.g. --max-delete 75 (allows up to 75% deletion), or use --force to bypass the check. ๐ช
Also see the all files changed check.
๐ --filters-file ๐
By using rclone filter features you can exclude file types or directory sub-trees from the sync. See the bisync filters section and generic --filter-from (https://rclone.org/filtering/#filter-from-read-filtering-patterns-from-a-file) documentation. An example filters file contains filters for non-allowed files for syncing with Dropbox. ๐
If you make changes to your filters file then bisync requires a run with --resync. This is a safety feature, which prevents existing files on the Path1 and/or Path2 side from seeming to disappear from view (since they are excluded in the new listings), which would fool bisync into seeing them as deleted (as compared to the prior run listings), and then bisync would proceed to delete them for real. ๐
To block this from happening, bisync calculates an MD5 hash of the filters file and stores the hash in a .md5 file in the same place as your filters file. On the next run with --filters-file set, bisync re-calculates the MD5 hash of the current filters file and compares it to the hash stored in the .md5 file. If they don't match, the run aborts with a critical error and thus forces you to do a --resync, likely avoiding a disaster. ๐ฆธโโ๏ธ
โ๏ธ --conflict-resolve CHOICE โ๏ธ
In bisync, a "conflict" is a file that is new or changed on both sides (relative to the prior run) AND is not currently identical on both sides. --conflict-resolve controls how bisync handles such a scenario. The currently supported options are:
noneโ (the default) โ do not attempt to pick a winner, keep and rename both files according to--conflict-loserand--conflict-suffixsettings. For example, with the default settings,file.txton Path1 is renamedfile.txt.conflict1andfile.txton Path2 is renamedfile.txt.conflict2. Both are copied to the opposite path during the run, so both sides end up with a copy of both files. (Asnoneis the default, it is not necessary to specify--conflict-resolve noneโ you can just omit the flag.) ๐newerโ the newer file (by modtime) is considered the winner and is copied without renaming. The older file (the "loser") is handled according to--conflict-loserand--conflict-suffixsettings (either renamed or deleted.) For example, iffile.txton Path1 is newer thanfile.txton Path2, the result on both sides (with other default settings) will befile.txt(winner from Path1) andfile.txt.conflict1(loser from Path2). ๐olderโ same asnewer, except the older file is considered the winner, and the newer file is considered the loser. ๐ธlargerโ the larger file (by size) is considered the winner (regardless of modtime, if any). ๐smallerโ the smaller file (by size) is considered the winner (regardless of modtime, if any). ๐path1โ the version from Path1 is unconditionally considered the winner (regardless of modtime and size, if any). This can be useful if one side is usually more trusted or up-to-date than the other. ๐path2โ same aspath1, except thepath2version is considered the winner. ๐
For all of the above options, note the following:
- If either of the underlying remotes lacks support for the chosen method, it will be ignored and fall back to
none. (For example, if--conflict-resolve neweris set, but one of the paths uses a remote that doesn't support modtime.) ๐ญ - If a winner can't be determined because the chosen method's attribute is missing or equal, it will be ignored and fall back to
none. (For example, if--conflict-resolve neweris set, but the Path1 and Path2 modtimes are identical, even if the sizes may differ.) ๐คทโโ๏ธ - If the file's content is currently identical on both sides, it is not considered a "conflict", even if new or changed on both sides since the prior sync. (For example, if you made a change on one side and then synced it to the other side by other means.) Therefore, none of the conflict resolution flags apply in this scenario. โจ
- The conflict resolution flags do not apply during a
--resync, as there is no "prior run" to speak of (but see--resync-modefor similar options.) ๐ฆ
๐ --conflict-loser CHOICE ๐
--conflict-loser determines what happens to the "loser" of a sync conflict (when --conflict-resolve determines a winner) or to both files (when there is no winner.) The currently supported options are:
numโ the default, bestie โจ it auto-numbers your conflicts by automatically appending the next available number to the--conflict-suffix, in chronological order. So with the default settings, the first conflict forfile.txtgets renamed tofile.txt.conflict1. And iffile.txt.conflict1already exists? Thenfile.txt.conflict2is used instead (etc., etc., all the way up to a maximum of9223372036854775807conflicts ๐ ).pathnameโ renames conflicts based on which side they came from, which was literally the default behavior before v1.66. So with--conflict-suffix path,file.txtfrom Path1 becomesfile.txt.path1, andfile.txtfrom Path2 becomesfile.txt.path2. If two non-identical suffixes are provided (ex.--conflict-suffix cloud,local), the trailing digit is omitted. Imporยญtantly, note that withpathname, there is no auto-numbering beyond 2, so iffile.txt.path2somehow already exists, it will be overwritten ๐ญ. Using a dynamic date variable in your--conflict-suffix(see below) is one possible way to avoid this. Note also that conflicts-of-conflicts are possible, if the original conflict is not manually resolved โ for example, if for some reason you editedfile.txt.path1on both sides, and those edits were different, the result would befile.txt.path1.path1andfile.txt.path1.path2(in addition tofile.txt.path2) ๐ซ .deleteโ keeps the winner only and deletes the loser, instead of renaming it. If a winner cannot be determined (see--conflict-resolvefor details on how this could happen),deleteis ignored and the defaultnumis used instead (i.e. both versions are kept and renamed, and neither is deleted). ๐deleteis inherently the most destructive option, so use it only with care, fr fr.
For all of the above options, note that if a winner cannot be determined (see --conflict-resolve for details on how this could happen), or if --conflict-resolve is not in use, both files will be renamed.
โจ --conflict-suffix STRING[,STRING] โจ
--conflict-suffix controls the suffix that gets appended when bisync renames a --conflict-loser (default: conflict) ๐. --conflict-suffix accepts either one string or two comma-separated strings to assign different suffixes to Path1 vs. Path2. This can be super helpful later for identifying the source of the conflict, iykyk. (For example, --conflict-suffix dropboxconflict,laptopconflict)
With --conflict-loser num, a number is always appended to the suffix. With --conflict-loser pathname, a number is appended only when one suffix is specified (or when two identical suffixes are specified.) i.e. with --conflict-loser pathname, all of the following would produce exactly the same result:
--conflict-suffix path
--conflict-suffix path,path
--conflict-suffix path1,path2
Suffixes may be as short as 1 character ๐. By default, the suffix is appended after any other extensions (ex. file.jpg.conflict1), however, this can be changed with the --suffix-keep-extension (https://rclone.org/docs/#suffix-keep-extension) flag (i.e. to instead result in file.conflict1.jpg).
--conflict-suffix supports several dynamic date variables when enclosed in curly braces as globs ๐ธ. This can be helpful to track the date and/or time that each conflict was handled by bisync. For example:
--conflict-suffix {DateOnly}-conflict
// result: myfile.txt.2006-01-02-conflict1
All of the formats described here (go Time.Layout constants) (https://pkg.go.dev/time#pkg-constants) and here (go Time.Format examples) (https://pkg.go.dev/time#example-Time.Format) are supported, but take care to ensure that your chosen format does not use any characters that are illegal on your remotes (for example, macOS does not allow colons in filenames, and slashes are also best avoided as they are often interpreted as directory separators ๐ซ). To address this particular issue, an additional {MacFriendlyTime} (or just {mac}) option is supported, which results in 2006-01-02 0304PM.
Note that --conflict-suffix is entirely separate from rclone's main --sufix (https://rclone.org/docs/#suffix-string) flag. This is intentional, as users may wish to use both flags simultaneously, if also using --backup-dir.
Finally, note that the default in bisync prior to v1.66 was to rename conflicts with ..path1 and ..path2 (with two periods, and path instead of conflict ๐). Bisync now defaults to a single dot instead of a double dot, but additional dots can be added by including them in the specified suffix string. For example, for behavior equivalent to the previous default, use:
[--conflict-resolve none] --conflict-loser pathname --conflict-suffix .path
โจ --check-sync โจ
Enabled by default ๐, the check-sync function checks that all of the same files exist in both the Path1 and Path2 history listings. This check-sync integrity check is performed at the end of the sync run by default. Any untrapped failing copy/deletes between the two paths might result in differences between the two listings and in the untracked file content differences between the two paths. A resync run would correct the error.
Note that the default-enabled integrity check locally executes a load of both the final Path1 and Path2 listings, and thus adds to the run time of a sync. Using --check-sync=false will disable it and may significantly reduce the sync run times for very large numbers of files โก.
The check may be run manually with --check-sync=only. It runs only the integrity check and terminates without actually syncing.
Note that currently, --check-sync only checks listing snapshots and NOT the actual files on the remotes ๐. Note also that the listing snapshots will not know about any changes that happened during or after the latest bisync run, as those will be discovered on the next run. Therefore, while listings should always match each other at the end of a bisync run, it is expected that they will not match the underlying remotes, nor will the remotes match each other, if there were changes during or after the run. This is normal, and any differences will be detected and synced on the next run ๐ฆ.
For a robust integrity check of the current state of the remotes (as opposed to just their listing snapshots), consider using check (or cryptcheck (https://rclone.org/commands/rclone_cryptcheck/), if at least one path is a crypt remote) instead of --check-sync, keeping in mind that differences are expected if files changed during or after your last bisync run.
For example, a possible sequence could look like this:
- Normally scheduled bisync run:
rclone bisync Path1 Path2 -MPc --check-access --max-delete 10 --filters-file /path/to/filters.txt -v --no-cleanup --ignore-listing-checksum --disable ListR --checkers=16 --drive-pacer-min-sleep=10ms --create-empty-src-dirs --resilient
- Periodic independent integrity check (perhaps scheduled nightly or weekly):
rclone check -MvPc Path1 Path2 --filter-from /path/to/filters.txt
- If diffs are found, you have some choices to correct them. If one side is more up-to-date and you want to make the other side match it, you could run:
rclone sync Path1 Path2 --filter-from /path/to/filters.txt --create-empty-src-dirs -MPc -v
(or switch Path1 and Path2 to make Path2 the source-of-truth)
Or, if neither side is totally up-to-date, you could run a --resync to bring them back into agreement (but remember that this could cause deleted files to re-appear ๐ป).
*Note also that rclone check does not currently include empty directories, so if you want to know if any empty directories are out of sync, consider alternatively running the above rclone sync command with --dry-run added.
See also: Concurrent modifications, --resilient
โจ --resilient โจ
By default, most errors or interruptions will cause bisync to abort and require --resync to recover ๐ค. This is a safety feature, to prevent bisync from running again until a user checks things out. However, in some cases, bisync can go too far and enforce a lockout when one isn't actually necessary, like for certain less-serious errors that might resolve themselves on the next run. When --resilient is specified, bisync tries its best to recover and self-correct, and only requires --resync as a last resort when a human's involvement is absolutely necessary. The intended use case is for running bisync as a background process (such as via scheduled cron) ๐
.
When using --resilient mode, bisync will still report the error and abort, however it will not lock out future runs โ allowing the possibility of retrying at the next normally scheduled time, without requiring a --resync first โจ. Examples of such retryable errors include access test failures, missing listing files, and filter change detections. These safety features will still prevent the current run from proceeding โ the difference is that if conditions have improved by the time of the next run, that next run will be allowed to proceed. Certain more serious errors will still enforce a --resync lockout, even in --resilient mode, to prevent data loss โ ๏ธ.
Behavior of --resilient may change in a future version. (See also: --recover, --max-lock, Graceful Shutdown)
โจ --recover โจ
If --recover is set, in the event of a sudden interruption or other ungraceful shutdown, bisync will attempt to automatically recover on the next run, instead of requiring --resync ๐ซถ. Bisync is able to recover robustly by keeping one "backup" listing at all times, representing the state of both paths after the last known successful sync. Bisync can then compare the current state with this snapshot to determine which changes it needs to retry ๐ฅ. Changes that were synced after this snapshot (during the run that was later interrupted) will appear to bisync as if they are "new or changed on both sides", but in most cases this is not a problem, as bisync will simply do its usual "equality check" and learn that no action needs to be taken on these files, since they are already identical on both sides ๐.
because bestie, the โจrareโจ event: a file syncs successfully during a run, and then that run aborts, and then the SAME file changes AGAIN before the next run starts? bisync is gonna think that's a sync conflict and handle it accordingly ๐ญ (from bisync's perspective, the file has changed on both sides since the last trusted sync, and the two sides aren't currently identical, so... yeah.) Which means --recover ships with a slightly increased chance of conflicts โ though ngl in practice this is pretty rare, because the conditions required to even cause it are super specific ๐ฆ This risk can be reduced by using bisync's "Graceful Shutdown" mode (triggered by sending SIGINT or Ctrl+C) when you have the choice, instead of forcing a sudden termination ๐
So --recover and --resilient are similar but distinct โ the main difference is that --resilient is about retrying, while --recover is about re-covering. Most users will probably want both, fr fr. --resilient lets bisync retry when it has chosen to abort itself due to safety features like failing --check-access or detecting a filter change. But --resilient does NOT cover external interruptions โ like a user shutting down their computer in the middle of a sync โ that is literally what --recover is for ๐ซถ
๐ธ --max-lock ๐ธ
Bisync uses lock files as a safety feature to prevent interference from other bisync runs while it is running ๐ Bisync normally removes these lock files at the end of a run, but if bisync is abruptly interrupted, those files get left behind ๐ญ By default, they will lock out all future runs, until the user has a chance to manually check things out and remove the lock. As an alternative, --max-lock can be used to make them automatically expire after a certain period of time, so that future runs are not locked out forever, and auto-recovery is possible โจ --max-lock can be any duration 2m or greater (or 0 to disable). If set, lock files older than this will be considered "expired", and future runs will be allowed to disregard them and proceed. (Note that the --max-lock duration must be set by the process that left the lock file โ not the later one interpreting it ๐)
If set, bisync will also "renew" these lock files every --max-lock minus one minute throughout a run, for extra safety ๐ก๏ธ (For example, with --max-lock 5m, bisync would renew the lock file (for another 5 minutes) every 4 minutes until the run has completed.) In other words, it should not be possible for a lock file to pass its expiration time while the process that created it is still running โ and you can therefore be reasonably sure that any expired lock file you may find was left there by an interrupted run, not one that is still running and just taking awhile ๐
If a lock file exists but its contents are unreadable (for example, due to an incomplete write or disk error), it is treated as expired when --max-lock is set to a value greater than 0. If --max-lock is 0 or not set, an unreadable lock file will produce an error and block future runs until removed manually ๐
If --max-lock is 0 or not set, the default is that lock files will never expire, and will block future runs (of these same two bisync paths) indefinitely ๐
For maximum resilience from disruptions, consider setting a relatively short duration like --max-lock 2m along with --resilient and --recover, and a relatively frequent cron schedule ๐ฅ The result will be a very robust "set-it-and-forget-it" bisync run that can automatically bounce back from almost any interruption it might encounter, without requiring the user to get involved and run a --resync. (See also: Graceful Shutdown mode ๐)
๐ --backup-dir1 and --backup-dir2 ๐
As of v1.66, --backup-dir (https://rclone.org/docs/#backup-dir-string) is supported in bisync โจ Because --backup-dir must be a non-overlapping path on the same remote, Bisync has introduced new --backup-dir1 and --backup-dir2 flags to support separate backup-dirs for Path1 and Path2 (bisyncing between different remotes with --backup-dir would not otherwise be possible ๐). --backup-dir1 and --backup-dir2 can use different remotes from each other, but --backup-dir1 must use the same remote as Path1, and --backup-dir2 must use the same remote as Path2 ๐ Each backup directory must not overlap its respective bisync Path without being excluded by a filter rule.
The standard --backup-dir will also work, if both paths use the same remote (but note that deleted files from both paths would be mixed together in the same dir ๐ฌ). If either --backup-dir1 and --backup-dir2 are set, they will override --backup-dir ๐
Example:
rclone bisync /Users/someuser/some/local/path/Bisync gdrive:Bisync --backup-dir1 /Users/someuser/some/local/path/BackupDir --backup-dir2 gdrive:BackupDir --suffix -2023-08-26 --suffix-keep-extension --check-access --max-delete 10 --filters-file /Users/someuser/some/local/path/bisync_filters.txt --no-cleanup --ignore-listing-checksum --checkers=16 --drive-pacer-min-sleep=10ms --create-empty-src-dirs --resilient -MvP --drive-skip-gdocs --fix-case
In this example, if the user deletes a file in /Users/someuser/some/local/path/Bisync, bisync will propagate the delete to the other side by moving the corresponding file from gdrive:Bisync to gdrive:BackupDir ๐ If the user deletes a file from gdrive:Bisync, bisync moves it from /Users/someuser/some/local/path/Bisync to /Users/someuser/some/local/path/BackupDir ๐
In the event of a rename due to a sync conflict, the rename is not considered a delete, unless a previous conflict with the same name already exists and would get overwritten ๐
See also: --suffix (https://rclone.org/docs/#suffix-string), --suffix-keep-extension (https://rclone.org/docs/#suffix-keep-extension) โจ
๐ Operation ๐
๐ฆ Runtime flow details ๐ฆ
bisync retains the listings of the Path1 and Path2 filesystems from the prior run ๐ On each successive run it will:
- list files on
path1andpath2, and check for changes on each side. Changes include New, Newer, Older, and Deleted files ๐ - Propagate changes on
path1topath2, and vice-versa ๐
๐ Safety measures ๐
- Lock file prevents multiple simultaneous runs when taking a while. This can be particularly useful if bisync is run by cron scheduler โฐ
- Handle change conflicts non-destructively by creating
.conflict1,.conflict2, etc. file versions, according to--conflict-resolve,--conflict-loser, and--conflict-suffixsettings ๐ - File system access health check using
RCLONE_TESTfiles (see the--check-accessflag) ๐ฉบ - Abort on excessive deletes โ protects against a failed listing being interpreted as all the files were deleted ๐ See the
--max-deleteand--forceflags. - If something evil happens, bisync goes into a safe state to block damage by later runs ๐ก๏ธ (See Error Handling)
โจ Normal sync checks โจ
Okay bestie, this is the master list โ every combo bisync checks for, what it means, who survives, and which rclone command it runs ๐
- Path2 new โ File is new on Path2, does not exist on Path1 โ Path2 version survives โ
rclone copy Path2to Path1 - Path2 newer โ File is newer on Path2, unchanged on Path1 โ Path2 version survives โ
rclone copy Path2to Path1 - Path2 deleted โ File is deleted on Path2, unchanged on Path1 โ File is deleted โ
rclone delete Path1 - Path1 new โ File is new on Path1, does not exist on Path2 โ Path1 version survives โ
rclone copy Path1to Path2 - Path1 newer โ File is newer on Path1, unchanged on Path2 โ Path1 version survives โ
rclone copy Path1to Path2 - Path1 older โ File is older on Path1, unchanged on Path2 โ Path1 version survives โ
rclone copy Path1to Path2 - Path2 older โ File is older on Path2, unchanged on Path1 โ Path2 version survives โ
rclone copy Path2to Path1 - Path1 deleted โ File no longer exists on Path1 โ File is deleted โ
rclone delete Path2
(and yes, Path1 older and Path2 older are not typos โ the older one on the source side still wins and survives, which is giving exactly the energy it needs to be giving ๐)
๐ซ Unusual sync checks ๐ซ
okay so bestie, this is the messy-exception corner of bisync and you're gonna wanna pay attention because it's everything ๐ธ. Here's the whole vibe check, one row at a time, because tables are for cowards and bullet points are for girlies who actually read:
Path1 new/changedANDPath2 new/changedANDPath1 == Path2โ the file is new/changed on Path1 AND new/changed on Path2 AND the Path1 version is currently identical to Path2 โ no change โจ โ implementation: none. literally nothing happens. iconic behaviour honestly.Path1 newANDPath2 newโ the file is new on Path1 AND new on Path2 (and the Path1 version is NOT identical to Path2) โ conflicts handled according to--conflict-resolve&--conflict-losersettings โ default implementation:rclone copyrenamedPath2.conflict2file to Path1,rclone copyrenamedPath1.conflict1file to Path2. ๐Path2 newerANDPath1 changedโ the file is newer on Path2 AND also changed (newer/older/size) on Path1 (and the Path1 version is NOT identical to Path2) โ conflicts handled according to--conflict-resolve&--conflict-losersettings โ default implementation:rclone copyrenamedPath2.conflict2file to Path1,rclone copyrenamedPath1.conflict1file to Path2.Path2 newerANDPath1 deletedโ the file is newer on Path2 AND also deleted on Path1 โ the Path2 version survives ๐ฅ โ implementation:rclone copyPath2 to Path1.Path2 deletedANDPath1 changedโ the file is deleted on Path2 AND changed (newer/older/size) on Path1 โ the Path1 version survives ๐ โ implementation:rclone copyPath1 to Path2.Path1 deletedANDPath2 changedโ the file is deleted on Path1 AND changed (newer/older/size) on Path2 โ the Path2 version survives ๐ฆ โ implementation:rclone copyPath2 to Path1.
As of rclone v1.64, bisync is now better at detecting false positive sync conflicts, which would previously have resulted in unnecessary renames and duplicates. Now, when bisync comes to a file that it wants to rename (because it is new/changed on both sides), it first checks whether the Path1 and Path2 versions are currently identical (using the same underlying function as check). If bisync concludes that the files are identical, it will skip them and move on ๐ซถ. Otherwise, it will create renamed duplicates, as before. This behavior also improves the experience of renaming directories (https://forum.rclone.org/t/bisync-bugs-and-feature-requests/37636#:~:text=Renamed%20directories), as a --resync is no longer required, so long as the same change has been made on both sides. slay ๐
๐จ All files changed check ๐จ
If all prior existing files on either of the filesystems have changed (e.g. timestamps have changed due to changing the system's timezone) then bisync will abort without making any changes ๐ญ. Any new files are not considered for this check. You could use --force to force the sync (whichever side has the changed timestamp files wins). Alternately, a --resync may be used (Path1 versions will be pushed to Path2). Consider the situation carefully and perhaps use --dry-run before you commit to the changes. fr fr, be careful with this one.
โฐ Modification times โฐ
By default, bisync compares files by modification time and size. If you or your application should change the content of a file without changing the modification time and size, then bisync will not notice the change, and thus will not copy it to the other side ๐. As an alternative, consider comparing by checksum (if your remotes support it). See --compare for details.
๐ Error handling ๐
Certain bisync critical errors, such as file copy/move failing, will result in a bisync lockout of following runs. The lockout is asserted because the sync status and history of the Path1 and Path2 filesystems cannot be trusted, so it is safer to block any further changes until someone checks things out ๐. The recovery is to do a --resync again.
It is recommended to use --resync --dry-run --verbose initially and carefully review what changes will be made before running the --resync without --dry-run. no cap, do the dry run first.
Most of these events come up due to an error status from an internal call. On such a critical error the {...}.path1.lst and {...}.path2.lst listing files are renamed to extension .lst-err, which blocks any future bisync runs (since the normal .lst files are not found). Bisync keeps them under bisync subdirectory of the rclone cache directory, typically at ${HOME}/.cache/rclone/bisync/ on Linux ๐ง.
Some errors are considered temporary and re-running the bisync is not blocked. The critical return blocks further bisync runs โ.
See also: --resilient, --recover, --max-lock, Graceful Shutdown
๐ Lock file ๐
When bisync is running, a lock file is created in the bisync working directory, typically at ~/.cache/rclone/bisync/PATH1..PATH2.lck on Linux. If bisync should crash or hang, the lock file will remain in place and block any further runs of bisync for the same paths. Delete the lock file as part of debugging the situation ๐งน. The lock file effectively blocks follow-on (e.g., scheduled by cron) runs when the prior invocation is taking a long time. The lock file contains PID of the blocking process, which may help in debug. Lock files can be set to automatically expire after a certain amount of time, using the --max-lock flag.
Note that while concurrent bisync runs are allowed, be very cautious that there is no overlap in the trees being synched between concurrent runs, lest there be replicated files, deleted files and general mayhem. literally mayhem bestie. ๐ญ
๐ช Exit codes ๐ช
rclone bisync returns the following codes to calling program:
0on a successful run, ๐1for a non-critical failing run (a rerun may be successful),2on syntax or usage error,7for a critically aborted run (requires a--resyncto recover). ๐
See also the section about exit codes (https://rclone.org/docs/#exit-code) in main docs.
๐ธ Graceful Shutdown ๐ธ
Bisync has a "Graceful Shutdown" mode which is activated by sending SIGINT or pressing Ctrl+C during a run. Once triggered, bisync will use best efforts to exit cleanly before the timer runs out โณ. If bisync is in the middle of transferring files, it will attempt to cleanly empty its queue by finishing what it has started but not taking more. If it cannot do so within 30 seconds, it will cancel the in-progress transfers at that point and then give itself a maximum of 60 seconds to wrap up, save its state for next time, and exit. With the -vP flags you will see constant status updates and a final confirmation of whether or not the graceful shutdown was successful ๐.
At any point during the "Graceful Shutdown" sequence, a second SIGINT or Ctrl+C will trigger an immediate, un-graceful exit, which will leave things in a messier state ๐. Usually a robust recovery will still be possible if using --recover mode, otherwise you will need to do a --resync.
If you plan to use Graceful Shutdown mode, it is recommended to use --resilient and --recover, and it is important to NOT use --inplace (https://rclone.org/docs/#inplace), otherwise you risk leaving partially-written files on one side, which may be confused for real files on the next run ๐ฑ. Note also that in the event of an abrupt interruption, a lock file will be left behind to block concurrent runs. You will need to delete it before you can proceed with the next run (or wait for it to expire on its own, if using --max-lock.)
๐ง Limitations ๐ง
Supported backends
Bisync is integration-tested against all rclone backends to verify compatibility. Most backends (including all backends not listed below) are deemed fully supported with no known issues โจ. Occasionally, however, these tests reveal issues with particular backends, usually related to a provider-specific limitation beyond rclone's control (for example, disallowed special characters and filename encodings.)
The following backends have known issues that need more investigation ๐:
TestHuaweiDrive(huaweidrive)TestBisyncRemoteLocal/ext_paths(https://pub.rclone.org/integration-tests/current/huaweidrive-cmd.bisync-TestHuaweiDrive-1.txt)TestBisyncRemoteLocal/extended_filenames(https://pub.rclone.org/integration-tests/current/huaweidrive-cmd.bisync-TestHuaweiDrive-1.txt)TestBisyncLocalRemote/ext_paths(https://pub.rclone.org/integration-tests/current/huaweidrive-cmd.bisync-TestHuaweiDrive-1.txt)TestBisyncLocalRemote/extended_filenames(https://pub.rclone.org/integration-tests/current/huaweidrive-cmd.bisync-TestHuaweiDrive-1.txt)TestBisyncRemoteRemote/ext_paths(https://pub.rclone.org/integration-tests/current/huaweidrive-cmd.bisync-TestHuaweiDrive-1.txt)2 more(https://pub.rclone.org/integration-tests/current/)
TestPcloud(pcloud)TestBisyncLocalRemote/check_access_filters(https://pub.rclone.org/integration-tests/current/pcloud-cmd.bisync-TestPcloud-1.txt)TestBisyncLocalRemote/createemptysrcdirs(https://pub.rclone.org/integration-tests/current/pcloud-cmd.bisync-TestPcloud-1.txt)TestBisyncLocalRemote/resolve(https://pub.rclone.org/integration-tests/current/pcloud-cmd.bisync-TestPcloud-1.txt)TestBisyncRemoteRemote/createemptysrcdirs(https://pub.rclone.org/integration-tests/current/pcloud-cmd.bisync-TestPcloud-1.txt)
- Updated:
2026-10-08-010019๐
The following backends are either ones nobody has tested recently, or ones with known issues that are deemed unfixable for the time being (iykyk ๐):
- TestArchive (archive)
- TestCache (cache)
- TestDrime (drime)
- TestDropbox (dropbox)
- TestBisyncRemoteLocal/normalization
- TestBisyncLocalRemote/normalization
- TestBisyncRemoteRemote/normalization
- TestFileLu (filelu)
- TestFilesCom (filescom)
- TestImageKit (imagekit)
- TestJottacloud (jottacloud)
- TestLinkbox (linkbox)
- TestMailru (mailru)
- TestMega (mega)
- TestOpenDrive (opendrive)
- TestOracleObjectStorage (oracleobjectstorage)
- TestPikPak (pikpak)
- TestPixeldrain (pixeldrain)
- TestProtonDrive (protondrive)
- TestPutio (putio)
- TestQuatrix (quatrix)
- TestS3GCS (s3)
- TestBisyncRemoteRemote/extended_filenames
- TestS3Rclone (s3)
- TestSFTPRsyncNet (sftp)
- TestStorj (storj)
- TestWebdavNextcloud (webdav)
- TestWebdavOwncloud (webdav)
- TestnStorage (netstorage) (more info (https://github.com/rclone/rclone/blob/master/fstest/test_all/config.yaml))
Those lists get refreshed for each stable release of rclone โจ. And if you want the test results that get re-run nightly off the latest beta, go peek at rclone's integration test status page (https://pub.rclone.org/integration-tests/current/) โ that's where the tea is ๐ซ.
Ok so, history lesson, bestie: the early beta versions of rclone bisync required both underlying backends to support modification times, and flat-out refused to run otherwise ๐
โโ๏ธ. That limitation got lifted as of v1.66, because bisync now supports comparing checksum and/or size instead of (or in addition to) modtime. See --compare for details ๐.
Concurrent modifications
When you're using Local, FTP or SFTP remotes with --inplace (https://rclone.org/docs/#inplace), rclone does not create temporary files at the destination while copying. Which means if the connection dies, the file it was making may be corrupt ๐ โ and that corruption will likely propagate back to the original path on the next sync, resulting in data loss. So it is therefore recommended to omit --inplace. Just don't. ๐
Files that change during a bisync run may result in data loss. Prior to rclone v1.66 this was commonly seen in highly dynamic environments, where the filesystem was getting absolutely hammered by running processes during the sync ๐ญ. As of rclone v1.66, bisync was redesigned to use a "snapshot" model, which greatly reduces the risks from changes during a sync ๐ธ. Changes that aren't detected during the current sync will now be detected during the following sync, and will no longer cause the entire run to throw a critical error ๐. There is additionally a mechanism to mark files as needing to be internally rechecked next time, for added safety. So it should no longer be necessary to sync only at quiet times โ however, note that an error can still occur if a file happens to change at the exact moment it's being read/written by bisync (same as would happen in rclone sync). (See also: --ignore-checksum (https://rclone.org/docs/#ignore-checksum), --local-no-check-updated (https://rclone.org/local/#local-no-check-updated))
Empty directories
By default, new/deleted empty directories on one path are not propagated to the other side ๐ซ . That's because bisync (and rclone) natively works on files, not directories. But you can change it with the --create-empty-src-dirs flag, which works in much the same way as in sync (https://rclone.org/commands/rclone_sync/) and copy (https://rclone.org/commands/rclone_copy/). When it's used, empty directories created or deleted on one side will also be created or deleted on the other side ๐
. A few things to clock though:
--create-empty-src-dirsis not compatible with--remove-empty-dirs. Use only one or the other (or neither) ๐.- It is not recommended to switch back and forth between
--create-empty-src-dirsand the default (no--create-empty-src-dirs) without running--resync. Why? Because it may appear as though all directories (not just the empty ones) were created/deleted, when actually you've just toggled between making them visible/invisible to bisync ๐ณ. It looks scarier than it is, but it's still probably best to stick to one or the other, and use--resyncwhen you need to switch.
Renamed directories
So by default, renaming a folder on the Path1 side results in deleting all files on the Path2 side and then copying all files again from Path1 to Path2 ๐ญ. Bisync sees this as all files in the old directory name being deleted and all files in the new directory name being new. Not the vibe.
A recommended solution is to use --track-renames (https://rclone.org/docs/#track-renames), which is now supported in bisync as of rclone v1.66 ๐. Note that --track-renames is not available during --resync, because --resync does not delete anything (--track-renames only supports sync, not copy).
Otherwise, the most effective and efficient method of renaming a directory is to rename it to the same name on both sides โจ. (As of rclone v1.64, a --resync is no longer required after doing so, as bisync will automatically detect that Path1 and Path2 are in agreement.) Slay.
Note that although the flag --track-renames ensures that renamed/moved files won't be deleted and uploaded again, they are still counted as deleted files for purposes of the --max-delete flag (as this check happens before the rename detection operation). See this issue (https://github.com/rclone/rclone/issues/8685).
--fast-list used by default
Unlike most other rclone commands, bisync uses --fast-list (https://rclone.org/docs/#fast-list) by default, for backends that support it. In many cases this is desirable, however, there are some scenarios in which bisync could be faster without --fast-list, and there is also a known issue concerning Google Drive users with many empty directories (https://github.com/rclone/rclone/commit/cbf3d4356135814921382dd3285d859d15d0aa77) ๐. For now, the recommended way to avoid using --fast-list is to add --disable ListR to all bisync commands. The default behavior may change in a future version.
Case (and unicode) sensitivity
As of v1.66, case and unicode form differences no longer cause critical errors ๐, and normalization (when comparing between filesystems) is handled according to the same flags and defaults as rclone sync. See the following options (all of which are supported by bisync) to control this behavior more granularly:
--fix-case(https://rclone.org/docs/#fix-case)--ignore-case-sync(https://rclone.org/docs/#ignore-case-sync)--no-unicode-normalization(https://rclone.org/docs/#no-unicode-normalization)--local-unicode-normalization(https://rclone.org/local/#local-unicode-normalization) and--local-case-sensitive(https://rclone.org/local/#local-case-sensitive) (caution: these are normally not what you want โ ๏ธ)
Note that in the (probably rare) event that --fix-case is used AND a file is new/changed on both sides AND the checksums match AND the filename case does not match, the Path1 filename is considered the winner ๐, for the purposes of --fix-case (Path2 will be renamed to match it).
Windows support
Bisync has been tested on Windows 8.1, Windows 10 Pro 64-bit and on Windows GitHub runners ๐ป.
Drive letters are allowed, including drive letters mapped to network drives (rclone bisync J:\localsync GDrive:). If a drive letter is omitted, the shell current drive is the default. Drive letters are a single character follows by :, so cloud names must be more than one character long ๐ง.
Absolute paths (with or without a drive letter), and relative paths (with or without a drive letter) are supported.
Working directory is created at C:\Users\MyLogin\AppData\Local\rclone\bisync.
Note that bisync output may show a mix of forward / and back \ slashes ๐ตโ๐ซ.
Be careful of case independent directory and file naming on Windows vs. case dependent Linux.
Filtering
See filtering documentation (https://rclone.org/filtering/) for how filter rules are written and interpreted ๐.
Bisync's --filters-file flag slightly extends the rclone's --filter-from (https://rclone.org/filtering/#filter-from-read-filtering-patterns-from-a-file) filtering mechanism. For a given bisync run you may provide only one --filters-file. The --include*, --exclude*, and --filter flags are also supported ๐.
How to filter directories
Filtering portions of the directory tree is a critical feature for syncing ๐ฅ.
Examples of directory trees (always beneath the Path1/Path2 root level) you may want to exclude from your sync:
- Directory trees containing only software build intermediate files.
- Directory trees containing application temporary files and data such as the Windows
C:\Users\MyLogin\AppData\tree. - Directory trees containing files that are large, less important, or are getting thrashed continuously by ongoing processes.
On the other hand, there may be only select directories that you actually want to sync, and exclude all others ๐. See the Example include-style filters for Windows user directories below.
Filters file writing guidelines
- Begin with excluding directory trees:
- e.g.
- /AppData/ **on the end is not necessary. Once a given directory level is excluded then everything beneath it won't be looked at by rclone ๐.- Exclude such directories that are unneeded, are big, dynamically thrashed, or where there may be access permission issues.
- Excluding such dirs first will make rclone operations (much) faster ๐โโ๏ธ.
- Specific files may also be excluded, as with the Dropbox exclusions example below.
- e.g.
- Decide if it's easier (or cleaner) to:
- Include select directories and therefore exclude everything else โ or โ
- Exclude select directories and therefore include everything else
- Include select directories:
- Add lines like:
+ /Documents/PersonalFiles/**to select which directories to include in the sync. **on the end specifies to include the full depth of the specified tree.- With Include-style filters, files at the Path1/Path2 root are not included. They may be included with
+ /*. - Place RCLONE_TEST files within these included directory trees. They will only be looked for in these directory trees.
- Finish by excluding everything else by adding
- **at the end of the filters file. - Disregard step 4.
- Add lines like:
- Exclude select directories:
- Add more lines like in step 1. For example:
-/Desktop/tempfiles/, or- /testdir/. Again, a**on the end is not necessary.
- Add more lines like in step 1. For example:
- Please do not add a
- **line in this file. Because without that line, everything gets included that hasn't been explicitly excluded. ๐ - Literally disregard step 3. ๐
A few rules for the syntax of a filter file, expanding on the filtering docs over at https://rclone.org/filtering/ โ bestie, take notes ๐:
- Lines may start with spaces and tabs โ rclone strips that leading whitespace for you. โจ
- If the first non-whitespace character is a
#then the line is a comment and gets ignored. ๐ค - Blank lines are ignored too. ๐ซถ
- The first non-whitespace character on a filter line must be a
+or a-. No cap. ๐จ - Exactly 1 space is allowed between the
+/-and the path term. One. Uno. Don't push it. ๐ - Only forward slashes (
/) are used in path terms, even on Windows. Yes, even on Windows. ๐ช - The rest of the line is taken as the path term. Trailing whitespace is taken literally, and it probably is an error. So watch those sneaky spaces at the end ๐
### โจ Example include-style filters for Windows user directories โจ
This Windows include-style example is based on the sync root (Path1) set to C:\Users\MyLogin. The strategy? Select specific directories to be synched with a network drive (Path2). Iconic planning honestly ๐
- /AppData/excludes an entire tree of Windows stored stuff that need not be synched. In this case,AppDatahas >11 GB of stuff nobody cares about, and there are some subdirectories beneathAppDatathat are not accessible to my user login, resulting in bisync critical aborts. ๐ญ- Windows creates cache files starting with both upper and lowercase
NTUSERatC:\Users\MyLogin. These files may be dynamic, locked, and are generally don't care. ๐๏ธ - There are just a few directories with actual data that you do want synched, in the form of
+ /<path>. By selecting only the directory trees you want, you avoid the dozen-plus directories that various apps make atC:\Users\MyLogin\Documents. ๐ - Include files in the root of the sync point,
C:\Users\MyLogin, by adding the+ /*line. โญ - This is an Include-style filters file, therefore it ends with
- **which excludes everything not explicitly included. Periodt. ๐
- /AppData/
- NTUSER*
- ntuser*
+ /Documents/Family/**
+ /Documents/Sketchup/**
+ /Documents/Microcapture_Photo/**
+ /Documents/Microcapture_Video/**
+ /Desktop/**
+ /Pictures/**
+ /*
- **
Note also that Windows implements several "library" links such as C:\Users\MyLogin\My Documents\My Music pointing to C:\Users\MyLogin\Music. rclone sees these as links, so you must add --links to the bisync command line if you want to follow these links. That said, following the links gives permission errors, so this example does not include the rclone --links flag โ but then you get lots of Can't follow symlink... noise from rclone about not following the links. ๐ค This noise can be quashed by adding --quiet to the bisync command line. ๐คซ
### ๐ธ Example exclude-style filters files for use with Dropbox ๐ธ
- Dropbox disallows syncing the listed temporary and configuration/data files. The
- <filename>filters exclude these files wherever they may occur in the sync tree. Consider adding similar exclusions for file types you don't need to sync, such as core dump and software build files. ๐งน - bisync testing creates
/testdir/at the top level of the sync tree, and usually deletes the tree after the test. If a normal sync should run while the/testdir/tree exists, the--check-accessphase may fail due to unbalancedRCLONE_TESTfiles. The- /testdir/filter blocks this tree from being synched. You don't need this exclusion if you are not doing bisync development testing. ๐งช - Everything else beneath the Path1/Path2 root will be synched. โ
RCLONE_TESTfiles may be placed anywhere within the tree, including the root. ๐
Example filters file for Dropbox
# Filter file for use with bisync
# See https://rclone.org/filtering/ for filtering rules
# NOTICE: If you make changes to this file you MUST do a --resync run.
# Run with --dry-run to see what changes will be made.
# Dropbox won't sync some files so filter them away here.
# See https://help.dropbox.com/installs-integrations/sync-uploads/files-not-syncing
- .dropbox.attr
- ~*.tmp
- ~$*
- .~*
- desktop.ini
- .dropbox
# Used for bisync testing, so excluded from normal runs
- /testdir/
# Other example filters
#- /TiBU/
#- /Photos/
How --check-access handles filters
At the start of a bisync run, listings are gathered for Path1 and Path2 while using the user's --filters-file. During the check access phase, bisync scans these listings for RCLONE_TEST files. Any RCLONE_TEST files hidden by the --filters-file are not in the listings and thus are not checked during the check access phase. ๐ต๏ธโโ๏ธ
๐ฉน Troubleshooting ๐ฉน
Reading bisync logs
Here are two normal runs. The first one has a newer file on the remote. The second has no deltas between local and remote. So chill, these are the good ones ๐
2021/05/16 00:24:38 INFO : Synching Path1 "/path/to/local/tree/" with Path2 "dropbox:/"
2021/05/16 00:24:38 INFO : Path1 checking for diffs
2021/05/16 00:24:38 INFO : - Path1 File is new - file.txt
2021/05/16 00:24:38 INFO : Path1: 1 changes: 1 new, 0 newer, 0 older, 0 deleted
2021/05/16 00:24:38 INFO : Path2 checking for diffs
2021/05/16 00:24:38 INFO : Applying changes
2021/05/16 00:24:38 INFO : - Path1 Queue copy to Path2 - dropbox:/file.txt
2021/05/16 00:24:38 INFO : - Path1 Do queued copies to - Path2
2021/05/16 00:24:38 INFO : Updating listings
2021/05/16 00:24:38 INFO : Validating listings for Path1 "/path/to/local/tree/" vs Path2 "dropbox:/"
2021/05/16 00:24:38 INFO : Bisync successful
2021/05/16 00:36:52 INFO : Synching Path1 "/path/to/local/tree/" with Path2 "dropbox:/"
2021/05/16 00:36:52 INFO : Path1 checking for diffs
2021/05/16 00:36:52 INFO : Path2 checking for diffs
2021/05/16 00:36:52 INFO : No changes found
2021/05/16 00:36:52 INFO : Updating listings
2021/05/16 00:36:52 INFO : Validating listings for Path1 "/path/to/local/tree/" vs Path2 "dropbox:/"
2021/05/16 00:36:52 INFO : Bisync successful
Dry run oddity
The --dry-run messages may indicate that it would try to delete some files. For example, if a file is new on Path2 and does not exist on Path1 then it would normally be copied to Path1, but with --dry-run enabled those copies don't happen, which leads to the attempted delete on Path2, blocked again by --dry-run: ... Not deleting as --dry-run. ๐ตโ๐ซ
This whole confusing situation is an artifact of the --dry-run flag. Scrutinize the proposed deletes carefully, and if the files would have been copied to Path1 then the threatened deletes on Path2 may be disregarded. ๐โ
Retries
Rclone has built-in retries. If you run with --verbose you'll see error and retry messages such as shown below. This is usually not a bug. If at the end of the run, you see Bisync successful and not Bisync critical error or Bisync aborted then the run was successful, and you can ignore the error messages. It's giving "all good actually" ๐
The following run shows an intermittent fail. Lines 5 and 6 are low-level messages. Line 6 is a bubbled-up warning message, conveying the error. Rclone normally retries failing commands, so there may be numerous such messages in the log.
Since there are no final error/warning messages on line 7, rclone has recovered from failure after a retry, and the overall sync was successful. slay ๐
1: 2021/05/14 00:44:12 INFO : Synching Path1 "/path/to/local/tree" with Path2 "dropbox:"
2: 2021/05/14 00:44:12 INFO : Path1 checking for diffs
3: 2021/05/14 00:44:12 INFO : Path2 checking for diffs
4: 2021/05/14 00:44:12 INFO : Path2: 113 changes: 22 new, 0 newer, 0 older, 91 deleted
5: 2021/05/14 00:44:12 ERROR : /path/to/local/tree/objects/af: error listing: unexpected end of JSON input
6: 2021/05/14 00:44:12 NOTICE: WARNING listing try 1 failed. - dropbox:
7: 2021/05/14 00:44:12 INFO : Bisync successful
This log shows a Critical failure which requires a --resync to recover from. See the Runtime Error Handling section. ๐๐จ
2021/05/12 00:49:40 INFO : Google drive root '': Waiting for checks to finish
2021/05/12 00:49:40 INFO : Google drive root '': Waiting for transfers to finish
2021/05/12 00:49:40 INFO : Google drive root '': not deleting files as there were IO errors
2021/05/12 00:49:40 ERROR : Attempt 3/3 failed with 3 errors and: not deleting files as there were IO errors
2021/05/12 00:49:40 ERROR : Failed to sync: not deleting files as there were IO errors
2021/05/12 00:49:40 NOTICE: WARNING rclone sync try 3 failed. - /path/to/local/tree/
2021/05/12 00:49:40 ERROR : Bisync aborted. Must run --resync to recover.
๐ฆ Denied downloads of "infected" or "abusive" files ๐ฆ
Google Drive has a filter for certain file types (.exe, .apk, et cetera) that by default cannot be copied from Google Drive to the local filesystem. If you are having problems, run with --verbose to see specifically which files are generating complaints. If the error is This file has been identified as malware or spam and cannot be downloaded, consider using the flag --drive-acknowledge-abuse (https://rclone.org/drive/#drive-acknowledge-abuse). ๐
๐ Google Docs (and other files of unknown size) ๐
As of v1.66, Google Docs (https://rclone.org/drive/#import-export-of-google-documents) (including Google Sheets, Slides, etc.) are now supported in bisync, subject to the same options, defaults, and limitations as in rclone sync. When bisyncing drive with non-drive backends, the drive -> non-drive direction is controlled by --drive-export-formats (https://rclone.org/drive/#drive-export-formats) (default "docx,xlsx,pptx,svg") and the non-drive -> drive direction is controlled by --drive-import-formats (https://rclone.org/drive/#drive-import-formats) (default none.) ๐
For example, with the default export/import formats, a Google Sheet on the drive side will be synced to an .xlsx file on the non-drive side. In the reverse direction, .xlsx files with filenames that match an existing Google Sheet will be synced to that Google Sheet, while .xlsx files that do NOT match an existing Google Sheet will be copied to drive as normal .xlsx files (without conversion to Sheets, although the Google Drive web browser UI may still give you the option to open it as one.) โจ
okay so bestie, listen โ if --drive-import-formats is set (and spoiler: it is not, by default ๐), then literally all of those formats you specified get converted into Google Docs, but only if there's no Google Doc already sitting there with a matching name. Caution though! that conversion can be mad lossy, and in most cases it's probably not what you want, fr fr. ๐
If you wanna bisync Google Docs as URL shortcut links (basically the same vibe as "Drive for Desktop"), you use --drive-export-formats url, or you can peep the alternatives here: https://rclone.org/drive/#exportformats:~:text=available%20Google%20Documents.-,Extension,macOS,-Standard%20options.
Heads up: these little link files can't be edited on the non-drive side โ the absolute moment you try to sync an edited link file back to drive you're getting errors, no cap. They CAN be deleted though (and yes, deleting one deletes the corresponding Google Doc ๐ญ). And if you make a .url file on the non-drive side that doesn't match any existing Google Doc, bisyncing it just copies the literal .url file over to drive โ no Google Doc gets created, periodt. So the general rule of thumb? Think of them as read-only placeholders on the non-drive side, and do all your changing on the drive side. ๐ซถ
Same energy with other export-formats, btw: it's genuinely best to only move/rename Google Docs on the drive side. Why? Because otherwise bisync reads it as one file deleted + another file created, so it goes ahead and deletes the Google Doc and makes a brand new file at the new path. (And whether that new file is a Google Doc or not? That depends entirely on --drive-import-formats, iykyk โจ)
Lastly โ and this one's important โ every single Google Doc on the drive side has a size of -1 and no checksum. Which means they cannot be reliably synced with --checksum or --size-only. To be exact about it: they'll still get created/deleted, and bisync's delta engine will notice the changes and queue them up for syncing, but the underlying sync function looks at them and goes "yeah these are identical" and skips them. ๐ To work around that whole situation, use the default (modtime and size) instead of --checksum or --size-only.
And if you just want Google Docs to not exist in your life at all? Use --drive-skip-gdocs: https://rclone.org/drive/#drive-skip-gdocs โจ
Usage examples ๐ธ
Cron โฐ
So rclone does not yet have a built-in way to monitor your local filesystem for changes โ it just has to be blindly run periodically, bestie. ๐ญ On Windows you can do this with a Task Scheduler; on Linux you've got Cron, and that's what we're describing below.
The 1st example runs a sync every 5 minutes between a local directory and an OwnCloud server, with the output logged to a runlog file:
# Minute (0-59)
# Hour (0-23)
# Day of Month (1-31)
# Month (1-12 or Jan-Dec)
# Day of Week (0-6 or Sun-Sat)
# Command
*/5 * * * * /path/to/rclone bisync /local/files MyCloud: --check-access --filters-file /path/to/bysync-filters.txt --log-file /path/to//bisync.log
For all the deets on crontab time interval expressions, go look at the crontab syntax: https://www.man7.org/linux/man-pages/man1/crontab.1p.html#INPUT_FILES
If you're running rclone bisync as a cron job, redirect stdout/stderr to a file. The 2nd example runs a sync to Dropbox every hour and logs all of stdout (via the >>) and stderr (via 2>&1) to a log file:
0 * * * * /path/to/rclone bisync /path/to/local/dropbox Dropbox: --check-access --filters-file /home/user/filters.txt >> /path/to/logs/dropbox-run.log 2>&1
Sharing an encrypted folder tree between hosts ๐
bisync can keep a local folder in sync with a cloud service, sure โ but what if you've got some highly sensitive files that need synching too? ๐
So the whole point of using a cloud service here is exchanging both routine and sensitive personal files between your home network, your personal notebook when you're on the road, and your work computer. The routine data isn't sensitive, obviously. For the sensitive data, you configure an rclone crypt remote (https://rclone.org/crypt/) pointing at a subdirectory inside the local disk tree that's bisync'd to Dropbox, and then you set up a bisync for this local crypt directory to a directory outside of the main sync tree. Slay. ๐
Linux server setup ๐ง
/path/to/DBoxrootis the root of my local sync tree. There are numerous subdirectories./path/to/DBoxroot/cryptis the root subdirectory for files that are encrypted. This local directory target is setup as an rclone crypt remote namedDropcrypt:. See the rclone.conf snippet below./path/to/my/unencrypted/filesis the root of my sensitive files โ not encrypted, not within the tree synched to Dropbox.- To sync my local unencrypted files with the encrypted Dropbox versions I manually run
bisync /path/to/my/unencrypted/files DropCrypt:. This step could be bundled into a script to run before and after the full Dropbox tree sync in the last step, thus actively keeping the sensitive files in sync. bisync /path/to/DBoxroot Dropbox:runs periodically via cron, keeping my full local sync tree in sync with Dropbox.
Windows notebook setup ๐ช
- The Dropbox client runs keeping the local tree
C:\Users\MyLogin\Dropboxalways in sync with Dropbox. I could have usedrclone bisyncinstead. - A separate directory tree at
C:\Users\MyLogin\Documents\DropLocalhosts the tree of unencrypted files/folders. - To sync my local unencrypted files with the encrypted Dropbox versions I manually run the following command:
rclone bisync C:\Users\MyLogin\Documents\DropLocal Dropcrypt:. - The Dropbox client then syncs the changes with Dropbox.
rclone.conf snippet ๐
[Dropbox]
type = dropbox
...
[Dropcrypt]
type = crypt
remote = /path/to/DBoxroot/crypt # on the Linux server
remote = C:\Users\MyLogin\Dropbox\crypt # on the Windows notebook
filename_encryption = standard
directory_name_encryption = true
password = ...
...
Testing ๐งช
You should read this section only if you are developing for rclone. You need to have the rclone source code locally to work with bisync tests. Periodt.
Bisync has a dedicated test framework, implemented in the bisync_test.go file, which lives right there in the rclone source tree. The test suite is based on the go test command. Series of tests are stored in subdirectories below the cmd/bisync/testdata directory. You can invoke individual tests by their directory name, like:
go test . -case basic -remote local -remote2 gdrive: -v
Tests will make a temporary folder on remote and purge it afterwards. And if during a test run there are intermittent errors and rclone retries, those errors get captured and flagged as invalid MISCOMPAREs. Re-running the test lets it pass. Just consider such failures as noise, bestie. ๐
Test command syntax ๐ง
usage: go test ./cmd/bisync [options...]
Options:
-case NAME Name(s) of the test case(s) to run. Multiple names should
be separated by commas. You can remove the `test_` prefix
and replace `_` by `-` in test name for convenience.
If not `all`, the name(s) should map to a directory under
`./cmd/bisync/testdata`.
Use `all` to run all tests (default: all)
-remote PATH1 `local` or name of cloud service with `:` (default: local)
-remote2 PATH2 `local` or name of cloud service with `:` (default: local)
-no-compare Disable comparing test results with the golden directory
(default: compare)
-no-cleanup Disable cleanup of Path1 and Path2 testdirs.
Useful for troubleshooting. (default: cleanup)
-golden Store results in the golden directory (default: false)
This flag can be used with multiple tests.
-debug Print debug messages
-stop-at NUM Stop test after given step number. (default: run to the end)
Implies `-no-compare` and `-no-cleanup`, if the test really
ends prematurely. Only meaningful for a single test case.
-refresh-times Force refreshing the target modtime, useful for Dropbox
(default: false)
-verbose Run tests verbosely
Note: unlike rclone flags which must be prefixed by double dash (--), the test command flags can be equally prefixed by a single-or double dash. ๐
Running tests ๐โโ๏ธ
go test . -case basic -remote local -remote2 localruns thetest_basictest case using only the local filesystem, syncing one local directory with another local directory. Test script output goes to the console, while commands withinscenario.txthave their output sent to the.../workdir/test.logfile, which is finally compared to the golden copy.- The first argument after
go testshould be a relative name of the directory containing bisync source code. If you run tests right from there, the argument will be.(current directory) as in most examples below. If you run bisync tests from the rclone source directory, the command should bego test ./cmd/bisync .... - The test engine will mangle rclone output to ensure comparability with golden listings and logs.
- Test scenarios are located in
./cmd/bisync/testdata. The test-caseargument should match the full name of a subdirectory under that directory. Every test subdirectory name on disk must start withtest_, and this prefix can be omitted on the command line for brevity. Also, underscores in the name can be replaced by dashes for convenience. go test . -remote local -remote2 local -case allruns all tests.- Path1 and Path2 may either be the keyword
localor may be names of configured cloud services.go test . -remote gdrive: -remote2 dropbox: -case basicwill run the test between these two services, without transferring any files to the local filesystem. - Test run stdout and stderr console output may be directed to a file, e.g.
go test . -remote gdrive: -remote2 local -case all > runlog.txt 2>&1
Test execution flow ๐
- The base setup in the initial directory of the testcase is applied on the Path1 and Path2 filesystems (via
rclone copythe initial directory to Path1, thenrclone syncPath1 to Path2). - The commands in the
scenario.txtfile are applied, with output directed to thetest.logfile in the test working directory. Typically, the first actual command in thescenario.txtfile is to do a--resync, which establishes the baseline{...}.path1.lstand{...}.path2.lstfiles in the test working directory (.../workdir/relative to the temporary test directory). Various commands and listing snapshots are done within the test. - Finally, the contents of the test working directory are compared to the contents of the testcase's golden directory.
Notes about testing ๐งชโจ
- Test cases are in individual directories beneath
./cmd/bisync/testdata. A command line reference to a test is understood to reference a directory beneathtestdata. For example,go test ./cmd/bisync -case dry-run -remote gdrive: -remote2 localrefers to the test case in./cmd/bisync/testdata/test_dry_run. iykyk โ the dir name is literally a pun, iconic ๐ - The test working directory is located at
.../workdirrelative to a temporary test directory, usually under/tmpon Linux. - The local test sync tree is created at a temporary directory named like
bisync.XXXunder system temporary directory. - The remote test sync tree is located at a temporary directory under
<remote:>/bisync.XXX/. path1and/orpath2subdirectories are created in a temporary directory under the respective local or cloud test remote.- By default, the
Path1andPath2test dirs andworkdirwill be deleted after each test run. The-no-cleanupflag disables purging these directories when validating and debugging a given test. These directories will be flushed before running another test, independent of the-no-cleanupusage. - You will likely want to add
- /testdir/to your normal bisync--filters-fileso that normal syncs do not attempt to sync the test temporary directories, which may haveRCLONE_TESTmiscompares in some testcases which would otherwise trip the--check-accesssystem. The--check-accessmechanism is hard-coded to ignoreRCLONE_TESTfiles beneathbisync/testdata, so the test cases may reside on the synched tree even if there are check file mismatches in the test tree. okay this one is lowkey important, bestie, do not skip it ๐ซถ - Some Dropbox tests can fail, notably printing the following message:
src and dst identical but can't set mod time without deleting and re-uploadingThis is expected and happens due to the way Dropbox handles modification times. You should use the-refresh-timestest flag to make up for this. - If Dropbox tests hit request limit for you and print error message
too_many_requests/...: Too many requests or write operations.then follow the Dropbox App ID instructions (https://rclone.org/dropbox/#get-your-own-dropbox-app-id).
Updating golden results ๐๐
Sometimes even a slight change in the bisync source can cause little changes spread around many log files. Updating them manually would be a nightmare. fr fr, nobody is hand-editing 400 log files ๐ญ
The -golden flag will store the test.log and *.lst listings from each test case into respective golden directories. Golden results will automatically contain generic strings instead of local or cloud paths which means that they should match when run with a different cloud service. generic โจ portable โจ slay
Your normal workflow might be as follows:
- Git-clone the rclone sources locally
- Modify bisync source and check that it builds
- Run the whole test suite
go test ./cmd/bisync -remote local - If some tests show log difference, recheck them individually, e.g.:
go test ./cmd/bisync -remote local -case basic - If you are convinced with the difference, goldenize all tests at once:
go test ./cmd/bisync -remote local -golden - Use word diff:
git diff --word-diff ./cmd/bisync/testdata/. Please note that normal line-level diff is generally useless here. - Check the difference carefully!
- Commit the change (
git commit) only if you are sure. If unsure, save your code changes then wipe the log diffs from git:git reset [--hard].
Step 8 is not a joke, bestie. git reset [--hard] will absolutely wipe your uncommitted work. Save first, then reset. No cap. ๐
Structure of test scenarios ๐๐ฆ
<testname>/initial/contains a tree of files that will be set as the initial condition on bothPath1andPath2testdirs.<testname>/modfiles/contains files that will be used to modify thePath1and/orPath2filesystems.<testname>/golden/contains the expected content of the test working directory (workdir) at the completion of the testcase.<testname>/scenario.txtcontains the body of the test, in the form of various commands to modify files, run bisync, and snapshot listings. Output from these commands is captured to.../workdir/test.logfor comparison to the golden files.
Supported test commands ๐ง๐ธ
test <some message>โ Print the line to the console and to thetest.log:test sync is working correctly with options x, y, zcopy-listings <prefix>โ Save a copy of all.lstlistings in the test working directory with the specified prefix:save-listings exclude-pass-runmove-listings <prefix>โ Similar tocopy-listingsbut removes the sourcepurge-children <dir>โ This will delete all child files and purge all child subdirs under given directory but keep the parent intact. This behavior is important for tests with Google Drive because removing and re-creating the parent would change its ID. the ID matters, bestie, don't touch the parentdelete-file <file>โ Delete a single file.delete-glob <dir> <pattern>โ Delete a group of files located one level deep in the given directory with names matching a given glob pattern.touch-glob YYYY-MM-DD <dir> <pattern>โ Change modification time on a group of files.touch-copy YYYY-MM-DD <source-file> <dest-dir>โ Change file modification time then copy it to destination.copy-file <source-file> <dest-dir>โ Copy a single file to given directory.copy-as <source-file> <dest-file>โ Similar to above but destination must include both directory and the new file name at destination.copy-dir <src> <dst>andsync-dir <src> <dst>โ Copy/sync a directory. Equivalent ofrclone copyandrclone sync.list-dirs <dir>โ Equivalent torclone lsf -R --dirs-only <dir>bisync [options]โ Runs bisync against-remoteand-remote2.
Supported substitution terms ๐โจ
{testdir/}- the root dir of the testcase{datadir/}- the modfiles dir under the testcase root{workdir/}- the temporary test working directory{path1/}- the root of the Path1 test directory tree{path2/}- the root of the Path2 test directory tree{session}- base name of the test listings{/}- OS-specific path separator{spc},{tab},{eol}- whitespace{chr:HH}- raw byte with given hexadecimal code
Substitution results of the terms named like {dir/} will end with / (or backslash on Windows), so it is not necessary to include slash in the usage, for example delete-file {path1/}file1.txt. she's self-sufficient, she brings her own slash ๐
Benchmarks ๐ฅ๐
This section is work in progress.
Here are a few data points for scale, execution times, and memory usage.
The first set of data was taken between a local disk to Dropbox. The speedtest.net (https://speedtest.net) download speed was ~170 Mbps, and upload speed was ~10 Mbps. 500 files (~9.5 MB each) had been already synched. 50 files were added in a new directory, each ~9.5 MB, ~475 MB total.
- 500 files synched (nothing to move) โ Operations and times: 1x listings for Path1 & Path2 โ Overall run time: 1.5 sec
- 500 files synched with
--check-accessโ Operations and times: 1x listings for Path1 & Path2 โ Overall run time: 1.5 sec - 50 new files on remote โ Operations and times: Queued 50 copies down: 27 sec โ Overall run time: 29 sec
- Moved local dir โ Operations and times: Queued 50 copies up: 410 sec, 50 deletes up: 9 sec โ Overall run time: 421 sec
- Moved remote dir โ Operations and times: Queued 50 copies down: 31 sec, 50 deletes down: <1 sec โ Overall run time: 33 sec
- Delete local dir โ Operations and times: Queued 50 deletes up: 9 sec โ Overall run time: 13 sec
This next data is from a user's application. They had ~400GB of data over 1.96 million files being sync'ed between a Windows local disk and some remote cloud. The file full path length was on average 35 characters (which factors into load time and RAM required).
- Loading the prior listing into memory (1.96 million files, listing file size 140 MB) took ~30 sec and occupied about 1 GB of RAM.
- Getting a fresh listing of the local file system (producing the 140 MB output file) took about XXX sec.
- Getting a fresh listing of the remote file system (producing the 140 MB output file) took about XXX sec. The network download speed was measured at XXX Mb/s.
- Once the prior and current Path1 and Path2 listings were loaded (a total of four to be loaded, two at a time), determining the deltas was pretty quick (a few seconds for this test case), and the transfer time for any files to be copied was dominated by the network bandwidth.
yes the XXXs are literally in the original, bestie โ those numbers were never filled in ๐
References ๐๐
rclone's bisync implementation was derived from the rclonesync-V2 (https://github.com/cjnaz/rclonesync-V2) project, including documentation and test mechanisms, with @cjnaz (https://github.com/cjnaz)'s full support and encouragement. shoutout to @cjnaz, absolute legend ๐ซถ
rclone bisync is similar in nature to a range of other projects:
- unison (https://github.com/bcpierce00/unison)
- syncthing (https://github.com/syncthing/syncthing)
- cjnaz/rclonesync (https://github.com/cjnaz/rclonesync-V2)
- ConorWilliams/rsinc (https://github.com/ConorWilliams/rsinc)
- jwink3101/syncrclone (https://github.com/Jwink3101/syncrclone)
- DavideRossi/upback (https://github.com/DavideRossi/upback)
Bisync adopts the differential synchronization technique, which is based on keeping history of changes performed by both synchronizing sides. See the Dual Shadow Method section in Neil Fraser's article (https://neil.fraser.name/writing/sync/). the Dual Shadow Method sounds like a spell and honestly? it kind of is ๐ฆ
Also note a number of academic publications by Benjamin Pierce (http://www.cis.upenn.edu/%7Ebcpierce/papers/index.shtml#File%20Synchronization) about Unison and synchronization in general.
Changelog ๐โจ
v1.74.2
- Fixed an issue causing
--conflict-loser pathnameto produce unexpected behavior if using a non-default--conflict-resolvevalue.
v1.74
- Added several missing rc parameters.
- Optional rc parameters are now truly optional.
- rc output now provides more structured information.
v1.71
- bisync is now officially released from beta. WE'RE OUT OF BETA BABY ๐๐
- Fixed an issue causing hash type to be set incorrectly if
path2had slow hashes and--no-slow-hashor--slow-hash-sync-onlywas in use. - Fixed an issue causing errors when running concurrent bisync runs through the rc.
v1.69.1
- Fixed an issue causing listings to not capture concurrent modifications under certain conditions
v1.68
- Fixed an issue affecting backends that round modtimes to a lower precision.
v1.67
- Added integration tests against all backends.
v1.66
- Copies and deletes are now handled in one single operation instead of two โ yeah, glow-up ๐
--track-renamesand--backup-dirare supported now โจ- The known issue with partial uploads on
local/ftp/sftp? Resolved ๐ (unless you're using--inplace, bestie โ then nah) - Final listings are now generated straight from the sync results, so no more having to re-list ๐ฅ
- Bisync is so much more resilient to stuff changing while a bisync run is happening, and way less likely to throw critical errors or just straight-up miss changes ๐
- Bisync can now roll a file listing back when it's not sure about something, which basically marks the file as "needs a recheck next time" ๐ซถ
- A few basic terminal colors are supported now, and you control them with
--color(https://rclone.org/docs/#color-autoneveralways) โ options areAUTO,NEVER,ALWAYS๐ - The initial listing snapshots of
Path1andPath2are now generated concurrently, using the same"march"infrastructure ascheckandsync, which means better performance and less chance of something going wrong (https://forum.rclone.org/t/bisync-bugs-and-feature-requests/37636#:~:text=4.%20Listings%20should%20alternate%20between%20paths%20to%20minimize%20errors) ๐ - Unicode normalization handling and case insensitivity are fixed, plus there's support for
--fix-case(https://rclone.org/docs/#fix-case),--ignore-case-sync, and--no-unicode-normalization(https://rclone.org/docs/#no-unicode-normalization) ๐ --resyncis so much more efficient now (especially if you're out here using--create-empty-src-dirs) โญ- Google Docs โ and any other files with unknown size โ are supported (with the same options as in
sync) ๐ฆ - Equality checks before a sync conflict rename now fall back to
cryptcheck(when possible) or--download, instead of--size-only, whenevercheckisn't available ๐ - Bisync no longer fails to find the correct listing file when configs get overridden with backend-specific flags ๐
- Bisync now fully supports comparing based on any combination of size, modtime, and checksum โ the old restriction on backends without modtime support? Gone, periodt ๐
- Bisync now supports a
"Graceful Shutdown"mode, so you can cleanly cancel a run early without needing--resync๐ธ - New
--recoverflag lets you do robust recovery after interruptions, no--resyncrequired ๐ - New
--max-locksetting lets lock files automatically renew and expire, which means better automatic recovery when a run gets interrupted ๐ - Bisync now supports auto-resolving sync conflicts and customizing rename behavior with the new
--conflict-resolve,--conflict-loser, and--conflict-suffixflags โจ - New
--resync-modeflag gives you more control over which version of a file gets kept during a--resync๐ - Bisync now supports
--retries(https://rclone.org/docs/#retries-int) and--retries-sleep(when--resilientis set) ๐
v1.64
- Fixed an issue (https://forum.rclone.org/t/bisync-bugs-and-feature-requests/37636#:~:text=1.%20Dry%20runs%20are%20not%20completely%20dry) where dry runs would inadvertently commit filter changes โ not very dry of them ngl ๐ญ
- Fixed an issue (https://forum.rclone.org/t/bisync-bugs-and-feature-requests/37636#:~:text=2.%20%2D%2Dresync%20deletes%20data%2C%20contrary%20to%20docs) where
--resyncwould erroneously delete empty folders and duplicate files that were unique toPath2๐ --check-accessis now enforced during--resync, which prevents data loss in certain user error scenarios (https://forum.rclone.org/t/bisync-bugs-and-feature-requests/37636#:~:text=%2D%2Dcheck%2Daccess%20doesn%27t%20always%20fail%20when%20it%20should) ๐ก๏ธ- Fixed an issue (https://forum.rclone.org/t/bisync-bugs-and-feature-requests/37636#:~:text=5.%20Bisync%20reads%20files%20in%20excluded%20directories%20during%20delete%20operations) where bisync was considering way more files than it needed to, because the filters were overbroad during delete operations ๐
- Improved detection of false positive change conflicts (https://forum.rclone.org/t/bisync-bugs-and-feature-requests/37636#:~:text=1.%20Identical%20files%20should%20be%20left%20alone%2C%20even%20if%20new/newer/changed%20on%20both%20sides) โ identical files now get left alone instead of renamed ๐ซถ
- Added support for
--create-empty-src-dirs(https://forum.rclone.org/t/bisync-bugs-and-feature-requests/37636#:~:text=3.%20Bisync%20should%20create/delete%20empty%20directories%20as%20sync%20does%2C%20when%20%2D%2Dcreate%2Dempty%2Dsrc%2Ddirs%20is%20passed) โจ - Added experimental
--resilientmode so you can recover from self-correctable errors (https://forum.rclone.org/t/bisync-bugs-and-feature-requests/37636#:~:text=2.%20Bisync%20should%20be%20more%20resilient%20to%20self%2Dcorrectable%20errors) ๐ช - Added new
--ignore-listing-checksumflag (https://forum.rclone.org/t/bisync-bugs-and-feature-requests/37636#:~:text=6.%20%2D%2Dignore%2Dchecksum%20should%20be%20split%20into%20two%20flags%20for%20separate%20purposes) so it stays clearly distinct from--ignore-checksum๐ - Performance improvements (https://forum.rclone.org/t/bisync-bugs-and-feature-requests/37636#:~:text=6.%20Deletes%20take%20several%20times%20longer%20than%20copies) for large remotes ๐
- Documentation and testing improvements ๐
โจ Release signing ๐
okay so bestie, the hashes of the binary artefacts of the rclone release are signed with a public PGP/GPG key ๐ โ and yeah, you can verify this manually, and that is exactly the little journey we're going on below, no skipping anything.
The same mechanism is also used by rclone selfupdate (https://rclone.org/commands/rclone_selfupdate/) to verify that the release has not been tampered with before the new update is installed. It checks the SHA256 hash and the signature with a public key compiled into the rclone binary. ๐ซถ
๐ Release signing key
You may obtain the release signing key from:
- From
KEYSon this website โ this file contains all past signing keys also. - The git repository hosted on GitHub โ
https://github.com/rclone/rclone/blob/master/docs/content/KEYS gpg --keyserver hkps://keys.openpgp.org --search nick@craig-wood.comgpg --keyserver hkps://keyserver.ubuntu.com --search nick@craig-wood.comhttps://www.craig-wood.com/nick/pub/pgp-key.txt
After importing the key, verify that the fingerprint of one of the keys matches: FBF737ECE9F8AB18604BD2AC93935E02FF3B54FA ads this key is used for signing.
We recommend that you cross-check the fingerprint shown above through the domains listed below. By cross-checking the integrity of the fingerprint across multiple domains you can be confident that you obtained the correct key. trust but verify, it's giving responsible queen behaviour ๐
- The source for this page on GitHub (
https://github.com/rclone/rclone/blob/master/docs/content/release_signing.md). - Through DNS
dig key.rclone.org txt
If you find anything that doesn't not match, please contact the developers at once. ๐จ like, immediately.
๐ต๏ธโ๏ธ How to verify the release
In the release directory you will see the release files and some files called MD5SUMS, SHA1SUMS and SHA256SUMS.
$ rclone lsf --http-url https://downloads.rclone.org/v1.63.1 :http:
MD5SUMS
SHA1SUMS
SHA256SUMS
rclone-v1.63.1-freebsd-386.zip
rclone-v1.63.1-freebsd-amd64.zip
...
rclone-v1.63.1-windows-arm64.zip
rclone-v1.63.1.tar.gz
version.txt
The MD5SUMS, SHA1SUMS and SHA256SUMS contain hashes of the binary files in the release directory along with a signature. โจ
For example:
$ rclone cat --http-url https://downloads.rclone.org/v1.63.1 :http:SHA256SUMS
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
f6d1b2d7477475ce681bdce8cb56f7870f174cb6b2a9ac5d7b3764296ea4a113 rclone-v1.63.1-freebsd-386.zip
7266febec1f01a25d6575de51c44ddf749071a4950a6384e4164954dff7ac37e rclone-v1.63.1-freebsd-amd64.zip
...
66ca083757fb22198309b73879831ed2b42309892394bf193ff95c75dff69c73 rclone-v1.63.1-windows-amd64.zip
bbb47c16882b6c5f2e8c1b04229378e28f68734c613321ef0ea2263760f74cd0 rclone-v1.63.1-windows-arm64.zip
-----BEGIN PGP SIGNATURE-----
iF0EARECAB0WIQT79zfs6firGGBL0qyTk14C/ztU+gUCZLVKJQAKCRCTk14C/ztU
+pZuAJ0XJ+QWLP/3jCtkmgcgc4KAwd/rrwCcCRZQ7E+oye1FPY46HOVzCFU3L7g=
=8qrL
-----END PGP SIGNATURE-----
โฌ๏ธ Download the files
The first step is to download the binary and SUMs file and verify that the SUMs you have downloaded match. Here we download rclone-v1.63.1-windows-amd64.zip โ choose the binary (or binaries) appropriate to your architecture. We've also chosen the SHA256SUMS as these are the most secure. You could verify the other types of hash also for extra security. rclone selfupdate verifies just the SHA256SUMS.
mkdir /tmp/check
cd /tmp/check
rclone copy --http-url https://downloads.rclone.org/v1.63.1 :http:SHA256SUMS .
rclone copy --http-url https://downloads.rclone.org/v1.63.1 :http:rclone-v1.63.1-windows-amd64.zip .
โ Verify the signatures
First verify the signatures on the SHA256 file.
Import the key. See above for ways to verify this key is correct.
$ gpg --keyserver keyserver.ubuntu.com --receive-keys FBF737ECE9F8AB18604BD2AC93935E02FF3B54FA
gpg: key 93935E02FF3B54FA: public key "Nick Craig-Wood <nick@craig-wood.com>" imported
gpg: Total number processed: 1
gpg: imported: 1
Then check the signature:
$ gpg --verify SHA256SUMS
gpg: Signature made Mon 17 Jul 2023 15:03:17 BST
gpg: using DSA key FBF737ECE9F8AB18604BD2AC93935E02FF3B54FA
gpg: Good signature from "Nick Craig-Wood <nick@craig-wood.com>" [ultimate]
Verify the signature was good and is using the fingerprint shown above. ๐
Repeat for MD5SUMS and SHA1SUMS if desired.
๐ Verify the hashes
Now that we know the signatures on the hashes are OK we can verify the binaries match the hashes, completing the verification. full circle moment โจ
Extract the signed data with:
$ gpg --output SHA256SUMS.signed --decrypt SHA256SUMS
Then check the binaries:
$ sha256sum -c --ignore-missing SHA256SUMS.signed
rclone-v1.63.1-windows-amd64.zip: OK
Or do the check with rclone
$ rclone hashsum sha256 -C SHA256SUMS.signed rclone-v1.63.1-windows-amd64.zip
= rclone-v1.63.1-windows-amd64.zip
2023/09/11 10:53:58 NOTICE: Local file system at /tmp/check: 0 differences found
2023/09/11 10:53:58 NOTICE: Local file system at /tmp/check: 1 matching files
๐ Verify signatures and hashes together
You can verify the signatures and hashes in one command line like this:
$ h=$(gpg --decrypt SHA256SUMS) && echo "$h" | sha256sum - -c --ignore-missing
gpg: Signature made Mon 17 Jul 2023 15:03:17 BST
gpg: using DSA key FBF737ECE9F8AB18604BD2AC93935E02FF3B54FA
gpg: Good signature from "Nick Craig-Wood <nick@craig-wood.com>" [ultimate]
gpg: aka "Nick Craig-Wood <nick@memset.com>" [unknown]
rclone-v1.63.1-windows-amd64.zip: OK
one command, all the checks, main character energy honestly ๐
๐พ 1Fichier
Okay bestie, so this one? It's a backend for the 1fichier cloud storage service (that's https://1fichier.com for the girlies who need the link). Heads up though: you NEED a Premium subscription to use the API. No premium, no vibes. Periodt.
Paths are specified as remote:path
Paths may be as deep as required, e.g. remote:directory/subdirectory. Go as deep as your heart desires, queen. ๐
โ๏ธ Configuration
The initial setup for 1Fichier involves getting the API key from the website which you need to do in your browser. Yes, browser. Yes, you have to actually go do it. Sorry babe. ๐ซถ
Here is an example of how to make a remote called remote. First run:
rclone config
This will guide you through an interactive setup process:
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
name> remote
Type of storage to configure.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
[snip]
XX / 1Fichier
\ "fichier"
[snip]
Storage> fichier
** See help for fichier backend at: https://rclone.org/fichier/ **
Your API Key, get it from https://1fichier.com/console/params.pl
Enter a string value. Press Enter for the default ("").
api_key> example_key
Edit advanced config? (y/n)
y) Yes
n) No
y/n>
Remote config
Configuration complete.
Options:
- type: fichier
- api_key: example_key
Keep this "remote" remote?
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d> y
Once configured you can then use rclone like this (replace remote with the name you gave your remote):
List directories in top level of your 1Fichier account
rclone lsd remote:
List all the files in your 1Fichier account
rclone ls remote:
To copy a local directory to a 1Fichier directory called backup
rclone copy /home/source remote:backup
๐ฐ๏ธ Modification times and hashes
1Fichier does not support modification times. It supports the Whirlpool hash algorithm. So yeah, timestamps are not the moment here, but Whirlpool is serving. โจ
๐ฏ Duplicated files
1Fichier can have two files with exactly the same name and path (unlike a normal file system). It's giving chaos, honestly.
Duplicated files cause problems with the syncing and you will see messages in the log about duplicates. Not a vibe. Watch your logs bestie.
๐ซ Restricted filename characters
In addition to the default restricted characters set (https://rclone.org/overview/#restricted-characters) the following characters are also replaced:
\โ0x5Cโ๏ผผ<โ0x3Cโ๏ผ>โ0x3Eโ๏ผ"โ0x22โ๏ผ$โ0x24โ๏ผ`โ0x60โ๏ฝ'โ0x27โ๏ผ
File names can also not start or end with the following characters. These only get replaced if they are the first or last character in the name:
SPโ0x20โโ
Invalid UTF-8 bytes will also be replaced (https://rclone.org/overview/#invalid-utf8), as they can't be used in JSON strings. JSON said no. ๐
โจ Standard options
Here are the Standard options specific to fichier (1Fichier).
๐ --fichier-api-key
Your API Key, get it from https://1fichier.com/console/params.pl.
Properties:
- Config:
api_key - Env Var:
RCLONE_FICHIER_API_KEY - Type: string
- Required: false
๐ Advanced options
Here are the Advanced options specific to fichier (1Fichier).
๐ธ --fichier-shared-folder
If you want to download a shared folder, add this parameter.
Properties:
- Config:
shared_folder - Env Var:
RCLONE_FICHIER_SHARED_FOLDER - Type: string
- Required: false
๐ --fichier-file-password
If you want to download a shared file that is password protected, add this parameter.
NB Input to this must be obscured - see rclone obscure (https://rclone.org/commands/rclone_obscure/).
Properties:
- Config:
file_password - Env Var:
RCLONE_FICHIER_FILE_PASSWORD - Type: string
- Required: false
๐ --fichier-folder-password
If you want to list the files in a shared folder that is password protected, add this parameter.
NB Input to this must be obscured - see rclone obscure (https://rclone.org/commands/rclone_obscure/).
Properties:
- Config:
folder_password - Env Var:
RCLONE_FICHIER_FOLDER_PASSWORD - Type: string
- Required: false
โก --fichier-cdn
Set if you wish to use CDN download links.
Properties:
- Config:
cdn - Env Var:
RCLONE_FICHIER_CDN - Type: bool
- Default:
false
๐ค --fichier-encoding
The encoding for the backend.
See the encoding section in the overview (https://rclone.org/overview/#encoding) for more info.
Properties:
- Config:
encoding - Env Var:
RCLONE_FICHIER_ENCODING - Type: Encoding
- Default:
Slash,LtGt,DoubleQuote,SingleQuote,BackQuote,Dollar,BackSlash,Del,Ctl,LeftSpace,RightSpace,InvalidUtf8,Dot
๐ --fichier-description
Description of the remote.
Properties:
- Config:
description - Env Var:
RCLONE_FICHIER_DESCRIPTION - Type: string
- Required: false
๐ Limitations
rclone about is not supported by the 1Fichier backend. Backends without this capability cannot determine free space for an rclone mount or use policy mfs (most free space) as a member of an rclone union remote.
See List of backends that do not support rclone about (https://rclone.org/overview/#optional-features) and rclone about (https://rclone.org/commands/rclone_about/).
๐ช Alias
The alias remote provides a new name for another remote. It's literally giving "same girl, different name." ๐
Paths may be as deep as required or a local path, e.g. remote:directory/subdirectory or /directory/subdirectory.
During the initial setup with rclone config you will specify the target remote. The target remote can either be a local path or another remote.
Subfolders can be used in target remote. Assume an alias remote named backup with the target mydrive:private/backup. Invoking rclone mkdir backup:desktop is exactly the same as invoking rclone mkdir mydrive:private/backup/desktop.
There will be no special handling of paths containing .. segments. Invoking rclone mkdir backup:../desktop is exactly the same as invoking rclone mkdir mydrive:private/backup/../desktop. The empty path is not allowed as a remote. To alias the current directory use . instead.
The target remote can also be a connection string (https://rclone.org/docs/#connection-strings). This can be used to modify the config of a remote for different uses, e.g. the alias myDriveTrash with the target remote myDrive,trashed_only: can be used to only show the trashed files in myDrive. Iconic flexibility tbh.
โ๏ธ Configuration
Here is an example of how to make an alias called remote for local folder. First run:
rclone config
This will guide you through an interactive setup process:
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
name> remote
Type of storage to configure.
Choose a number from below, or type in your own value
[snip]
XX / Alias for an existing remote
\ "alias"
[snip]
Storage> alias
Remote or path to alias.
Can be "myremote:path/to/dir", "myremote:bucket", "myremote:" or "/local/path".
remote> /mnt/storage/backup
Remote config
Configuration complete.
Options:
- type: alias
- remote: /mnt/storage/backup
Keep this "remote" remote?
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d> y
Current remotes:
Name Type
==== ====
remote alias
e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
e/n/d/r/c/s/q> q
Once configured you can then use rclone like this (replace remote with the name you gave your remote):
List directories in top level in /mnt/storage/backup
rclone lsd remote:
List all the files in /mnt/storage/backup
rclone ls remote:
Copy another local directory to the alias directory called source
rclone copy /home/source remote:source
โจ Standard options
Here are the Standard options specific to alias (Alias for an existing remote).
๐ฏ --alias-remote
Remote or path to alias.
Can be "myremote:path/to/dir", "myremote:bucket", "myremote:" or "/local/path".
Properties:
- Config:
remote - Env Var:
RCLONE_ALIAS_REMOTE - Type: string
- Required: true
๐ Advanced options
Here are the Advanced options specific to alias (Alias for an existing remote).
๐ --alias-description
Description of the remote.
Properties:
- Config:
description - Env Var:
RCLONE_ALIAS_DESCRIPTION - Type: string
- Required: false
โ๏ธ Amazon S3 Storage Providers
The S3 backend can be used with a number of different providers. It's giving universal compatibility, and honestly? Slay. ๐ซถ
- AWS S3
- Alibaba Cloud (Aliyun) Object Storage System (OSS)
- Ceph
- China Mobile Ecloud Elastic Object Storage (EOS)
- Cloudflare R2
- Arvan Cloud Object Storage (AOS)
- Bizfly Cloud Simple Storage
- Cubbit DS3
- DigitalOcean Spaces
- Dreamhost
- Exaba
- Fastly Object Storage
- FileLu S5 (S3-Compatible Object Storage)
- GCS
- Hetzner
- Hitachi Content Platform (HCP)
- Huawei OBS
- IBM COS S3
- IDrive e2
- Impossible Cloud
- Intercolo Object Storage
- IONOS Cloud
- Leviia Object Storage
- Liara Object Storage
- Linode Object Storage
- Magalu Object Storage
- MEGA S4 Object Storage
- Minio
- Outscale
- OVHcloud
- Petabox
- Pure Storage FlashBlade
- Qiniu Cloud Object Storage (Kodo)
- Rabata Cloud Storage
- RackCorp Object Storage
- Rclone Serve S3
- Scaleway
- Scality (RING / ARTESCA)
- Seagate Lyve Cloud
- SeaweedFS
- Selectel
- Servercore Object Storage
- Spectra Logic
- Storj
And bestie we are so not done โ there's more coming, keep scrolling. ๐
- Synology C2 Object Storage ๐
- Tencent Cloud Object Storage (COS) ๐งก
- US3 ๐
- Wasabi ๐
- Zadara Object Storage ๐ค
- Zata ๐
- Zero Services (ZERO-Z3) ๐ค
okay so now the fun part โ actually using the thing bestie โจ
Paths go like remote:bucket (or just remote: if you're running the lsd command, that one's special). And yes you can absolutely nest subdirectories in there too, like remote:bucket/path/to/dir ๐ธ
Once you've made yourself a remote (scroll up to the provider-specific section if you need it ๐) you can use it like this:
See all buckets
rclone lsd remote:
Make a new bucket
rclone mkdir remote:bucket
List the contents of a bucket
rclone ls remote:bucket
Sync /home/local/directory to the remote bucket, deleting any excess files in the bucket.
rclone sync --interactive /home/local/directory remote:bucket
heads up bestie ๐ that sync one deletes the excess files in the bucket. That's the whole point of sync, but likeโฆ know that going in ๐
โ๏ธ Configuration
okay so here's a whole walkthrough of making an s3 configuration for the AWS S3 provider ๐ซถ Most of it applies to the other providers too โ any differences are described below (which is giving "read the fine print but honestly it's fine" energy).
First run
rclone config
and it'll hold your hand through an interactive setup process, like this ๐
No remotes found, make a new one\?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
name> remote
Type of storage to configure.
Choose a number from below, or type in your own value
[snip]
XX / Amazon S3 Compliant Storage Providers including AWS, ...
\ "s3"
[snip]
Storage> s3
Choose your S3 provider.
Choose a number from below, or type in your own value
1 / Amazon Web Services (AWS) S3
\ "AWS"
2 / Ceph Object Storage
\ "Ceph"
3 / DigitalOcean Spaces
\ "DigitalOcean"
4 / Dreamhost DreamObjects
\ "Dreamhost"
5 / IBM COS S3
\ "IBMCOS"
6 / Minio Object Storage
\ "Minio"
7 / Wasabi Object Storage
\ "Wasabi"
8 / Any other S3 compatible provider
\ "Other"
provider> 1
Get AWS credentials from runtime (environment variables or EC2/ECS meta data if no env vars). Only applies if access_key_id and secret_access_key is blank.
Choose a number from below, or type in your own value
1 / Enter AWS credentials in the next step
\ "false"
2 / Get AWS credentials from the environment (env vars or IAM)
\ "true"
env_auth> 1
AWS Access Key ID - leave blank for anonymous access or runtime credentials.
access_key_id> XXX
AWS Secret Access Key (password) - leave blank for anonymous access or runtime credentials.
secret_access_key> YYY
Region to connect to.
Choose a number from below, or type in your own value
/ The default endpoint - a good choice if you are unsure.
1 | US Region, Northern Virginia, or Pacific Northwest.
| Leave location constraint empty.
\ "us-east-1"
/ US East (Ohio) Region
2 | Needs location constraint us-east-2.
\ "us-east-2"
/ US West (Oregon) Region
3 | Needs location constraint us-west-2.
\ "us-west-2"
/ US West (Northern California) Region
4 | Needs location constraint us-west-1.
\ "us-west-1"
/ Canada (Central) Region
5 | Needs location constraint ca-central-1.
\ "ca-central-1"
/ EU (Ireland) Region
6 | Needs location constraint EU or eu-west-1.
\ "eu-west-1"
/ EU (London) Region
7 | Needs location constraint eu-west-2.
\ "eu-west-2"
/ EU (Frankfurt) Region
8 | Needs location constraint eu-central-1.
\ "eu-central-1"
/ Asia Pacific (Singapore) Region
9 | Needs location constraint ap-southeast-1.
\ "ap-southeast-1"
/ Asia Pacific (Sydney) Region
10 | Needs location constraint ap-southeast-2.
\ "ap-southeast-2"
/ Asia Pacific (Tokyo) Region
11 | Needs location constraint ap-northeast-1.
\ "ap-northeast-1"
/ Asia Pacific (Seoul)
12 | Needs location constraint ap-northeast-2.
\ "ap-northeast-2"
/ Asia Pacific (Mumbai)
13 | Needs location constraint ap-south-1.
\ "ap-south-1"
/ Asia Pacific (Hong Kong) Region
14 | Needs location constraint ap-east-1.
\ "ap-east-1"
/ South America (Sao Paulo) Region
15 | Needs location constraint sa-east-1.
\ "sa-east-1"
region> 1
Endpoint for S3 API.
Leave blank if using AWS to use the default endpoint for the region.
endpoint>
Location constraint - must be set to match the Region. Used when creating buckets only.
Choose a number from below, or type in your own value
1 / Empty for US Region, Northern Virginia, or Pacific Northwest.
\ ""
2 / US East (Ohio) Region.
\ "us-east-2"
3 / US West (Oregon) Region.
\ "us-west-2"
4 / US West (Northern California) Region.
\ "us-west-1"
5 / Canada (Central) Region.
\ "ca-central-1"
6 / EU (Ireland) Region.
\ "eu-west-1"
7 / EU (London) Region.
\ "eu-west-2"
8 / EU Region.
\ "EU"
9 / Asia Pacific (Singapore) Region.
\ "ap-southeast-1"
10 / Asia Pacific (Sydney) Region.
\ "ap-southeast-2"
11 / Asia Pacific (Tokyo) Region.
\ "ap-northeast-1"
12 / Asia Pacific (Seoul)
\ "ap-northeast-2"
13 / Asia Pacific (Mumbai)
\ "ap-south-1"
14 / Asia Pacific (Hong Kong)
\ "ap-east-1"
15 / South America (Sao Paulo) Region.
\ "sa-east-1"
location_constraint> 1
Canned ACL used when creating buckets and/or storing objects in S3.
For more info visit https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#canned-acl
Choose a number from below, or type in your own value
1 / Owner gets FULL_CONTROL. No one else has access rights (default).
\ "private"
2 / Owner gets FULL_CONTROL. The AllUsers group gets READ access.
\ "public-read"
/ Owner gets FULL_CONTROL. The AllUsers group gets READ and WRITE access.
3 | Granting this on a bucket is generally not recommended.
\ "public-read-write"
4 / Owner gets FULL_CONTROL. The AuthenticatedUsers group gets READ access.
\ "authenticated-read"
/ Object owner gets FULL_CONTROL. Bucket owner gets READ access.
5 | If you specify this canned ACL when creating a bucket, Amazon S3 ignores it.
\ "bucket-owner-read"
/ Both the object owner and the bucket owner get FULL_CONTROL over the object.
6 | If you specify this canned ACL when creating a bucket, Amazon S3 ignores it.
\ "bucket-owner-full-control"
acl> 1
The server-side encryption algorithm used when storing this object in S3.
Choose a number from below, or type in your own value
1 / None
\ ""
2 / AES256
\ "AES256"
server_side_encryption> 1
The storage class to use when storing objects in S3.
Choose a number from below, or type in your own value
1 / Default
\ ""
2 / Standard storage class
\ "STANDARD"
3 / Reduced redundancy storage class
\ "REDUCED_REDUNDANCY"
4 / Standard Infrequent Access storage class
\ "STANDARD_IA"
5 / One Zone Infrequent Access storage class
\ "ONEZONE_IA"
6 / Glacier Flexible Retrieval storage class
\ "GLACIER"
7 / Glacier Deep Archive storage class
\ "DEEP_ARCHIVE"
8 / Intelligent-Tiering storage class
\ "INTELLIGENT_TIERING"
9 / Glacier Instant Retrieval storage class
\ "GLACIER_IR"
storage_class> 1
Remote config
Configuration complete.
Options:
- type: s3
- provider: AWS
- env_auth: false
- access_key_id: XXX
- secret_access_key: YYY
- region: us-east-1
- endpoint:
- location_constraint:
- acl: private
- server_side_encryption:
- storage_class:
Keep this "remote" remote?
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d>
likeโฆ that whole thing. Every option, every prompt, right there ๐ And honestly the defaults are doing a lot of the heavy lifting, you just keep pressing numbers ๐
โฑ๏ธ Modification times and hashes
๐ซ Modification times
The modified time gets stored as metadata on the object as X-Amz-Meta-Mtime, as floating point since the epoch, accurate to 1 ns โญ (yes, nanosecond accuracy, we're bougie like that).
If the modification time needs to be updated, rclone will attempt to perform a server side copy to update the modification โ but only if the object can be copied in a single part. And if the object is larger than 5Gb, or it's chilling in Glacier or Glacier Deep Archive storage, then rip, the object gets uploaded rather than copied ๐ญ
Also note: reading this from the object costs you an additional HEAD request, because the metadata isn't returned in object listings. It's giving "extra ticket, extra line" energy ๐๏ธ
๐ Hashes
For small objects which weren't uploaded as multipart uploads (objects sized below --s3-upload-cutoff if uploaded with rclone) rclone uses the ETag: header as an MD5 checksum โจ easy, clean, no notes.
But โ and this is the plot twist โ for objects which were uploaded as multipart uploads or with server side encryption (SSE-AWS or SSE-C), the ETag header is no longer the MD5 sum of the data. So rclone adds an additional piece of metadata called X-Amz-Meta-Md5chksum, which is a base64 encoded MD5 hash (in the same format as is required for Content-MD5) ๐ง
You can use base64 -d and hexdump to check this value manually:
echo 'VWTGdNx3LyXQDfA0e2Edxw==' | base64 -d | hexdump
or you can use rclone check to verify the hashes are OK ๐ซถ (honestly bestie, just use rclone check, it's the vibe)
For large objects, calculating this hash can take some time, so the addition of this hash can be disabled with --s3-disable-checksum. That will mean that these objects do not have an MD5 checksum ๐ถ no checksum, no cap.
And same disclaimer as above: reading this from the object takes an additional HEAD request, as the metadata isn't returned in object listings.
๐ธ Reducing costs
Bestie, S3 is amazing but it will absolutely drain your coins if you let it, so here's how to be cheap AND fast. ๐
๐ Avoiding HEAD requests to read the modification time
So by default, rclone uses the modification time of objects stored in S3 for syncing. Sounds innocent right? WRONG. That time is stored in object metadata which unfortunately takes an extra HEAD request to read, and that can be expensive โ in time AND in money. ๐
The modification time is used by default for all operations that require checking the time a file was last updated. It lets rclone treat the remote more like a true filesystem, which is the vibe, but it's inefficient on S3 because it requires an extra API call to retrieve the metadata.
Good news: the extra API calls can be avoided when syncing (using rclone sync or rclone copy) in a few different ways, and each one has its own tradeoffs. Pick your fighter:
--size-only- Only checks the size of files.
- Uses no extra transactions.
- If the file doesn't change size then rclone won't detect it has changed.
rclone sync --size-only /path/to/source s3:bucket
--checksum- Checks the size and MD5 checksum of files.
- Uses no extra transactions.
- The most accurate detection of changes possible.
- Will cause the source to read an MD5 checksum which, if it is a local disk, will cause lots of disk activity.
- If the source and destination are both S3 this is the recommended flag to use for maximum efficiency.
rclone sync --checksum /path/to/source s3:bucket
--update --use-server-modtime- Uses no extra transactions.
- Modification time becomes the time the object was uploaded.
- For many operations this is sufficient to determine if it needs uploading.
- Using
--updatealong with--use-server-modtime, avoids the extra API call and uploads files whose local modification time is newer than the time it was last uploaded. - Files created with timestamps in the past will be missed by the sync.
rclone sync --update --use-server-modtime /path/to/source s3:bucket
These flags can and should be used in combination with --fast-list โ see below ๐
If using rclone mount or any command using the VFS (eg rclone serve) commands then you might want to consider using the VFS flag --no-modtime which will stop rclone reading the modification time for every object. You could also use --use-server-modtime if you are happy with the modification times of the objects being the time of upload. โจ
๐ซ Avoiding GET requests to read directory listings
Rclone's default directory traversal is to process each directory individually. That's one API call per directory, and honestly? It adds up. ๐
Using the --fast-list flag will read all info about the objects into memory first using a smaller number of API calls (one per 1000 objects). Check the rclone docs at https://rclone.org/docs/#fast-list for more details.
rclone sync --fast-list --checksum /path/to/source s3:bucket
--fast-list trades off API transactions for memory use. As a rough guide rclone uses 1k of memory per object stored, so using --fast-list on a sync of a million objects will use roughly 1 GiB of RAM. ๐
If you are only copying a small number of files into a big repository then using --no-traverse is a good idea. This finds objects directly instead of through directory listings. You can do a "top-up" sync very cheaply by using --max-age and --no-traverse to copy only recent files, eg
rclone copy --max-age 24h --no-traverse /path/to/source s3:bucket
You'd then do a full rclone sync less often. โจ
Note that --fast-list isn't required in the top-up sync.
๐ Avoiding HEAD requests after PUT
By default, rclone will HEAD every object it uploads. It does this to check the object got uploaded correctly. Very protective of you, honestly. ๐ซถ
You can disable this with the --s3-no-head option โ see there for more details.
Setting this flag increases the chance for undetected upload failures. So likeโฆ your call bestie. ๐ญ
๐ฅ Increasing performance
๐ฏ Using server-side copy
If you are copying objects between S3 buckets in the same region, you should use server-side copy. This is much faster than downloading and re-uploading the objects, as no data is transferred. It's giving free real estate. ๐
For rclone to use server-side copy, you must use the same remote for the source and destination.
rclone copy s3:source-bucket s3:destination-bucket
When using server-side copy, the performance is limited by the rate at which rclone issues API requests to S3. See below for how to increase the number of API requests rclone makes. โญ
๐ Increasing the rate of API requests
You can increase the rate of API requests to S3 by increasing the parallelism using --transfers and --checkers options.
Rclone uses a very conservative default for these settings, as not all providers support high rates of requests. Depending on your provider, you can increase significantly the number of transfers and checkers. ๐
For example, with AWS S3, if you can increase the number of checkers to values like 200. If you are doing a server-side copy, you can also increase the number of transfers to 200.
rclone sync --transfers 200 --checkers 200 --checksum s3:source-bucket s3:destination-bucket
You will need to experiment with these values to find the optimal settings for your setup. Science, but make it storage. ๐ง
๐ก๏ธ Data integrity
Rclone does its best to verify every part of an upload or download to the s3 provider using various hashes. No cap.
Every HTTP transaction to/from the provider has a X-Amz-Content-Sha256 or a Content-Md5 header to guard against corruption of the HTTP body. The HTTP Header is protected by the signature passed in the Authorization header.
All communications with the provider is done over https for encryption and additional error protection. ๐
๐ Single part uploads
- Rclone uploads single part uploads with a
Content-Md5using the MD5 hash read from the source. The provider checks this is correct on receipt of the data. - Rclone then does a HEAD request (disable with
--s3-no-head) to read theETagback which is the MD5 of the file and checks that with what it sent.
Note that if the source does not have an MD5 then the single part uploads will not have hash protection. In this case it is recommended to use --s3-upload-cutoff 0 so all files are uploaded as multipart uploads. ๐
๐งฉ Multipart uploads
For files above --s3-upload-cutoff rclone splits the file into multiple parts for upload.
- Each part is protected with both an
X-Amz-Content-Sha256and aContent-Md5
When rclone has finished the upload of all the parts it then completes the upload by sending:
- The MD5 hash of each part
- The number of parts
- This info is all protected with a
X-Amz-Content-Sha256
The provider checks the MD5 for all the parts it has received against what rclone sends and if it is good it returns OK.
Rclone then does a HEAD request (disable with --s3-no-head) and checks the ETag is what it expects (in this case it should be the MD5 sum of all the MD5 sums of all the parts with the number of parts on the end).
If the source has an MD5 sum then rclone will attach the X-Amz-Meta-Md5chksum with it as the ETag for a multipart upload can't easily be checked against the file as the chunk size must be known in order to calculate it.
โฌ๏ธ Downloads
Rclone checks the MD5 hash of the data downloaded against either the ETag or the X-Amz-Meta-Md5chksum metadata (if present) which rclone uploads with multipart uploads.
๐ Further checking
At each stage rclone and the provider are sending and checking hashes of everything. Rclone deliberately HEADs each object after upload to check it arrived safely for extra security. (You can disable this with --s3-no-head).
If you require further assurance that your data is intact you can use rclone check to check the hashes locally vs the remote.
And if you are feeling ultimately paranoid use rclone check --download which will download the files and check them against the local copies. (Note that this doesn't use disk to do this โ it streams them in memory). ๐โจ
๐ฐ๏ธ Versions
When bucket versioning is enabled (this can be done with rclone with the rclone backend versioning command) when rclone uploads a new version of a file it creates a new version of it at https://docs.aws.amazon.com/AmazonS3/latest/userguide/Versioning.html Likewise when you delete a file, the old version will be marked hidden and still be available.
Old versions of files, where available, are visible using the --s3-versions flag.
It is also possible to view a bucket as it was at a certain point in time, using the --s3-version-at flag. This will show the file versions as they were at that time, showing files that have been deleted afterwards, and hiding files that were created since. Time travel but for buckets, iconic. ๐ฆ
If you wish to remove all the old versions then you can use the rclone backend cleanup-hidden remote:bucket command which will delete all the old hidden versions of files, leaving the current ones intact. You can also supply a path and only old versions under that path will be deleted, e.g. rclone backend cleanup-hidden remote:bucket/path/to/stuff.
When you purge a bucket, the current and the old versions will be deleted then the bucket will be deleted.
However delete will cause the current versions of the files to become hidden old versions.
Here is a session showing the listing and retrieval of an old version followed by a cleanup of the old versions.
Show current version and all the versions with --s3-versions flag.
$ rclone -q ls s3:cleanup-test
9 one.txt
$ rclone -q --s3-versions ls s3:cleanup-test
9 one.txt
8 one-v2016-07-04-141032-000.txt
16 one-v2016-07-04-141003-000.txt
15 one-v2016-07-02-155621-000.txt
Retrieve an old version
$ rclone -q --s3-versions copy s3:cleanup-test/one-v2016-07-04-141003-000.txt /tmp
$ ls -l /tmp/one-v2016-07-04-141003-000.txt
-rw-rw-r-- 1 ncw ncw 16 Jul 2 17:46 /tmp/one-v2016-07-04-141003-000.txt
Clean up all the old versions and show that they've gone.
$ rclone -q backend cleanup-hidden s3:cleanup-test
$ rclone -q ls s3:cleanup-test
9 one.txt
$ rclone -q --s3-versions ls s3:cleanup-test
9 one.txt
โ ๏ธ Versions naming caveat
When using --s3-versions flag rclone is relying on the file name to work out whether the objects are versions or not. Versions' names are created by inserting timestamp between file name and its extension.
9 file.txt
8 file-v2023-07-17-161032-000.txt
16 file-v2023-06-15-141003-000.txt
If there are real files present with the same names as versions, then behaviour of --s3-versions can be unpredictable. ๐ญ Be careful out there bestie.
๐งผ Cleanup
ok so bestie, if you run rclone cleanup s3:bucket it will yeet all pending multipart uploads older than 24 hours ๐
you can totally use the --interactive/i or --dry-run flag to see exactly what it's about to do before it does it (protect your peace fr fr). if you want more control over the expiry date, run rclone backend cleanup s3:bucket -o max-age=1h to expire all uploads older than one hour โจ and you can run rclone backend list-multipart-uploads s3:bucket to peek at the pending multipart uploads, like a little gossip session for your bucket ๐
๐ซ Restricted filename characters
S3 allows any valid UTF-8 string as a key, no cap ๐ซถ
Invalid UTF-8 bytes will be replaced (see the invalid UTF-8 overview at https://rclone.org/overview/#invalid-utf8), because they literally can't be used in XML ๐ญ
The following characters are replaced since these are problematic when dealing with the REST API:
- Character
NULโ value0x00โ replacementโ - Character
/โ value0x2Fโ replacement๏ผ
The encoding will also encode these file names as they don't seem to work with the SDK properly:
- File name
.โ replacement๏ผ - File name
..โ replacement๏ผ๏ผ
โ ๏ธ Important note about double slashes (//)
Object keys containing consecutive forward slashes (//) are not supported by rclone. periodt.
When rclone encounters an object key with // (e.g. a//b), it will normalize the path to use a single slash (e.g. a/b). This normalization can cause "object not found" errors when trying to access the original object, as rclone will look for the normalized path instead of the actual object key ๐
Example:
- Original S3 object key:
folder//file.txt - rclone interprets it as:
folder/file.txt - Result: "object not found" error when trying to access
folder//file.txt
Workaround: Avoid using consecutive forward slashes (//) in S3 object keys when using rclone. If you have existing objects with // in their keys, you will need to rename them to use single slashes or access them through other means ๐
๐ฆ Multipart uploads
rclone supports multipart uploads with S3 which means that it can upload files bigger than 5 GiB ๐ฅ
Note that files uploaded both with multipart upload and through crypt remotes do not have MD5 sums.
rclone switches from single part uploads to multipart uploads at the point specified by --s3-upload-cutoff. This can be a maximum of 5 GiB and a minimum of 0 (ie always upload multipart files).
The chunk sizes used in the multipart upload are specified by --s3-chunk-size and the number of chunks uploaded concurrently is specified by --s3-upload-concurrency.
Multipart uploads will use extra memory equal to: --transfers ร --s3-upload-concurrency ร --s3-chunk-size. Single part uploads do not use extra memory โจ
Single part transfers can be faster than multipart transfers or slower depending on your latency from S3 โ the more latency, the more likely single part transfers will be faster.
Increasing --s3-upload-concurrency will increase throughput (8 would be a sensible value) and increasing --s3-chunk-size also increases throughput (16M would be sensible). Increasing either of these will use more memory. The default values are high enough to gain most of the possible performance without using too much memory ๐
๐ชฃ Buckets and Regions
With Amazon S3 you can list buckets (rclone lsd) using any region, but you can only access the content of a bucket from the region it was created in ๐ if you attempt to access a bucket from the wrong region, you will get an error:
incorrect region, the bucket is not in 'XXX' region
๐ Authentication
There are a number of ways to supply rclone with a set of AWS credentials, with and without using the environment ๐ซถ
The different authentication methods are tried in this order:
- Directly in the rclone configuration file (
env_auth = falsein the config file):access_key_idandsecret_access_keyare required.session_tokencan be optionally set when using AWS STS.
- Runtime configuration (
env_auth = truein the config file):- Export the following environment variables before running rclone:
- Access Key ID:
AWS_ACCESS_KEY_IDorAWS_ACCESS_KEY - Secret Access Key:
AWS_SECRET_ACCESS_KEYorAWS_SECRET_KEY - Session Token:
AWS_SESSION_TOKEN(optional)
- Access Key ID:
- Or, use a named profile (see the AWS CLI configure files docs at
https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html):- Profile files are standard files used by AWS CLI tools
- By default it will use the profile in your home directory (e.g.
~/.aws/credentialson unix based systems) file and the"default"profile, to change set these environment variables or config keys:AWS_SHARED_CREDENTIALS_FILEto control which file or theshared_credentials_fileconfig key.AWS_PROFILEto control which profile to use or theprofileconfig key.
- Or, run rclone in an ECS task with an IAM role (AWS only).
- Or, run rclone on an EC2 instance with an IAM role (AWS only).
- Or, run rclone in an EKS pod with an IAM role that is associated with a service account (AWS only).
- Or, use process credentials (see
https://docs.aws.amazon.com/sdkref/latest/guide/feature-process-credentials.html) to read config from an external program.
- Export the following environment variables before running rclone:
With env_auth = true rclone (which uses the SDK for Go v2) should support all authentication methods (https://docs.aws.amazon.com/sdkref/latest/guide/standardized-credentials.html) that the aws CLI tool does and the other AWS SDKs ๐
If none of these option actually end up providing rclone with AWS credentials then S3 interaction will be non-authenticated (see the anonymous access section for more info).
๐ญ Assume Role (Cross-Account Access)
If you need to access S3 resources in a different AWS account, you can use IAM role assumption ๐ง this is useful for cross-account access scenarios where you have credentials in one account but need to access resources in another account.
To use assume role, configure the following parameters:
role_arnโ The ARN (Amazon Resource Name) of the IAM role to assume in the target account. Format:arn:aws:iam::ACCOUNT-ID:role/ROLE-NAMErole_session_name(optional) โ A name for the assumed role session. If not specified, rclone will generate one automatically.role_session_duration(optional) โ Duration for which the assumed role credentials are valid. If not specified, AWS default duration will be used (typically 1 hour).role_external_id(optional) โ An external ID required by the role's trust policy for additional security. This is typically used when the role is accessed by a third party.
The assume role feature works with both direct credentials (env_auth = false) and environment-based authentication (env_auth = true). Rclone will first authenticate using the base credentials, then use those credentials to assume the specified role โจ
Example configuration for cross-account access:
[s3-cross-account]
type = s3
provider = AWS
env_auth = true
region = us-east-1
role_arn = arn:aws:iam::123456789012:role/CrossAccountS3Role
role_session_name = rclone-session
role_external_id = unique-role-external-id-12345
In this example:
- Base credentials are obtained from the environment (IAM role, credentials file, or environment variables)
- These credentials are then used to assume the role
CrossAccountS3Rolein account123456789012 - An external ID is provided for additional security as required by the role's trust policy
The target role's trust policy in the destination account must allow the source account or user to assume it. Example trust policy:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::SOURCE-ACCOUNT-ID:root"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"sts:ExternalID": "unique-role-external-id-12345"
}
}
}
]
}
๐ S3 Permissions
When using the sync subcommand of rclone the following minimum permissions are required to be available on the bucket being written to:
ListBucketDeleteObjectGetObjectPutObjectPutObjectACLCreateBucket(unless usings3-no-check-bucket)
When using the lsd subcommand, the ListAllMyBuckets permission is required ๐
Example policy:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::USER_SID:user/USER_NAME"
},
"Action": [
"s3:ListBucket",
"s3:DeleteObject",
"s3:GetObject",
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": [
"arn:aws:s3:::BUCKET_NAME/*",
"arn:aws:s3:::BUCKET_NAME"
]
},
{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "arn:aws:s3:::*"
}
]
}
Notes on above:
- This is a policy that can be used when creating bucket. It assumes that
USER_NAMEhas been created. - The
Resourceentry must include both resource ARNs, as one implies the bucket and the other implies the bucket's objects. - When using
s3-no-check-bucketand the bucket already exists, the"arn:aws:s3:::BUCKET_NAME"doesn't have to be included.
For reference, here's an Ansible script (https://gist.github.com/ebridges/ebfc9042dd7c756cd101cfa807b7ae2b) that will generate one or more buckets that will work with rclone sync ๐
๐๏ธ Key Management System (KMS)
If you are using server-side encryption with KMS then you must make sure rclone is configured with server_side_encryption = aws:kms โ otherwise you will find you can't transfer small objects ๐ญ these will create checksum errors ๐
๐ง Glacier and Glacier Deep Archive ๐ง
Okay so listen โ you can upload stuff using the glacier storage class, or yeet objects over to glacier later with a lifecycle policy (http://docs.aws.amazon.com/AmazonS3/latest/user-guide/create-lifecycle.html). The bucket itself still syncs and copies like normal, no drama. BUT. The second rclone tries to touch data chillin' in the glacier storage class, you get hit with an error that looks a lil like this:
2017/09/11 19:07:43 Failed to sync: failed to open source object: Object in GLACIER, restore first: path/to/file
When that happens, bestie, you gotta restore (http://docs.aws.amazon.com/AmazonS3/latest/user-guide/restore-archived-objects.html) the object(s) in question before you can get at the contents. The restore section down below shows how to do that with rclone. ๐
Heads up: rclone only speaks the S3 API โ it does not speak the Glacier Vault API, so rclone cannot directly access Glacier Vaults. No cap.
๐ Object-lock enabled S3 bucket ๐
Per AWS's documentation on S3 Object Lock (https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lock-overview.html#object-lock-permission):
If you configure a default retention period on a bucket, requests to upload objects in such a bucket must include the Content-MD5 header.
And the way rclone ate that? It automatically computes and includes the Content-MD5 header whenever you upload objects with Object Lock parameters set. Zero special configuration required. Iconic behaviour honestly. โจ
๐๏ธ Setting Object Lock retention ๐๏ธ
Rclone supports setting Object Lock retention on uploaded objects with these options:
--s3-object-lock-mode- Set the Object Lock mode (GOVERNANCEorCOMPLIANCE)--s3-object-lock-retain-until-date- Set the retention date (RFC3339 format or duration like365d,24h)--s3-object-lock-legal-hold-status- Set legal hold (ONorOFF)
Example โ upload files with 1 year GOVERNANCE retention:
rclone copy local:/data remote:bucket \
--s3-object-lock-mode GOVERNANCE \
--s3-object-lock-retain-until-date 365d
๐ Copying Object Lock settings from source ๐
When you're using --metadata, you can use the special value copy to preserve the source object's Object Lock settings:
rclone copy source:bucket dest:bucket \
--metadata \
--s3-object-lock-mode copy \
--s3-object-lock-retain-until-date copy
You can also mix copied and explicit values, like the multitasking queen you are. For example, to change the mode from COMPLIANCE to GOVERNANCE while preserving the original retention date:
rclone copy source:bucket dest:bucket \
--metadata \
--s3-object-lock-mode GOVERNANCE \
--s3-object-lock-retain-until-date copy
โ Additional Object Lock options โ
--s3-bypass-governance-retention- Required to delete or overwrite objects withGOVERNANCEmode retention before the retention date expires--s3-bucket-object-lock-enabled- Enable Object Lock when creating a new bucket withrclone mkdir--s3-object-lock-set-after-upload- Set Object Lock via separate API calls after upload (for providers that don't support Object Lock headers during PUT)
โญ Standard options โญ
Here are the Standard options specific to s3 (Amazon S3 Compliant Storage Providers including AWS, Alibaba, ArvanCloud, BizflyCloud, Ceph, ChinaMobile, Cloudflare, Cubbit, DigitalOcean, Dreamhost, Exaba, Fastly, FileLu, FlashBlade, GCS, HCP, Hetzner, HuaweiOBS, IBMCOS, IDrive, ImpossibleCloud, Intercolo, IONOS, Leviia, Liara, Linode, LyveCloud, Magalu, Mega, Minio, Netease, Outscale, OVHcloud, Petabox, Qiniu, Rabata, RackCorp, Rclone, Scaleway, Scality, SeaweedFS, Selectel, Servercore, SpectraLogic, Storj, Synology, TencentCOS, US3, Wasabi, Zadara, Zata, ZeroServices, Other). That's a lot of providers and yes, they're all valid. ๐ซถ
๐ --s3-provider ๐
Choose your S3 provider. Character selection screen but make it cloud storage.
Properties:
- Config:
provider - Env Var:
RCLONE_S3_PROVIDER - Type: string
- Required: false
- Examples:
"AWS"- Amazon Web Services (AWS) S3
"Alibaba"- Alibaba Cloud Object Storage System (OSS) formerly Aliyun
"ArvanCloud"- Arvan Cloud Object Storage (AOS)
"BizflyCloud"- Bizfly Cloud Simple Storage
"Ceph"- Ceph Object Storage
"ChinaMobile"- China Mobile Ecloud Elastic Object Storage (EOS)
"Cloudflare"- Cloudflare R2 Storage
"Cubbit"- Cubbit DS3 Object Storage
"DigitalOcean"- DigitalOcean Spaces
"Dreamhost"- Dreamhost DreamObjects
"Exaba"- Exaba Object Storage
"Fastly"- Fastly Object Storage
"FileLu"- FileLu S5 (S3-Compatible Object Storage)
"FlashBlade"- Pure Storage FlashBlade Object Storage
"GCS"- Google Cloud Storage
"HCP"- Hitachi Content Platform (HCP)
"Hetzner"- Hetzner Object Storage
"HuaweiOBS"- Huawei Object Storage Service
"IBMCOS"- IBM COS S3
"IDrive"- IDrive e2
"ImpossibleCloud"- Impossible Cloud Object Storage
"Intercolo"- Intercolo Object Storage
"IONOS"- IONOS Cloud
"Leviia"- Leviia Object Storage
"Liara"- Liara Object Storage
"Linode"- Linode Object Storage
"LyveCloud"- Seagate Lyve Cloud
"Magalu"- Magalu Object Storage
"Mega"- MEGA S4 Object Storage
"Minio"- Minio Object Storage
"Netease"- Netease Object Storage (NOS)
"Outscale"- OUTSCALE Object Storage (OOS)
"OVHcloud"- OVHcloud Object Storage
"Petabox"- Petabox Object Storage
"Qiniu"- Qiniu Object Storage (Kodo)
"Rabata"- Rabata Cloud Storage
"RackCorp"- RackCorp Object Storage
"Rclone"- Rclone S3 Server
"Scaleway"- Scaleway Object Storage
"Scality"- Scality (RING / ARTESCA)
"SeaweedFS"- SeaweedFS S3
"Selectel"- Selectel Object Storage
"Servercore"- Servercore Object Storage
"SpectraLogic"- Spectra Logic Black Pearl
"Storj"- Storj (S3 Compatible Gateway)
"Synology"- Synology C2 Object Storage
"TencentCOS"- Tencent Cloud Object Storage (COS)
"US3"- US3 Object Storage
"Wasabi"- Wasabi Object Storage
"Zadara"- Zadara Object Storage
"Zata"- Zata (S3 compatible Gateway)
"ZeroServices"- Zero Services GmbH (ZERO-Z3)
"Other"- Any other S3 compatible provider
๐ --s3-env-auth ๐
Get AWS credentials from runtime (environment variables or EC2/ECS metadata if no env vars). Only applies if access_key_id and secret_access_key is blank.
Properties:
- Config:
env_auth - Env Var:
RCLONE_S3_ENV_AUTH - Type: bool
- Default: false
- Examples:
"false"- Enter AWS credentials in the next step.
"true"- Get AWS credentials from the environment (env vars or IAM).
๐ชช --s3-access-key-id ๐ชช
AWS Access Key ID.
Leave blank for anonymous access or runtime credentials.
Properties:
- Config:
access_key_id - Env Var:
RCLONE_S3_ACCESS_KEY_ID - Type: string
- Required: false
๐คซ --s3-secret-access-key ๐คซ
AWS Secret Access Key (password).
Leave blank for anonymous access or runtime credentials.
Properties:
- Config:
secret_access_key - Env Var:
RCLONE_S3_SECRET_ACCESS_KEY - Type: string
- Required: false
๐ --s3-region ๐
Region to connect to.
Leave blank if you are using an S3 clone and you don't have a region.
Properties:
- Config:
region - Env Var:
RCLONE_S3_REGION - Provider: AWS,BizflyCloud,Ceph,Cloudflare,Cubbit,DigitalOcean,Dreamhost,Exaba,Fastly,FileLu,GCS,HCP,Hetzner,HuaweiOBS,IBMCOS,ImpossibleCloud,Intercolo,IONOS,Leviia,LyveCloud,Minio,Netease,Outscale,OVHcloud,Petabox,Qiniu,Rabata,RackCorp,Scaleway,Scality,SeaweedFS,Selectel,Servercore,Synology,Wasabi,Zadara,Zata,ZeroServices,Other
- Type: string
- Required: false
- Examples:
"us-east-1"- The default endpoint - a good choice if you are unsure.
- US Region, Northern Virginia, or Pacific Northwest.
- Leave location constraint empty.
- Provider: AWS
"us-east-2"- US East (Ohio) Region.
- Needs location constraint
us-east-2. - Provider: AWS
"us-west-1"- US West (Northern California) Region.
- Needs location constraint
us-west-1. - Provider: AWS
"us-west-2"- US West (Oregon) Region.
- Needs location constraint
us-west-2. - Provider: AWS
"ca-central-1"- Canada (Central) Region.
- Needs location constraint
ca-central-1. - Provider: AWS
"eu-west-1"- EU (Ireland) Region.
- Needs location constraint
EUoreu-west-1. - Provider: AWS
"eu-west-2"- EU (London) Region.
- Needs location constraint
eu-west-2. - Provider: AWS
"eu-west-3"- EU (Paris) Region.
- Needs location constraint
eu-west-3. - Provider: AWS
"eu-north-1"- EU (Stockholm) Region.
- Needs location constraint
eu-north-1. - Provider: AWS
"eu-south-1"- EU (Milan) Region.
- Needs location constraint
eu-south-1. - Provider: AWS
"eu-central-1"- EU (Frankfurt) Region.
- Needs location constraint
eu-central-1. - Provider: AWS
"ap-southeast-1"- Asia Pacific (Singapore) Region.
- Needs location constraint
ap-southeast-1. - Provider: AWS
"ap-southeast-2"- Asia Pacific (Sydney) Region.
- Needs location constraint
ap-southeast-2. - Provider: AWS
"ap-northeast-1"- Asia Pacific (Tokyo) Region.
- Needs location constraint
ap-northeast-1. - Provider: AWS
"ap-northeast-2"- Asia Pacific (Seoul).
- Needs location constraint
ap-northeast-2. ๐ bestie don't sleep on this one- Provider: AWS. โจ
"ap-northeast-3"- Asia Pacific (Osaka-Local). ๐ it's giving Kansai vibes
- Needs location constraint
ap-northeast-3. - Provider: AWS. ๐
"ap-south-1"- Asia Pacific (Mumbai). ๐ธ
- Needs location constraint
ap-south-1. - Provider: AWS. ๐ซถ
"ap-east-1"- Asia Pacific (Hong Kong) Region. ๐
- Needs location constraint
ap-east-1. - Provider: AWS. โญ
"sa-east-1"- South America (Sao Paulo) Region. ๐
- Needs location constraint
sa-east-1. - Provider: AWS. ๐ฅ
"il-central-1"- Israel (Tel Aviv) Region. โจ
- Needs location constraint
il-central-1. - Provider: AWS. ๐
"me-south-1"- Middle East (Bahrain) Region. ๐ฆ
- Needs location constraint
me-south-1. - Provider: AWS. ๐ซ
"af-south-1"- Africa (Cape Town) Region. ๐
- Needs location constraint
af-south-1. - Provider: AWS. ๐ง
"cn-north-1"- China (Beijing) Region. ๐ฎ
- Needs location constraint
cn-north-1. - Provider: AWS. ๐
"cn-northwest-1"- China (Ningxia) Region. ๐
- Needs location constraint
cn-northwest-1. - Provider: AWS. โจ
"us-gov-east-1"- AWS GovCloud (US-East) Region. ๐ฆ
- Needs location constraint
us-gov-east-1. - Provider: AWS. ๐
"us-gov-west-1"- AWS GovCloud (US) Region. ๐ฝ
- Needs location constraint
us-gov-west-1. - Provider: AWS. ๐ซถ
"hn"- Ha Noi. ๐ธ
- Provider: BizflyCloud. ๐
"hcm"- Ho Chi Minh. ๐บ
- Provider: BizflyCloud. โจ
""- Use this if unsure. ๐คทโ๏ธ lowkey the safe pick
- Will use v4 signatures and an empty region. ๐ฅ
- Provider:
Ceph,DigitalOcean,Dreamhost,Exaba,GCS,HCP,IBMCOS,Leviia,LyveCloud,Minio,Netease,Scality,SeaweedFS,Wasabi,Other. ๐
"other-v2-signature"- Use this only if v4 signatures don't work. โ ๏ธ
- E.g. pre Jewel/v10 CEPH. ๐
- Provider:
Ceph,DigitalOcean,Dreamhost,Exaba,GCS,HCP,IBMCOS,Leviia,LyveCloud,Minio,Netease,Scality,SeaweedFS,Wasabi,Other. ๐ญ
"auto"- R2 buckets are automatically distributed across Cloudflare's data centers for low latency. โก
- Provider: Cloudflare. ๐ฅ๏ธ
"eu-west-1"- Europe West. ๐ช๐บ
- Provider: Cubbit. ๐ง
"au-east-1"- AU East 1. ๐ฆ๐บ
- Provider: Fastly. ๐
"eu-central"- EU Central. ๐ช๐บ
- Provider: Fastly. ๐จ
"eu-south-1"- EU South 1. ๐ช๐บ
- Provider: Fastly. ๐
"eu-west-1"- EU West 1. ๐ช๐บ
- Provider: Fastly. ๐
"jp-central-1"- JP Central 1. ๐ฏ๐ต
- Provider: Fastly. ๐พ
"uk-east-1"- UK East 1. ๐ฌ๐ง
- Provider: Fastly. โ
"us-central-1"- US Central 1. ๐บ๐ธ
- Provider: Fastly. ๐ฝ
"us-east"- US East. ๐บ๐ธ
- Provider: Fastly. ๐ฝ
"us-east-1"- US East 1. ๐บ๐ธ
- Provider: Fastly. ๐ฆ
"us-west"- US West. ๐บ๐ธ
- Provider: Fastly. ๐
"us-west-1"- US West 1. ๐บ๐ธ
- Provider: Fastly. ๐
"global"- Global. ๐
- Provider: FileLu. ๐
"us-east"- North America (US-East). ๐
- Provider: FileLu. โจ
"eu-central"- Europe (EU-Central). ๐ช๐บ
- Provider: FileLu. ๐
"ap-southeast"- Asia Pacific (AP-Southeast). ๐
- Provider: FileLu. ๐ซถ
"me-central"- Middle East (ME-Central). ๐
- Provider: FileLu. ๐ซ
"hel1"- Helsinki. ๐ซ๐ฎ
- Provider: Hetzner. โ๏ธ
"fsn1"- Falkenstein. ๐ฉ๐ช
- Provider: Hetzner. ๐ฐ
"nbg1"- Nuremberg. ๐ฉ๐ช
- Provider: Hetzner. ๐ฅจ
"af-south-1"- AF-Johannesburg. ๐ฟ๐ฆ
- Provider: HuaweiOBS. ๐
"ap-southeast-2"- AP-Bangkok. ๐น๐ญ
- Provider: HuaweiOBS. โจ
"ap-southeast-3"- AP-Singapore. ๐ธ๐ฌ
- Provider: HuaweiOBS. ๐
"cn-east-3"- CN East-Shanghai1. ๐จ๐ณ
- Provider: HuaweiOBS. ๐ธ
"cn-east-2"- CN East-Shanghai2. ๐จ๐ณ
- Provider: HuaweiOBS. ๐ซถ
"cn-north-1"- CN North-Beijing1. ๐จ๐ณ
- Provider: HuaweiOBS. ๐
"cn-north-4"- CN North-Beijing4. ๐จ๐ณ
- Provider: HuaweiOBS. ๐ฎ
"cn-south-1"- CN South-Guangzhou. ๐จ๐ณ
- Provider: HuaweiOBS. ๐ต
"ap-southeast-1"- CN-Hong Kong. ๐ญ๐ฐ
- Provider: HuaweiOBS. ๐
"sa-argentina-1"- LA-Buenos Aires1. ๐ฆ๐ท
- Provider: HuaweiOBS. ๐
"sa-peru-1"- LA-Lima1. ๐ต๐ช
- Provider: HuaweiOBS. ๐ฆ
"na-mexico-1"- LA-Mexico City1. ๐ฒ๐ฝ
- Provider: HuaweiOBS. ๐ฎ
"sa-chile-1"- LA-Santiago2. ๐จ๐ฑ
- Provider: HuaweiOBS. ๐ท
"sa-brazil-1"- LA-Sao Paulo1. ๐ง๐ท
- Provider: HuaweiOBS. โฝ
"ru-northwest-2"- RU-Moscow2. ๐ท๐บ
- Provider: HuaweiOBS. ๐ป
"eu-central-2"- Frankfurt, Germany. ๐ฉ๐ช
- Provider: ImpossibleCloud. ๐ฉ๏ธ
"eu-west-1"- Amsterdam, Netherlands. ๐ณ๐ฑ
- Provider: ImpossibleCloud. ๐ท
"eu-west-2"- London, UK. ๐ฌ๐ง
- Provider: ImpossibleCloud. โ
"eu-west-3"- Paris, France. ๐ซ๐ท
- Provider: ImpossibleCloud. ๐ฅ
"eu-east-1"- Poznaล, Poland. ๐ต๐ฑ
- Provider: ImpossibleCloud. ๐ฅ
"eu-north-1"- Copenhagen, Denmark. ๐ฉ๐ฐ
- Provider: ImpossibleCloud. ๐งโโ๏ธ
"us-east-1"- New York, USA. ๐บ๐ธ
- Provider: ImpossibleCloud. ๐ฝ
"de-fra"- Frankfurt, Germany. ๐ฉ๐ช
- Provider: Intercolo. ๐
"de"- Frankfurt, Germany. ๐ฉ๐ช
- Provider:
IONOS,OVHcloud. โจ
"eu-central-2"- Berlin, Germany. ๐ฉ๐ช
- Provider: IONOS. ๐
"eu-central-3"- Berlin, Germany. ๐ฉ๐ช
- Provider: IONOS. ๐ซถ
"eu-central-4"- Frankfurt, Germany. ๐ฉ๐ช
- Provider: IONOS. ๐ธ
"eu-south-2"- Logrono, Spain. ๐ช๐ธ
- Provider: IONOS. ๐ท
"us-central-1"- Lenexa, USA. ๐บ๐ธ
- Provider: IONOS. ๐ฝ
"eu-west-2"- Paris, France. ๐ซ๐ท
- Provider: Outscale. ๐ฅ
"us-east-2"- New Jersey, USA. ๐บ๐ธ
- Provider: Outscale. ๐๏ธ
"us-west-1"- California, USA. ๐บ๐ธ
- Provider: Outscale. ๐ด
"cloudgouv-eu-west-1"- SecNumCloud, Paris, France. ๐ซ๐ท
- Provider: Outscale. ๐
"ap-northeast-1"- Tokyo, Japan. ๐ฏ๐ต
- Provider: Outscale. ๐ผ
"gra"- Gravelines, France. ๐ซ๐ท
- Provider: OVHcloud. ๐
"rbx"- Roubaix, France. ๐ซ๐ท
- Provider: OVHcloud. โจ
"sbg"- Strasbourg, France. ๐ซ๐ท
- Provider: OVHcloud. ๐
"eu-west-par"- Paris, France (3AZ). ๐ซ๐ท
- Provider: OVHcloud. ๐ซถ
"uk"- London, United Kingdom. ๐ฌ๐ง
- Provider: OVHcloud. โ
"waw"- Warsaw, Poland. ๐ต๐ฑ
- Provider: OVHcloud. ๐ฅ
"bhs"- Beauharnois, Canada. ๐จ๐ฆ
- Provider: OVHcloud. ๐
"ca-east-tor"- Toronto, Canada. ๐จ๐ฆ
- Provider: OVHcloud. ๐
"sgp"- Singapore. ๐ธ๐ฌ
- Provider: OVHcloud. ๐ฆ
"ap-southeast-syd"- Sydney, Australia. ๐ฆ๐บ
- Provider: OVHcloud. ๐ฆ
"ap-south-mum"- Mumbai, India. ๐ฎ๐ณ
- Provider: OVHcloud. ๐
"us-east-va"- Vint Hill, Virginia, USA. ๐บ๐ธ
- Provider: OVHcloud. ๐๏ธ
"us-west-or"- Hillsboro, Oregon, USA. ๐บ๐ธ
- Provider: OVHcloud. ๐ฒ
"rbx-archive"- Roubaix, France (Cold Archive). ๐ซ๐ท
- Provider: OVHcloud. ๐ง
"us-east-1"- US East (N. Virginia). ๐บ๐ธ
- Provider:
Petabox,Rabata. ๐
"eu-central-1"- Europe (Frankfurt). ๐ช๐บ
- Provider: Petabox. โจ
"ap-southeast-1"- Asia Pacific (Singapore). ๐ธ๐ฌ
- Provider: Petabox. ๐
"me-south-1"- Middle East (Bahrain). ๐ง๐ญ
- Provider: Petabox. ๐ซถ
"sa-east-1"- South America (Sรฃo Paulo). ๐ง๐ท
- Provider: Petabox. ๐ธ
"cn-east-1"- The default endpoint - a good choice if you are unsure. ๐ค
- East China Region 1. ๐จ๐ณ
- Needs location constraint
cn-east-1. - Provider: Qiniu. ๐
"cn-east-2"- East China Region 2. ๐จ๐ณ
- Needs location constraint
cn-east-2. - Provider: Qiniu. โจ
"cn-north-1"- North China Region 1. ๐จ๐ณ
- Needs location constraint
cn-north-1. - Provider: Qiniu. ๐
"cn-south-1"- South China Region 1. ๐จ๐ณ
- Needs location constraint
cn-south-1. - Provider: Qiniu. ๐ซถ
"us-north-1"- North America Region. ๐
- Needs location constraint
us-north-1. - Provider: Qiniu. ๐ธ
"ap-southeast-1"- Southeast Asia Region 1. ๐
- Needs location constraint
ap-southeast-1. - Provider: Qiniu. ๐
"ap-northeast-1"- Northeast Asia Region 1. ๐
- Needs location constraint
ap-northeast-1. - Provider: Qiniu. โจ
"eu-west-1"- EU (Ireland). ๐ฎ๐ช
- Provider: Rabata. ๐
"eu-west-2"- EU (London). ๐ฌ๐ง
- Provider: Rabata. ๐ซถ
"global"- Global CDN (All locations) Region. ๐
- Provider: RackCorp. ๐ธ
"au"- Australia (All states). ๐ฆ๐บ
- Provider: RackCorp. ๐
"au-nsw"- NSW (Australia) Region. ๐ฆ๐บ
- Provider: RackCorp. โจ
"au-qld"- QLD (Australia) Region. ๐ฆ๐บ
- Provider: RackCorp. ๐
"au-vic"- VIC (Australia) Region. ๐ฆ๐บ
- Provider: RackCorp. ๐ซถ
"au-wa"- Perth (Australia) Region. ๐ฆ๐บ
- Provider: RackCorp. ๐ธ
"ph"- Manila (Philippines) Region. ๐ต๐ญ
- Provider: RackCorp. ๐
"th"- Bangkok (Thailand) Region. ๐น๐ญ
- Provider: RackCorp. โจ
"hk"- HK (Hong Kong) Region. ๐ญ๐ฐ
- Provider: RackCorp. ๐
"mn"- Ulaanbaatar (Mongolia) Region. ๐ฒ๐ณ
- Provider: RackCorp. ๐ซถ
"kg"- Bishkek (Kyrgyzstan) Region. ๐ฐ๐ฌ
- Provider: RackCorp. ๐ธ
"id"- Jakarta (Indonesia) Region
- Provider: RackCorp
"jp"โ Tokyo (Japan) Region ๐ฏ๐ต ยท Provider: RackCorp"sg"โ SG (Singapore) Region ยท Provider: RackCorp"de"โ Frankfurt (Germany) Region ๐ฉ๐ช ยท Provider: RackCorp"us"โ USA (AnyCast) Region ๐บ๐ธ ยท Provider: RackCorp"us-east-1"โ New York (USA) Region ๐ฝ ยท Provider: RackCorp"us-west-1"โ Freemont (USA) Region ยท Provider: RackCorp"nz"โ Auckland (New Zealand) Region ๐ฅ ยท Provider: RackCorp"nl-ams"โ Amsterdam, The Netherlands ๐ท ยท Provider: Scaleway"fr-par"โ Paris, France ๐ฅ ยท Provider: Scaleway"pl-waw"โ Warsaw, Poland ยท Provider: Scaleway"ru-1"โ St. Petersburg ยท Provider: Selectel,Servercore"ru-3"โ St. Petersburg ยท Provider: Selectel"ru-7"โ Moscow ยท Provider: Selectel,Servercore"gis-1"โ Moscow ยท Provider: Selectel,Servercore"kz-1"โ Kazakhstan ยท Provider: Selectel"uz-2"โ Uzbekistan ยท Provider: Selectel"uz-2"โ Tashkent, Uzbekistan ยท Provider: Servercore"kz-1"โ Almaty, Kazakhstan ยท Provider: Servercore"eu-001"โ Europe Region 1 ยท Provider: Synology"eu-002"โ Europe Region 2 ยท Provider: Synology"us-001"โ US Region 1 ยท Provider: Synology"us-002"โ US Region 2 ยท Provider: Synology"tw-001"โ Asia (Taiwan) ยท Provider: Synology"us-east-1"โ The default region. Leave location constraint empty. ยท Provider: Zadara"us-east-1"โ Indore, Madhya Pradesh, India ๐ฎ๐ณ ยท Provider: Zata"zero-fra1"โ Frankfurt 1 ยท Provider: ZeroServices"zero-fra2"โ Frankfurt 2 ยท Provider: ZeroServices"zero-eyl1"โ Eyl 1 ยท Provider: ZeroServices
โจ --s3-endpoint โจ
okay bestie, this is the big one ๐ Endpoint for the S3 API.
Required when you're using an S3 clone โ like, mandatory mandatory, no skipping ๐ซถ
Properties:
- Config:
endpoint - Env Var:
RCLONE_S3_ENDPOINT - Provider: AWS,Alibaba,ArvanCloud,BizflyCloud,Ceph,ChinaMobile,Cloudflare,Cubbit,DigitalOcean,Dreamhost,Exaba,Fastly,FileLu,FlashBlade,GCS,HCP,Hetzner,HuaweiOBS,IBMCOS,ImpossibleCloud,Intercolo,IONOS,Leviia,Liara,Linode,LyveCloud,Magalu,Mega,Minio,Netease,Outscale,OVHcloud,Petabox,Qiniu,Rabata,RackCorp,Rclone,Scaleway,Scality,SeaweedFS,Selectel,Servercore,SpectraLogic,Storj,Synology,TencentCOS,US3,Wasabi,Zadara,Zata,ZeroServices,Other
- Type:
string - Required:
false
Examples โ and babes, there are so many ๐:
"oss-accelerate.aliyuncs.com"โ Global Accelerate ยท Provider: Alibaba"oss-accelerate-overseas.aliyuncs.com"โ Global Accelerate (outside mainland China) ยท Provider: Alibaba"oss-cn-hangzhou.aliyuncs.com"โ East China 1 (Hangzhou) ยท Provider: Alibaba"oss-cn-shanghai.aliyuncs.com"โ East China 2 (Shanghai) ยท Provider: Alibaba"oss-cn-qingdao.aliyuncs.com"โ North China 1 (Qingdao) ยท Provider: Alibaba"oss-cn-beijing.aliyuncs.com"โ North China 2 (Beijing) ยท Provider: Alibaba"oss-cn-zhangjiakou.aliyuncs.com"โ North China 3 (Zhangjiakou) ยท Provider: Alibaba"oss-cn-huhehaote.aliyuncs.com"โ North China 5 (Hohhot) ยท Provider: Alibaba"oss-cn-wulanchabu.aliyuncs.com"โ North China 6 (Ulanqab) ยท Provider: Alibaba"oss-cn-shenzhen.aliyuncs.com"โ South China 1 (Shenzhen) ยท Provider: Alibaba"oss-cn-heyuan.aliyuncs.com"โ South China 2 (Heyuan) ยท Provider: Alibaba"oss-cn-guangzhou.aliyuncs.com"โ South China 3 (Guangzhou) ยท Provider: Alibaba"oss-cn-chengdu.aliyuncs.com"โ West China 1 (Chengdu) ยท Provider: Alibaba"oss-cn-hongkong.aliyuncs.com"โ Hong Kong (Hong Kong) ๐ญ๐ฐ ยท Provider: Alibaba"oss-us-west-1.aliyuncs.com"โ US West 1 (Silicon Valley) ยท Provider: Alibaba"oss-us-east-1.aliyuncs.com"โ US East 1 (Virginia) ยท Provider: Alibaba"oss-ap-southeast-1.aliyuncs.com"โ Southeast Asia Southeast 1 (Singapore) ยท Provider: Alibaba"oss-ap-southeast-2.aliyuncs.com"โ Asia Pacific Southeast 2 (Sydney) ยท Provider: Alibaba"oss-ap-southeast-3.aliyuncs.com"โ Southeast Asia Southeast 3 (Kuala Lumpur) ยท Provider: Alibaba"oss-ap-southeast-5.aliyuncs.com"โ Asia Pacific Southeast 5 (Jakarta) ยท Provider: Alibaba"oss-ap-northeast-1.aliyuncs.com"โ Asia Pacific Northeast 1 (Japan) ยท Provider: Alibaba"oss-ap-south-1.aliyuncs.com"โ Asia Pacific South 1 (Mumbai) ยท Provider: Alibaba"oss-eu-central-1.aliyuncs.com"โ Central Europe 1 (Frankfurt) ยท Provider: Alibaba"oss-eu-west-1.aliyuncs.com"โ West Europe (London) ยท Provider: Alibaba"oss-me-east-1.aliyuncs.com"โ Middle East 1 (Dubai) ๐ช ยท Provider: Alibaba"s3.ir-thr-at1.arvanstorage.ir"โ The default endpoint - a good choice if you are unsure. Tehran Iran (Simin) ยท Provider: ArvanCloud"s3.ir-tbz-sh1.arvanstorage.ir"โ Tabriz Iran (Shahriar) ยท Provider: ArvanCloud"hn.ss.bfcplatform.vn"โ Hanoi endpoint ยท Provider: BizflyCloud"hcm.ss.bfcplatform.vn"โ Ho Chi Minh endpoint ยท Provider: BizflyCloud
and now, hold on, we're entering the ChinaMobile cinematic universe ๐ thirty of these, bestie, thirty:
"eos-wuxi-1.cmecloud.cn"โ The default endpoint - a good choice if you are unsure. East China (Suzhou) ยท Provider: ChinaMobile"eos-jinan-1.cmecloud.cn"โ East China (Jinan) ยท Provider: ChinaMobile"eos-ningbo-1.cmecloud.cn"โ East China (Hangzhou) ยท Provider: ChinaMobile"eos-shanghai-1.cmecloud.cn"โ East China (Shanghai-1) ยท Provider: ChinaMobile"eos-zhengzhou-1.cmecloud.cn"โ Central China (Zhengzhou) ยท Provider: ChinaMobile"eos-hunan-1.cmecloud.cn"โ Central China (Changsha-1) ยท Provider: ChinaMobile"eos-zhuzhou-1.cmecloud.cn"โ Central China (Changsha-2) ยท Provider: ChinaMobile"eos-guangzhou-1.cmecloud.cn"โ South China (Guangzhou-2) ยท Provider: ChinaMobile"eos-dongguan-1.cmecloud.cn"โ South China (Guangzhou-3) ยท Provider: ChinaMobile"eos-beijing-1.cmecloud.cn"โ North China (Beijing-1) ยท Provider: ChinaMobile"eos-beijing-2.cmecloud.cn"โ North China (Beijing-2) ยท Provider: ChinaMobile"eos-beijing-4.cmecloud.cn"โ North China (Beijing-3) ยท Provider: ChinaMobile"eos-huhehaote-1.cmecloud.cn"โ North China (Huhehaote) ยท Provider: ChinaMobile"eos-chengdu-1.cmecloud.cn"โ Southwest China (Chengdu) ยท Provider: ChinaMobile"eos-chongqing-1.cmecloud.cn"โ Southwest China (Chongqing) ยท Provider: ChinaMobile"eos-guiyang-1.cmecloud.cn"โ Southwest China (Guiyang) ยท Provider: ChinaMobile"eos-xian-1.cmecloud.cn"โ Nouthwest China (Xian) ยท Provider: ChinaMobile"eos-yunnan.cmecloud.cn"โ Yunnan China (Kunming) ยท Provider: ChinaMobile"eos-yunnan-2.cmecloud.cn"โ Yunnan China (Kunming-2) ยท Provider: ChinaMobile"eos-tianjin-1.cmecloud.cn"โ Tianjin China (Tianjin) ยท Provider: ChinaMobile"eos-jilin-1.cmecloud.cn"โ Jilin China (Changchun) ยท Provider: ChinaMobile"eos-hubei-1.cmecloud.cn"โ Hubei China (Xiangyan) ยท Provider: ChinaMobile"eos-jiangxi-1.cmecloud.cn"โ Jiangxi China (Nanchang) ยท Provider: ChinaMobile"eos-gansu-1.cmecloud.cn"โ Gansu China (Lanzhou) ยท Provider: ChinaMobile"eos-shanxi-1.cmecloud.cn"โ Shanxi China (Taiyuan) ยท Provider: ChinaMobile"eos-liaoning-1.cmecloud.cn"โ Liaoning China (Shenyang) ยท Provider: ChinaMobile"eos-hebei-1.cmecloud.cn"โ Hebei China (Shijiazhuang) ยท Provider: ChinaMobile"eos-fujian-1.cmecloud.cn"โ Fujian China (Xiamen) ยท Provider: ChinaMobile"eos-guangxi-1.cmecloud.cn"โ Guangxi China (Nanning) ยท Provider: ChinaMobile"eos-anhui-1.cmecloud.cn"โ Anhui China (Huainan) ยท Provider: ChinaMobile
we made it through, icon behavior honestly ๐ซถ now Cubbit:
"s3.cubbit.eu"โ Cubbit DS3 Object Storage endpoint ยท Provider: Cubbit"s3.{tenant_name}.cubbit.eu"โ Multi-tenant endpoint - replace{tenant_name}with your actual tenant name. Do not select this directly โ ๏ธ ยท Provider: Cubbit
bestie listen โ that second one says do not select this directly. it's literally a fill-in-the-blank, not a vibe, okay? ๐
and finally, DigitalOcean Spaces, the moment we've all been waiting for ๐:
"syd1.digitaloceanspaces.com"โ DigitalOcean Spaces Sydney 1 ยท Provider: DigitalOcean"sfo3.digitaloceanspaces.com"โ DigitalOcean Spaces San Francisco 3 ยท Provider: DigitalOcean"sfo2.digitaloceanspaces.com"โ DigitalOcean Spaces San Francisco 2 ยท Provider: DigitalOcean"fra1.digitaloceanspaces.com"โ DigitalOcean Spaces Frankfurt 1 ยท Provider: DigitalOcean"nyc3.digitaloceanspaces.com"โ DigitalOcean Spaces New York 3 ยท Provider: DigitalOcean"ams3.digitaloceanspaces.com"โ DigitalOcean Spaces Amsterdam 3 ยท Provider: DigitalOcean"sgp1.digitaloceanspaces.com"โ DigitalOcean Spaces Singapore 1 ยท Provider: DigitalOcean"lon1.digitaloceanspaces.com"๐ฆ- DigitalOcean Spaces London 1 โ she's cute, she's London, she slays
- Provider: DigitalOcean
"tor1.digitaloceanspaces.com"๐- DigitalOcean Spaces Toronto 1
- Provider: DigitalOcean
"blr1.digitaloceanspaces.com"โจ- DigitalOcean Spaces Bangalore 1
- Provider: DigitalOcean
"objects-us-east-1.dream.io"๐ญ- Dream Objects endpoint โ lowkey a whole vibe
- Provider: Dreamhost
"au-east-1.object.fastlystorage.app"๐ฆ- AU East 1
- Provider: Fastly
"eu-central.object.fastlystorage.app"๐ง- EU Central
- Provider: Fastly
"eu-south-1.object.fastlystorage.app"๐- EU South 1
- Provider: Fastly
"eu-west-1.object.fastlystorage.app"๐ธ- EU West 1
- Provider: Fastly
"jp-central-1.object.fastlystorage.app"๐- JP Central 1
- Provider: Fastly
"uk-east-1.object.fastlystorage.app"๐- UK East 1
- Provider: Fastly
"us-central-1.object.fastlystorage.app"โญ- US Central 1
- Provider: Fastly
"us-east.object.fastlystorage.app"๐- US East
- Provider: Fastly
"us-east-1.object.fastlystorage.app"๐- US East 1
- Provider: Fastly
"us-west.object.fastlystorage.app"๐ฆ- US West
- Provider: Fastly
"us-west-1.object.fastlystorage.app"โจ- US West 1
- Provider: Fastly
"s5lu.com"๐- Global FileLu S5 endpoint โ the main character endpoint, no cap
- Provider: FileLu
"us.s5lu.com"๐- North America (US-East) region endpoint
- Provider: FileLu
"eu.s5lu.com"๐ธ- Europe (EU-Central) region endpoint
- Provider: FileLu
"ap.s5lu.com"๐- Asia Pacific (AP-Southeast) region endpoint
- Provider: FileLu
"me.s5lu.com"๐ง- Middle East (ME-Central) region endpoint
- Provider: FileLu
"https://storage.googleapis.com"๐ฅ- Google Cloud Storage endpoint โ periodt, that's the GCS one
- Provider: GCS
"hel1.your-objectstorage.com"๐ฆ- Helsinki
- Provider: Hetzner
"fsn1.your-objectstorage.com"๐- Falkenstein
- Provider: Hetzner
"nbg1.your-objectstorage.com"โญ- Nuremberg
- Provider: Hetzner
"obs.af-south-1.myhuaweicloud.com"๐- AF-Johannesburg
- Provider: HuaweiOBS
"obs.ap-southeast-2.myhuaweicloud.com"๐- AP-Bangkok
- Provider: HuaweiOBS
"obs.ap-southeast-3.myhuaweicloud.com"โจ- AP-Singapore
- Provider: HuaweiOBS
"obs.cn-east-3.myhuaweicloud.com"๐- CN East-Shanghai1
- Provider: HuaweiOBS
"obs.cn-east-2.myhuaweicloud.com"๐- CN East-Shanghai2
- Provider: HuaweiOBS
"obs.cn-north-1.myhuaweicloud.com"๐ธ- CN North-Beijing1
- Provider: HuaweiOBS
"obs.cn-north-4.myhuaweicloud.com"๐ฆ- CN North-Beijing4
- Provider: HuaweiOBS
"obs.cn-south-1.myhuaweicloud.com"๐- CN South-Guangzhou
- Provider: HuaweiOBS
"obs.ap-southeast-1.myhuaweicloud.com"๐- CN-Hong Kong
- Provider: HuaweiOBS
"obs.sa-argentina-1.myhuaweicloud.com"โญ- LA-Buenos Aires1
- Provider: HuaweiOBS
"obs.sa-peru-1.myhuaweicloud.com"๐ง- LA-Lima1
- Provider: HuaweiOBS
"obs.na-mexico-1.myhuaweicloud.com"๐- LA-Mexico City1
- Provider: HuaweiOBS
"obs.sa-chile-1.myhuaweicloud.com"๐- LA-Santiago2
- Provider: HuaweiOBS
"obs.sa-brazil-1.myhuaweicloud.com"โจ- LA-Sao Paulo1
- Provider: HuaweiOBS
"obs.ru-northwest-2.myhuaweicloud.com"๐ฅ- RU-Moscow2
- Provider: HuaweiOBS
"s3.us.cloud-object-storage.appdomain.cloud"๐- US Cross Region Endpoint โ okay IBM COS besties, we're going deep, buckle up
- Provider: IBMCOS
"s3.dal.us.cloud-object-storage.appdomain.cloud"๐ฆ- US Cross Region Dallas Endpoint
- Provider: IBMCOS
"s3.wdc.us.cloud-object-storage.appdomain.cloud"โจ- US Cross Region Washington DC Endpoint
- Provider: IBMCOS
"s3.sjc.us.cloud-object-storage.appdomain.cloud"๐ธ- US Cross Region San Jose Endpoint
- Provider: IBMCOS
"s3.private.us.cloud-object-storage.appdomain.cloud"๐- US Cross Region Private Endpoint
- Provider: IBMCOS
"s3.private.dal.us.cloud-object-storage.appdomain.cloud"๐ง- US Cross Region Dallas Private Endpoint
- Provider: IBMCOS
"s3.private.wdc.us.cloud-object-storage.appdomain.cloud"๐- US Cross Region Washington DC Private Endpoint
- Provider: IBMCOS
"s3.private.sjc.us.cloud-object-storage.appdomain.cloud"โญ- US Cross Region San Jose Private Endpoint
- Provider: IBMCOS
"s3.us-east.cloud-object-storage.appdomain.cloud"๐- US Region East Endpoint
- Provider: IBMCOS
"s3.private.us-east.cloud-object-storage.appdomain.cloud"๐- US Region East Private Endpoint
- Provider: IBMCOS
"s3.us-south.cloud-object-storage.appdomain.cloud"๐- US Region South Endpoint
- Provider: IBMCOS
"s3.private.us-south.cloud-object-storage.appdomain.cloud"๐ฅ- US Region South Private Endpoint
- Provider: IBMCOS
"s3.eu.cloud-object-storage.appdomain.cloud"๐- EU Cross Region Endpoint
- Provider: IBMCOS
"s3.fra.eu.cloud-object-storage.appdomain.cloud"โจ- EU Cross Region Frankfurt Endpoint
- Provider: IBMCOS
"s3.mil.eu.cloud-object-storage.appdomain.cloud"๐ฆ- EU Cross Region Milan Endpoint
- Provider: IBMCOS
"s3.ams.eu.cloud-object-storage.appdomain.cloud"๐ธ- EU Cross Region Amsterdam Endpoint
- Provider: IBMCOS
"s3.private.eu.cloud-object-storage.appdomain.cloud"๐- EU Cross Region Private Endpoint
- Provider: IBMCOS
"s3.private.fra.eu.cloud-object-storage.appdomain.cloud"๐ง- EU Cross Region Frankfurt Private Endpoint
- Provider: IBMCOS
"s3.private.mil.eu.cloud-object-storage.appdomain.cloud"๐- EU Cross Region Milan Private Endpoint
- Provider: IBMCOS
"s3.private.ams.eu.cloud-object-storage.appdomain.cloud"โญ- EU Cross Region Amsterdam Private Endpoint
- Provider: IBMCOS
"s3.eu-gb.cloud-object-storage.appdomain.cloud"๐- Great Britain Endpoint
- Provider: IBMCOS
"s3.private.eu-gb.cloud-object-storage.appdomain.cloud"๐- Great Britain Private Endpoint
- Provider: IBMCOS
"s3.eu-de.cloud-object-storage.appdomain.cloud"๐- EU Region DE Endpoint
- Provider: IBMCOS
"s3.private.eu-de.cloud-object-storage.appdomain.cloud"๐ฅ- EU Region DE Private Endpoint
- Provider: IBMCOS
"s3.ap.cloud-object-storage.appdomain.cloud"๐- APAC Cross Regional Endpoint
- Provider: IBMCOS
"s3.tok.ap.cloud-object-storage.appdomain.cloud"โจ- APAC Cross Regional Tokyo Endpoint
- Provider: IBMCOS
"s3.hkg.ap.cloud-object-storage.appdomain.cloud"๐ฆ- APAC Cross Regional Hong Kong Endpoint
- Provider: IBMCOS
"s3.seo.ap.cloud-object-storage.appdomain.cloud"๐ธ- APAC Cross Regional Seoul Endpoint
- Provider: IBMCOS
"s3.private.ap.cloud-object-storage.appdomain.cloud"๐- APAC Cross Regional Private Endpoint
- Provider: IBMCOS
"s3.private.tok.ap.cloud-object-storage.appdomain.cloud"๐ง- APAC Cross Regional Tokyo Private Endpoint
- Provider: IBMCOS
"s3.private.hkg.ap.cloud-object-storage.appdomain.cloud"๐- APAC Cross Regional Hong Kong Private Endpoint
- Provider: IBMCOS
"s3.private.seo.ap.cloud-object-storage.appdomain.cloud"โญ- APAC Cross Regional Seoul Private Endpoint
- Provider: IBMCOS
"s3.jp-tok.cloud-object-storage.appdomain.cloud"๐- APAC Region Japan Endpoint
- Provider: IBMCOS
"s3.private.jp-tok.cloud-object-storage.appdomain.cloud"๐- APAC Region Japan Private Endpoint
- Provider: IBMCOS
"s3.au-syd.cloud-object-storage.appdomain.cloud"๐- APAC Region Australia Endpoint
- Provider: IBMCOS
"s3.private.au-syd.cloud-object-storage.appdomain.cloud"๐ฅ- APAC Region Australia Private Endpoint
- Provider: IBMCOS
"s3.ams03.cloud-object-storage.appdomain.cloud"๐- Amsterdam Single Site Endpoint
- Provider: IBMCOS
"s3.private.ams03.cloud-object-storage.appdomain.cloud"โจ- Amsterdam Single Site Private Endpoint
- Provider: IBMCOS
"s3.che01.cloud-object-storage.appdomain.cloud"๐ฆ- Chennai Single Site Endpoint
- Provider: IBMCOS
"s3.private.che01.cloud-object-storage.appdomain.cloud"๐ธ- Chennai Single Site Private Endpoint
- Provider: IBMCOS
"s3.mel01.cloud-object-storage.appdomain.cloud"๐- Melbourne Single Site Endpoint
- Provider: IBMCOS
"s3.private.mel01.cloud-object-storage.appdomain.cloud"๐ง- Melbourne Single Site Private Endpoint
- Provider: IBMCOS
"s3.osl01.cloud-object-storage.appdomain.cloud"๐- Oslo Single Site Endpoint
- Provider: IBMCOS
"s3.private.osl01.cloud-object-storage.appdomain.cloud"โญ- Oslo Single Site Private Endpoint
- Provider: IBMCOS
"s3.tor01.cloud-object-storage.appdomain.cloud"๐- Toronto Single Site Endpoint
- Provider: IBMCOS
"s3.private.tor01.cloud-object-storage.appdomain.cloud"๐- Toronto Single Site Private Endpoint
- Provider: IBMCOS
"s3.seo01.cloud-object-storage.appdomain.cloud"๐- Seoul Single Site Endpoint
- Provider: IBMCOS
"s3.private.seo01.cloud-object-storage.appdomain.cloud"๐ฅ- Seoul Single Site Private Endpoint
- Provider: IBMCOS
"s3.mon01.cloud-object-storage.appdomain.cloud"๐- Montreal Single Site Endpoint
- Provider: IBMCOS
"s3.private.mon01.cloud-object-storage.appdomain.cloud"โจ- Montreal Single Site Private Endpoint
- Provider: IBMCOS
"s3.mex01.cloud-object-storage.appdomain.cloud"๐- Mexico Single Site Endpoint
- Provider: IBMCOS
"s3.private.mex01.cloud-object-storage.appdomain.cloud"๐- Mexico Single Site Private Endpoint
- Provider: IBMCOS
"s3.sjc04.cloud-object-storage.appdomain.cloud"๐- San Jose Single Site Endpoint
- Provider: IBMCOS
"s3.private.sjc04.cloud-object-storage.appdomain.cloud"๐- San Jose Single Site Private Endpoint
- Provider: IBMCOS
"s3.mil01.cloud-object-storage.appdomain.cloud"๐- Milan Single Site Endpoint
- Provider: IBMCOS
"s3.private.mil01.cloud-object-storage.appdomain.cloud"๐- Milan Single Site Private Endpoint
- Provider: IBMCOS
"s3.hkg02.cloud-object-storage.appdomain.cloud"๐- Hong Kong Single Site Endpoint
- Provider: IBMCOS
"s3.private.hkg02.cloud-object-storage.appdomain.cloud"๐- Hong Kong Single Site Private Endpoint
- Provider: IBMCOS
"s3.par01.cloud-object-storage.appdomain.cloud"๐- Paris Single Site Endpoint
- Provider: IBMCOS
"s3.private.par01.cloud-object-storage.appdomain.cloud"๐- Paris Single Site Private Endpoint
- Provider: IBMCOS
"s3.sng01.cloud-object-storage.appdomain.cloud"๐- Singapore Single Site Endpoint
- Provider: IBMCOS
"s3.private.sng01.cloud-object-storage.appdomain.cloud"๐- Singapore Single Site Private Endpoint
- Provider: IBMCOS
"eu-central-2.storage.impossibleapi.net"๐ฅ- Frankfurt, Germany
- Provider: ImpossibleCloud
"eu-west-1.storage.impossibleapi.net"๐ฅ- Amsterdam, Netherlands
- Provider: ImpossibleCloud
"eu-west-2.storage.impossibleapi.net"๐ฅ- London, UK
- Provider: ImpossibleCloud
"eu-west-3.storage.impossibleapi.net"๐ฅ- Paris, France
- Provider: ImpossibleCloud
"eu-east-1.storage.impossibleapi.net"๐ฅ- Poznaล, Poland
- Provider: ImpossibleCloud
"eu-north-1.storage.impossibleapi.net"๐ฅ- Copenhagen, Denmark
- Provider: ImpossibleCloud
"us-east-1.storage.impossibleapi.net"๐ฅ- New York, USA
- Provider: ImpossibleCloud
"de-fra.i3storage.com"๐- Frankfurt, Germany
- Provider: Intercolo
"s3.eu-central-1.ionoscloud.com"๐- Frankfurt, Germany
- Provider: IONOS
"s3.eu-central-2.ionoscloud.com"๐- Berlin, Germany
- Provider: IONOS
"s3.eu-central-3.ionoscloud.com"๐- Berlin, Germany
- Provider: IONOS
"s3.eu-central-4.ionoscloud.com"๐- Frankfurt, Germany
- Provider: IONOS
"s3.eu-south-2.ionoscloud.com"๐- Logrono, Spain
- Provider: IONOS
"s3.us-central-1.ionoscloud.com"๐- Lenexa, USA
- Provider: IONOS
"s3.leviia.com"๐- The default endpoint
- Leviia
- Provider: Leviia
"storage.iran.liara.space"๐ฆ- The default endpoint
- Iran
- Provider: Liara
"nl-ams-1.linodeobjects.com"โจ- Amsterdam, NL (nl-ams-1)
- Provider: Linode
"us-southeast-1.linodeobjects.com"โจ- Atlanta, GA, US (us-southeast-1)
- Provider: Linode
"in-maa-1.linodeobjects.com"โจ- Chennai, IN (in-maa-1)
- Provider: Linode
"us-ord-1.linodeobjects.com"โจ- Chicago, IL, US (us-ord-1)
- Provider: Linode
"eu-central-1.linodeobjects.com"โจ- Frankfurt, DE (eu-central-1)
- Provider: Linode
"id-cgk-1.linodeobjects.com"โจ- Jakarta, ID (id-cgk-1)
- Provider: Linode
"gb-lon-1.linodeobjects.com"โจ- London 2, UK (gb-lon-1)
- Provider: Linode
"us-lax-1.linodeobjects.com"โจ- Los Angeles, CA, US (us-lax-1)
- Provider: Linode
"es-mad-1.linodeobjects.com"โจ- Madrid, ES (es-mad-1)
- Provider: Linode
"us-mia-1.linodeobjects.com"โจ- Miami, FL, US (us-mia-1)
- Provider: Linode
"it-mil-1.linodeobjects.com"โจ- Milan, IT (it-mil-1)
- Provider: Linode
"us-east-1.linodeobjects.com"โจ- Newark, NJ, US (us-east-1)
- Provider: Linode
"jp-osa-1.linodeobjects.com"โจ- Osaka, JP (jp-osa-1)
- Provider: Linode
"fr-par-1.linodeobjects.com"โจ- Paris, FR (fr-par-1)
- Provider: Linode
"br-gru-1.linodeobjects.com"โจ- Sao Paulo, BR (br-gru-1)
- Provider: Linode
"us-sea-1.linodeobjects.com"โจ- Seattle, WA, US (us-sea-1)
- Provider: Linode
"ap-south-1.linodeobjects.com"โจ- Singapore, SG (ap-south-1)
- Provider: Linode
"sg-sin-1.linodeobjects.com"โจ- Singapore 2, SG (sg-sin-1)
- Provider: Linode
"se-sto-1.linodeobjects.com"โจ- Stockholm, SE (se-sto-1)
- Provider: Linode
"jp-tyo-1.linodeobjects.com"โจ- Tokyo 3, JP (jp-tyo-1)
- Provider: Linode
"us-iad-10.linodeobjects.com"โจ- Washington, DC, US (us-iad-10)
- Provider: Linode
"s3.us-west-1.{account_name}.lyve.seagate.com"๐- US West 1 - California
- Provider: LyveCloud
"s3.eu-west-1.{account_name}.lyve.seagate.com"๐- EU West 1 - Ireland
- Provider: LyveCloud
"br-se1.magaluobjects.com"๐- Sรฃo Paulo, SP (BR), br-se1
- Provider: Magalu
"br-ne1.magaluobjects.com"๐- Fortaleza, CE (BR), br-ne1
- Provider: Magalu
"s3.eu-luxembourg-1.megas4.com"๐- Mega S4 Luxembourg 1
- Provider: Mega
"s3.eu-luxembourg-2.megas4.com"๐- Mega S4 Luxembourg 2
- Provider: Mega
"s3.eu-amsterdam-1.megas4.com"๐- Mega S4 Amsterdam 1
- Provider: Mega
"s3.eu-amsterdam-2.megas4.com"๐- Mega S4 Amsterdam 2
- Provider: Mega
"s3.eu-paris-1.megas4.com"๐- Mega S4 Paris 1
- Provider: Mega
"s3.eu-paris-2.megas4.com"๐- Mega S4 Paris 2
- Provider: Mega
"s3.eu-barcelona-1.megas4.com"๐- Mega S4 Barcelona 1
- Provider: Mega
"s3.eu-barcelona-2.megas4.com"๐- Mega S4 Barcelona 2
- Provider: Mega
"s3.ca-montreal-1.megas4.com"๐- Mega S4 Montreal 1
- Provider: Mega
"s3.ca-montreal-2.megas4.com"๐- Mega S4 Montreal 2
- Provider: Mega
"s3.ca-vancouver-1.megas4.com"๐- Mega S4 Vancouver 1
- Provider: Mega
"s3.ca-vancouver-2.megas4.com"๐- Mega S4 Vancouver 2
- Provider: Mega
"s3.ap-tokyo-1.megas4.com"๐- Mega S4 Tokyo 1
- Provider: Mega
"s3.ap-tokyo-2.megas4.com"๐- Mega S4 Tokyo 2
- Provider: Mega
"oos.eu-west-2.outscale.com"๐- Outscale EU West 2 (Paris)
- Provider: Outscale
"oos.us-east-2.outscale.com"๐- Outscale US east 2 (New Jersey)
- Provider: Outscale
"oos.us-west-1.outscale.com"๐- Outscale EU West 1 (California)
- Provider: Outscale
"oos.cloudgouv-eu-west-1.outscale.com"๐- Outscale SecNumCloud (Paris)
- Provider: Outscale
"oos.ap-northeast-1.outscale.com"๐- Outscale AP Northeast 1 (Japan)
- Provider: Outscale
"s3.gra.io.cloud.ovh.net"๐- OVHcloud Gravelines, France
- Provider: OVHcloud
"s3.rbx.io.cloud.ovh.net"๐- OVHcloud Roubaix, France
- Provider: OVHcloud
"s3.sbg.io.cloud.ovh.net"๐- OVHcloud Strasbourg, France
- Provider: OVHcloud
"s3.eu-west-par.io.cloud.ovh.net"๐- OVHcloud Paris, France (3AZ)
- Provider: OVHcloud
"s3.de.io.cloud.ovh.net"๐- OVHcloud Frankfurt, Germany
- Provider: OVHcloud
"s3.uk.io.cloud.ovh.net"๐- OVHcloud London, United Kingdom
- Provider: OVHcloud
"s3.waw.io.cloud.ovh.net"๐- OVHcloud Warsaw, Poland
- Provider: OVHcloud
"s3.bhs.io.cloud.ovh.net"๐- OVHcloud Beauharnois, Canada
- Provider: OVHcloud
"s3.ca-east-tor.io.cloud.ovh.net"๐- OVHcloud Toronto, Canada
- Provider: OVHcloud
"s3.sgp.io.cloud.ovh.net"๐- OVHcloud Singapore
- Provider: OVHcloud
"s3.ap-southeast-syd.io.cloud.ovh.net"๐- OVHcloud Sydney, Australia
- Provider: OVHcloud
"s3.ap-south-mum.io.cloud.ovh.net"๐- OVHcloud Mumbai, India
- Provider: OVHcloud
"s3.us-east-va.io.cloud.ovh.us"๐- OVHcloud Vint Hill, Virginia, USA
- Provider: OVHcloud
"s3.us-west-or.io.cloud.ovh.us"๐- OVHcloud Hillsboro, Oregon, USA
- Provider: OVHcloud
"s3.rbx-archive.io.cloud.ovh.net"๐- OVHcloud Roubaix, France (Cold Archive)
- Provider: OVHcloud
"s3.petabox.io"๐ซถ- US East (N. Virginia)
- Provider: Petabox
"s3.us-east-1.petabox.io"๐ซถ- US East (N. Virginia)
- Provider: Petabox
"s3.eu-central-1.petabox.io"๐ซถ- Europe (Frankfurt)
- Provider: Petabox
"s3.ap-southeast-1.petabox.io"๐ซถ- Asia Pacific (Singapore)
- Provider: Petabox
"s3.me-south-1.petabox.io"๐ซถ- Middle East (Bahrain)
- Provider: Petabox
"s3.sa-east-1.petabox.io"๐ซถ- South America (Sรฃo Paulo)
- Provider: Petabox
"s3-cn-east-1.qiniucs.com"โญ- East China Endpoint 1
- Provider: Qiniu
"s3-cn-east-2.qiniucs.com"โญ- East China Endpoint 2
- Provider: Qiniu
"s3-cn-north-1.qiniucs.com"โญ- North China Endpoint 1
- Provider: Qiniu
"s3-cn-south-1.qiniucs.com"โญ- South China Endpoint 1
- Provider: Qiniu
"s3-us-north-1.qiniucs.com"โญ- North America Endpoint 1
- Provider: Qiniu
"s3-ap-southeast-1.qiniucs.com"โจ"s3-ap-southeast-1.qiniucs.com"- Southeast Asia Endpoint 1 ๐
- Provider: Qiniu
"s3.us-east-1.rabata.io"- US East (N. Virginia) ๐ฝ
- Provider: Rabata
"s3.eu-west-1.rabata.io"- EU West (Ireland) ๐
- Provider: Rabata
"s3.eu-west-2.rabata.io"- EU West (London) ๐ก
- Provider: Rabata
"s3.rackcorp.com"- Global (AnyCast) Endpoint
- Provider: RackCorp
"au.s3.rackcorp.com"- Australia (Anycast) Endpoint ๐ฆ
- Provider: RackCorp
"au-nsw.s3.rackcorp.com"- Sydney (Australia) Endpoint
- Provider: RackCorp
"au-qld.s3.rackcorp.com"- Brisbane (Australia) Endpoint
- Provider: RackCorp
"au-vic.s3.rackcorp.com"- Melbourne (Australia) Endpoint
- Provider: RackCorp
"au-wa.s3.rackcorp.com"- Perth (Australia) Endpoint
- Provider: RackCorp
"ph.s3.rackcorp.com"- Manila (Philippines) Endpoint
- Provider: RackCorp
"th.s3.rackcorp.com"- Bangkok (Thailand) Endpoint ๐น๐ญ
- Provider: RackCorp
"hk.s3.rackcorp.com"- HK (Hong Kong) Endpoint
- Provider: RackCorp
"mn.s3.rackcorp.com"- Ulaanbaatar (Mongolia) Endpoint
- Provider: RackCorp
"kg.s3.rackcorp.com"- Bishkek (Kyrgyzstan) Endpoint
- Provider: RackCorp
"id.s3.rackcorp.com"- Jakarta (Indonesia) Endpoint
- Provider: RackCorp
"jp.s3.rackcorp.com"- Tokyo (Japan) Endpoint ๐ผ
- Provider: RackCorp
"sg.s3.rackcorp.com"- SG (Singapore) Endpoint
- Provider: RackCorp
"de.s3.rackcorp.com"- Frankfurt (Germany) Endpoint ๐ฅจ
- Provider: RackCorp
"us.s3.rackcorp.com"- USA (AnyCast) Endpoint
- Provider: RackCorp
"us-east-1.s3.rackcorp.com"- New York (USA) Endpoint ๐ฝ
- Provider: RackCorp
"us-west-1.s3.rackcorp.com"- Freemont (USA) Endpoint
- Provider: RackCorp
"nz.s3.rackcorp.com"- Auckland (New Zealand) Endpoint ๐ฅ
- Provider: RackCorp
"s3.nl-ams.scw.cloud"- Amsterdam Endpoint ๐ฒ
- Provider: Scaleway
"s3.fr-par.scw.cloud"- Paris Endpoint ๐ฅ
- Provider: Scaleway
"s3.pl-waw.scw.cloud"- Warsaw Endpoint
- Provider: Scaleway
"localhost:8333"- SeaweedFS S3 localhost ๐ฟ
- Provider: SeaweedFS
"s3.ru-1.storage.selcloud.ru"- St. Petersburg
- Provider: Selectel
"s3.ru-3.storage.selcloud.ru"- St. Petersburg
- Provider: Selectel
"s3.ru-7.storage.selcloud.ru"- Moscow
- Provider: Selectel,Servercore
"s3.gis-1.storage.selcloud.ru"- Moscow
- Provider: Selectel,Servercore
"s3.kz-1.storage.selcloud.ru"- Kazakhstan
- Provider: Selectel
"s3.uz-2.storage.selcloud.ru"- Uzbekistan
- Provider: Selectel
"s3.ru-1.storage.selcloud.ru"- Saint Petersburg
- Provider: Servercore
"s3.uz-2.srvstorage.uz"- Tashkent, Uzbekistan
- Provider: Servercore
"s3.kz-1.srvstorage.kz"- Almaty, Kazakhstan
- Provider: Servercore
"gateway.storjshare.io"- Global Hosted Gateway ๐ฐ๏ธ
- Provider: Storj
"eu-001.s3.synologyc2.net"- EU Endpoint 1
- Provider: Synology
"eu-002.s3.synologyc2.net"- EU Endpoint 2
- Provider: Synology
"us-001.s3.synologyc2.net"- US Endpoint 1
- Provider: Synology
"us-002.s3.synologyc2.net"- US Endpoint 2
- Provider: Synology
"tw-001.s3.synologyc2.net"- TW Endpoint 1
- Provider: Synology
"cos.ap-beijing.myqcloud.com"- Beijing Region
- Provider: TencentCOS
"cos.ap-nanjing.myqcloud.com"- Nanjing Region
- Provider: TencentCOS
"cos.ap-shanghai.myqcloud.com"- Shanghai Region
- Provider: TencentCOS
"cos.ap-guangzhou.myqcloud.com"- Guangzhou Region
- Provider: TencentCOS
"cos.ap-chengdu.myqcloud.com"- Chengdu Region
- Provider: TencentCOS
"cos.ap-chongqing.myqcloud.com"- Chongqing Region
- Provider: TencentCOS
"cos.ap-hongkong.myqcloud.com"- Hong Kong (China) Region
- Provider: TencentCOS
"cos.ap-singapore.myqcloud.com"- Singapore Region
- Provider: TencentCOS
"cos.ap-mumbai.myqcloud.com"- Mumbai Region
- Provider: TencentCOS
"cos.ap-seoul.myqcloud.com"- Seoul Region
- Provider: TencentCOS
"cos.ap-bangkok.myqcloud.com"- Bangkok Region
- Provider: TencentCOS
"cos.ap-tokyo.myqcloud.com"- Tokyo Region
- Provider: TencentCOS
"cos.na-siliconvalley.myqcloud.com"- Silicon Valley Region
- Provider: TencentCOS
"cos.na-ashburn.myqcloud.com"- Virginia Region
- Provider: TencentCOS
"cos.na-toronto.myqcloud.com"- Toronto Region
- Provider: TencentCOS
"cos.eu-frankfurt.myqcloud.com"- Frankfurt Region
- Provider: TencentCOS
"cos.eu-moscow.myqcloud.com"- Moscow Region
- Provider: TencentCOS
"cos.accelerate.myqcloud.com"- Use Tencent COS Accelerate Endpoint โก
- Provider: TencentCOS
"s3-cn-bj.ufileos.com"- North China (Beijing 2)
- Provider: US3
"s3-cn-wlcb.ufileos.com"- North China (Ulanqab)
- Provider: US3
"s3-cn-sh2.ufileos.com"- Shanghai
- Provider: US3
"s3-cn-gd.ufileos.com"- South China (Guangzhou)
- Provider: US3
"s3-hk.ufileos.com"- Hongkong
- Provider: US3
"s3-us-ca.ufileos.com"- United States (Los Angeles)
- Provider: US3
"s3-sg.ufileos.com"- Singapore
- Provider: US3
"s3-idn-jakarta.ufileos.com"- Indonesia (Jakarta)
- Provider: US3
"s3-tw-tp.ufileos.com"- Taiwan (Taipei)
- Provider: US3
"s3-afr-nigeria.ufileos.com"- Nigeria (Lagos)
- Provider: US3
"s3-bra-saopaulo.ufileos.com"- Brazil (Sรฃo Paulo)
- Provider: US3
"s3-uae-dubai.ufileos.com"- United Arab Emirates (Dubai)
- Provider: US3
"s3-ge-fra.ufileos.com"- Germany (Frankfurt)
- Provider: US3
"s3-vn-sng.ufileos.com"- Vietnam (Ho Chi Minh City)
- Provider: US3
"s3-us-ws.ufileos.com"- United States (Washington)
- Provider: US3
"s3-ind-mumbai.ufileos.com"- India (Mumbai)
- Provider: US3
"s3-kr-seoul.ufileos.com"- Seoul (South Korea)
- Provider: US3
"s3-jpn-tky.ufileos.com"- Japan (Tokyo)
- Provider: US3
"s3-th-bkk.ufileos.com"- Bangkok (Thailand)
- Provider: US3
"s3-uk-london.ufileos.com"- United Kingdom (London)
- Provider: US3
"s3-rus-mosc.ufileos.com"- Russia (Moscow)
- Provider: US3
"s3-cn-guiyang1.ufileos.com"- Guiyang 1
- Provider: US3
"s3-pk-khi.ufileos.com"- Pakistan
- Provider: US3
"s3.wasabisys.com"- Wasabi US East 1 (N. Virginia)
- Provider: Wasabi
"s3.us-east-2.wasabisys.com"- Wasabi US East 2 (N. Virginia)
- Provider: Wasabi
"s3.us-central-1.wasabisys.com"- Wasabi US Central 1 (Texas)
- Provider: Wasabi
"s3.us-west-1.wasabisys.com"- Wasabi US West 1 (Oregon)
- Provider: Wasabi
"s3.ca-central-1.wasabisys.com"- Wasabi CA Central 1 (Toronto)
- Provider: Wasabi
"s3.eu-central-1.wasabisys.com"- Wasabi EU Central 1 (Amsterdam)
- Provider: Wasabi
"s3.eu-central-2.wasabisys.com"- Wasabi EU Central 2 (Frankfurt)
- Provider: Wasabi
"s3.eu-west-1.wasabisys.com"- Wasabi EU West 1 (London)
- Provider: Wasabi
"s3.eu-west-2.wasabisys.com"- Wasabi EU West 2 (Paris)
- Provider: Wasabi
"s3.eu-south-1.wasabisys.com"- Wasabi EU South 1 (Milan)
- Provider: Wasabi
"s3.ap-northeast-1.wasabisys.com"- Wasabi AP Northeast 1 (Tokyo) endpoint
- Provider: Wasabi
"s3.ap-northeast-2.wasabisys.com"- Wasabi AP Northeast 2 (Osaka) endpoint
- Provider: Wasabi
"s3.ap-southeast-1.wasabisys.com"- Wasabi AP Southeast 1 (Singapore)
- Provider: Wasabi
"s3.ap-southeast-2.wasabisys.com"- Wasabi AP Southeast 2 (Sydney)
- Provider: Wasabi
"idr01.zata.ai"- South Asia Endpoint
- Provider: Zata
"fra1.s3.zeroservices.eu"- Frankfurt 1
- Provider: ZeroServices
"fra.s3.zeroservices.eu"- Frankfurt 2
- Provider: ZeroServices
"eyl1.s3.zeroservices.eu"- Eyl 1
- Provider: ZeroServices
๐
--s3-location-constraint
okay bestie, this one is literally the location constraint โ and it must be set to match the Region. That's not a suggestion, that's the whole vibe.
Leave it blank if you're not sure ๐ซถ. Heads up tho: it's only used when creating buckets โ so if you're just vibing with existing buckets, this one's not your problem.
Properties, because we stay informed:
- Config:
location_constraint - Env Var:
RCLONE_S3_LOCATION_CONSTRAINT - Provider:
AWS,ArvanCloud,Ceph,ChinaMobile,DigitalOcean,Dreamhost,Exaba,GCS,HCP,Hetzner,IBMCOS,ImpossibleCloud,LyveCloud,Minio,Netease,Qiniu,Rabata,RackCorp,Scality,SeaweedFS,Synology,Wasabi,Zata,ZeroServices,Other - Type:
string - Required:
false - Examples:
""
fr fr, if the location constraint doesn't match your Region, that's not a slay, that's a bucket-creation situation you do not want. Match it or leave it empty. ๐
okay bestie, buckle up โ the region list is long and we are finishing it right here, every single one, no skips ๐
"us-east-2"โจ- US East (Ohio) Region
- provider: AWS
"us-west-1"๐ธ- US West (Northern California) Region
- provider: AWS
"us-west-2"๐ฆ- US West (Oregon) Region
- provider: AWS
"ca-central-1"๐- Canada (Central) Region
- provider: AWS
"eu-west-1"๐- EU (Ireland) Region
- provider: AWS
"eu-west-2"โจ- EU (London) Region
- provider: AWS
"eu-west-3"๐- EU (Paris) Region
- provider: AWS
"eu-north-1"๐ธ- EU (Stockholm) Region
- provider: AWS
"eu-south-1"๐- EU (Milan) Region
- provider: AWS
"EU"๐- EU Region
- provider: AWS
"ap-southeast-1"๐ฆ- Asia Pacific (Singapore) Region
- provider: AWS
"ap-southeast-2"โญ- Asia Pacific (Sydney) Region
- provider: AWS
"ap-northeast-1"๐- Asia Pacific (Tokyo) Region
- provider: AWS
"ap-northeast-2"๐ธ- Asia Pacific (Seoul) Region
- provider: AWS
"ap-northeast-3"๐ง- Asia Pacific (Osaka-Local) Region
- provider: AWS
"ap-south-1"๐- Asia Pacific (Mumbai) Region
- provider: AWS
"ap-east-1"โจ- Asia Pacific (Hong Kong) Region
- provider: AWS
"sa-east-1"๐- South America (Sao Paulo) Region
- provider: AWS
"il-central-1"๐- Israel (Tel Aviv) Region
- provider: AWS
"me-south-1"๐ฆ- Middle East (Bahrain) Region
- provider: AWS
"af-south-1"๐ธ- Africa (Cape Town) Region
- provider: AWS
"cn-north-1"๐- China (Beijing) Region
- provider: AWS
"cn-northwest-1"๐- China (Ningxia) Region
- provider: AWS
"us-gov-east-1"โญ- AWS GovCloud (US-East) Region
- provider: AWS
"us-gov-west-1"๐- AWS GovCloud (US) Region
- provider: AWS
"ir-thr-at1"๐บ- Tehran Iran (Simin)
- provider: ArvanCloud
"ir-tbz-sh1"๐- Tabriz Iran (Shahriar)
- provider: ArvanCloud
"wuxi1"๐ธ- East China (Suzhou)
- provider: ChinaMobile
"jinan1"โจ- East China (Jinan)
- provider: ChinaMobile
"ningbo1"๐ฆ- East China (Hangzhou)
- provider: ChinaMobile
"shanghai1"๐- East China (Shanghai-1)
- provider: ChinaMobile
"zhengzhou1"๐- Central China (Zhengzhou)
- provider: ChinaMobile
"hunan1"๐- Central China (Changsha-1)
- provider: ChinaMobile
"zhuzhou1"๐- Central China (Changsha-2)
- provider: ChinaMobile
"guangzhou1"๐- South China (Guangzhou-2)
- provider: ChinaMobile
"dongguan1"โญ- South China (Guangzhou-3)
- provider: ChinaMobile
"beijing1"๐- North China (Beijing-1)
- provider: ChinaMobile
"beijing2"๐ธ- North China (Beijing-2)
- provider: ChinaMobile
"beijing4"๐ง- North China (Beijing-3)
- provider: ChinaMobile
"huhehaote1"๐ฆ- North China (Huhehaote)
- provider: ChinaMobile
"chengdu1"โจ- Southwest China (Chengdu)
- provider: ChinaMobile
"chongqing1"๐- Southwest China (Chongqing)
- provider: ChinaMobile
"guiyang1"๐- Southwest China (Guiyang)
- provider: ChinaMobile
"xian1"๐- Northwest China (Xian)
- provider: ChinaMobile
"yunnan"๐ธ- Yunnan China (Kunming)
- provider: ChinaMobile
"yunnan2"๐- Yunnan China (Kunming-2)
- provider: ChinaMobile
"tianjin1"โญ- Tianjin China (Tianjin)
- provider: ChinaMobile
"jilin1"๐- Jilin China (Changchun)
- provider: ChinaMobile
"hubei1"๐ฆ- Hubei China (Xiangyan)
- provider: ChinaMobile
"jiangxi1"๐- Jiangxi China (Nanchang)
- provider: ChinaMobile
"gansu1"โจ- Gansu China (Lanzhou)
- provider: ChinaMobile
"shanxi1"๐- Shanxi China (Taiyuan)
- provider: ChinaMobile
"liaoning1"๐ธ- Liaoning China (Shenyang)
- provider: ChinaMobile
"hebei1"๐ง- Hebei China (Shijiazhuang)
- provider: ChinaMobile
"fujian1"๐- Fujian China (Xiamen)
- provider: ChinaMobile
"guangxi1"๐- Guangxi China (Nanning)
- provider: ChinaMobile
"anhui1"๐- Anhui China (Huainan)
- provider: ChinaMobile
"us-standard"โจ- US Cross Region Standard
- provider: IBMCOS
"us-vault"๐- US Cross Region Vault
- provider: IBMCOS
"us-cold"๐ง- US Cross Region Cold
- provider: IBMCOS
"us-flex"๐ฆ- US Cross Region Flex
- provider: IBMCOS
"us-east-standard"๐- US East Region Standard
- provider: IBMCOS
"us-east-vault"๐- US East Region Vault
- provider: IBMCOS
"us-east-cold"๐ง- US East Region Cold
- provider: IBMCOS
"us-east-flex"๐ธ- US East Region Flex
- provider: IBMCOS
"us-south-standard"โญ- US South Region Standard
- provider: IBMCOS
"us-south-vault"๐- US South Region Vault
- provider: IBMCOS
"us-south-cold"๐ง- US South Region Cold
- provider: IBMCOS
"us-south-flex"๐- US South Region Flex
- provider: IBMCOS
"eu-standard"๐- EU Cross Region Standard
- provider: IBMCOS
"eu-vault"๐- EU Cross Region Vault
- provider: IBMCOS
"eu-cold"๐ง- EU Cross Region Cold
- provider: IBMCOS
"eu-flex"๐- EU Cross Region Flex
- provider: IBMCOS
"eu-gb-standard"๐- Great Britain Standard
- provider: IBMCOS
"eu-gb-vault"๐- Great Britain Vault
- provider: IBMCOS
"eu-gb-cold"๐ง- Great Britain Cold
- provider: IBMCOS
"eu-gb-flex"๐ฆ- Great Britain Flex
- provider: IBMCOS
"ap-standard"โจ- APAC Standard
- provider: IBMCOS
"ap-vault"๐- APAC Vault
- provider: IBMCOS
"ap-cold"๐ง- APAC Cold
- provider: IBMCOS
"ap-flex"๐ธ- APAC Flex
- provider: IBMCOS
"mel01-standard"๐- Melbourne Standard
- provider: IBMCOS
"mel01-vault"๐- Melbourne Vault
- provider: IBMCOS
"mel01-cold"๐ง- Melbourne Cold
- provider: IBMCOS
"mel01-flex"๐- Melbourne Flex
- provider: IBMCOS
"tor01-standard"๐- Toronto Standard
- provider: IBMCOS
"tor01-vault"๐- Toronto Vault
- provider: IBMCOS
"tor01-cold"๐ง- Toronto Cold
- provider: IBMCOS
"tor01-flex"๐- Toronto Flex
- provider: IBMCOS
"cn-east-1"โจ- East China Region 1
- provider: Qiniu
"cn-east-2"๐ฆ- East China Region 2
- provider: Qiniu
"cn-north-1"๐ธ- North China Region 1
- provider: Qiniu
"cn-south-1"๐- South China Region 1
- provider: Qiniu
"us-north-1"โญ- North America Region 1
- provider: Qiniu
"ap-southeast-1"๐- Southeast Asia Region 1
- provider: Qiniu
"ap-northeast-1"๐- Northeast Asia Region 1
- provider: Qiniu
"us-east-1"๐- US East (N. Virginia)
- provider: Rabata
"eu-west-1"๐- EU (Ireland)
- provider: Rabata
"eu-west-2"๐- EU (London)
- provider: Rabata
"global"๐- Global CDN Region
- provider: RackCorp
"au"๐ฆ- Australia (All locations)
- provider: RackCorp
"au-nsw"โจ- NSW (Australia) Region
- provider: RackCorp
"au-qld"๐ธ- QLD (Australia) Region
- provider: RackCorp
"au-vic"๐- VIC (Australia) Region
- provider: RackCorp
"au-wa"๐- Perth (Australia) Region
- provider: RackCorp
"ph"๐ฆ- Manila (Philippines) Region
- provider: RackCorp
"th"โญ- Bangkok (Thailand) Region
- provider: RackCorp
"hk"๐- HK (Hong Kong) Region
- provider: RackCorp
"mn"๐- Ulaanbaatar (Mongolia) Region
- provider: RackCorp
"kg"๐- Bishkek (Kyrgyzstan) Region
- provider: RackCorp
"id"๐ธ- Jakarta (Indonesia) Region
- provider: RackCorp
"jp"๐- Tokyo (Japan) Region
- provider: RackCorp
"sg"โจ- SG (Singapore) Region
- provider: RackCorp
"de"๐- Frankfurt (Germany) Region
- provider: RackCorp
"us"๐- USA (AnyCast) Region
- provider: RackCorp
"us-east-1"๐ฆ- New York (USA) Region
- provider: RackCorp
"us-west-1"๐ธ- Fremont (USA) Region
- provider: RackCorp
--s3-acl ๐
The canned ACL we use when we're making buckets and when we're storing or copying objects. It's the little permission preset bestie, not a whole custom policy ๐
This ACL gets used for creating objects, and if bucket_acl isn't set, it gets used for creating buckets too. iykyk โจ
For all the tea, the details, the whole lore โ visit https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#canned-acl ๐ธ
Also, lowkey important: this ACL gets applied when server-side copying objects, because S3 doesn't copy the ACL from the source โ it just writes a fresh one instead. So it's giving "new me, who dis" energy, every single time ๐
And if the acl is an empty string then no X-Amz-Acl: header is added and the default (private) will be used. Empty string = it simply minding its business, iconic.
Properties:
- Config:
acl - Env Var:
RCLONE_S3_ACL - Provider: AWS,Alibaba,ArvanCloud,BizflyCloud,Ceph,ChinaMobile,Cubbit,DigitalOcean,Dreamhost,Exaba,FileLu,GCS,HCP,Hetzner,HuaweiOBS,IBMCOS,IDrive,ImpossibleCloud,Intercolo,IONOS,Leviia,Liara,Linode,LyveCloud,Magalu,Minio,Netease,Outscale,OVHcloud,Petabox,Qiniu,RackCorp,Scaleway,Scality,SeaweedFS,TencentCOS,US3,Wasabi,Zata,ZeroServices,Other
- Type:
string - Required:
false - Examples:
"private"- Owner gets
FULL_CONTROL. - No one else has access rights (default).
- Provider: AWS,Alibaba,ArvanCloud,BizflyCloud,Ceph,ChinaMobile,Cubbit,DigitalOcean,Dreamhost,Exaba,FileLu,GCS,HCP,Hetzner,HuaweiOBS,IDrive,ImpossibleCloud,Intercolo,IONOS,Leviia,Liara,Linode,LyveCloud,Magalu,Minio,Netease,Outscale,OVHcloud,Petabox,Qiniu,RackCorp,Scaleway,Scality,SeaweedFS,US3,Wasabi,Zata,ZeroServices,Other
- Owner gets
"public-read"- Owner gets
FULL_CONTROL. - The AllUsers group gets READ access.
- Provider: AWS,Alibaba,ArvanCloud,BizflyCloud,Ceph,ChinaMobile,Cubbit,DigitalOcean,Dreamhost,Exaba,FileLu,GCS,HCP,Hetzner,HuaweiOBS,IDrive,ImpossibleCloud,Intercolo,IONOS,Leviia,Liara,Linode,LyveCloud,Magalu,Minio,Netease,Outscale,OVHcloud,Petabox,Qiniu,RackCorp,Scaleway,Scality,SeaweedFS,TencentCOS,US3,Wasabi,Zata,ZeroServices,Other
- Owner gets
"public-read-write"- Owner gets
FULL_CONTROL. - The AllUsers group gets READ and WRITE access.
- Granting this on a bucket is generally not recommended.
- Provider: AWS,Alibaba,ArvanCloud,BizflyCloud,Ceph,ChinaMobile,Cubbit,DigitalOcean,Dreamhost,Exaba,FileLu,GCS,HCP,Hetzner,HuaweiOBS,IDrive,ImpossibleCloud,Intercolo,IONOS,Leviia,Liara,Linode,LyveCloud,Magalu,Minio,Netease,Outscale,OVHcloud,Petabox,Qiniu,RackCorp,Scaleway,Scality,SeaweedFS,TencentCOS,Wasabi,Zata,ZeroServices,Other
- Owner gets
"authenticated-read"- Owner gets
FULL_CONTROL. - The AuthenticatedUsers group gets READ access.
- Provider: AWS,Alibaba,ArvanCloud,BizflyCloud,Ceph,ChinaMobile,Cubbit,DigitalOcean,Dreamhost,Exaba,FileLu,GCS,HCP,Hetzner,HuaweiOBS,IDrive,ImpossibleCloud,Intercolo,IONOS,Leviia,Liara,Linode,LyveCloud,Magalu,Minio,Netease,Outscale,OVHcloud,Petabox,Qiniu,RackCorp,Scaleway,Scality,SeaweedFS,TencentCOS,Wasabi,Zata,ZeroServices,Other
- Owner gets
"bucket-owner-read"- Object owner gets
FULL_CONTROL. - Bucket owner gets READ access.
- If you specify this canned ACL when creating a bucket, Amazon S3 ignores it.
- Provider: AWS,Alibaba,ArvanCloud,BizflyCloud,Ceph,Cubbit,DigitalOcean,Dreamhost,Exaba,FileLu,GCS,HCP,Hetzner,HuaweiOBS,IDrive,ImpossibleCloud,Intercolo,IONOS,Leviia,Liara,Linode,LyveCloud,Magalu,Minio,Netease,Outscale,OVHcloud,Petabox,Qiniu,RackCorp,Scaleway,Scality,SeaweedFS,TencentCOS,Wasabi,Zata,ZeroServices,Other
- Object owner gets
"bucket-owner-full-control"- Both the object owner and the bucket owner get
FULL_CONTROLover the object. - If you specify this canned ACL when creating a bucket, Amazon S3 ignores it.
- Provider: AWS,Alibaba,ArvanCloud,BizflyCloud,Ceph,Cubbit,DigitalOcean,Dreamhost,Exaba,FileLu,GCS,HCP,Hetzner,HuaweiOBS,IDrive,ImpossibleCloud,Intercolo,IONOS,Leviia,Liara,Linode,LyveCloud,Magalu,Minio,Netease,Outscale,OVHcloud,Petabox,Qiniu,RackCorp,Scaleway,Scality,SeaweedFS,TencentCOS,Wasabi,Zata,ZeroServices,Other
- Both the object owner and the bucket owner get
"private"- Owner gets
FULL_CONTROL. - No one else has access rights (default).
- This acl is available on IBM Cloud (Infra), IBM Cloud (Storage), On-Premise COS.
- Provider: IBMCOS
- Owner gets
"public-read"- Owner gets
FULL_CONTROL. - The AllUsers group gets READ access.
- This acl is available on IBM Cloud (Infra), IBM Cloud (Storage), On-Premise IBM COS.
- Provider: IBMCOS
- Owner gets
"public-read-write"- Owner gets
FULL_CONTROL. - The AllUsers group gets READ and WRITE access.
- This acl is available on IBM Cloud (Infra), On-Premise IBM COS.
- Provider: IBMCOS
- Owner gets
"authenticated-read"- Owner gets
FULL_CONTROL. - The AuthenticatedUsers group gets READ access.
- Not supported on Buckets.
- This acl is available on IBM Cloud (Infra) and On-Premise IBM COS.
- Provider: IBMCOS
- Owner gets
"default"- Owner gets
Full_CONTROL. - No one else has access rights (default).
- Provider: TencentCOS
- Owner gets
--s3-server-side-encryptionโ the server-side encryption algorithm used when storing this object in S3 ๐
Properties:
- Config:
server_side_encryption - Env Var:
RCLONE_S3_SERVER_SIDE_ENCRYPTION - Provider: AWS,Ceph,ChinaMobile,Minio
- Type:
string - Required:
false - Examples:
""- None
- Provider: AWS,Ceph,ChinaMobile,Minio
"AES256"- AES256
- Provider: AWS,Ceph,ChinaMobile,Minio
"aws:kms"- aws:kms
- Provider: AWS,Ceph,Minio
--s3-sse-kms-key-idโ if you're using a KMS ID you must provide the ARN of the Key, no shortcuts bestie ๐ซถ
Properties:
- Config:
sse_kms_key_id - Env Var:
RCLONE_S3_SSE_KMS_KEY_ID - Provider: AWS,Ceph,Minio
- Type:
string - Required:
false - Examples:
""- None
"arn:aws:kms:us-east-1:*"- arn:aws:kms:*
--s3-storage-classโ the storage class to use when storing new objects in S3 โจ
Properties:
- Config:
storage_class - Env Var:
RCLONE_S3_STORAGE_CLASS - Provider: AWS,Alibaba,ArvanCloud,ChinaMobile,Liara,Magalu,OVHcloud,Qiniu,Scaleway,TencentCOS,US3
- Type:
string - Required:
false - Examples:
""- Default
- Provider: AWS,Alibaba,ChinaMobile,OVHcloud,TencentCOS,US3
"STANDARD"- Standard storage class
- Provider: AWS,Alibaba,ArvanCloud,ChinaMobile,Liara,Magalu,OVHcloud,Qiniu,TencentCOS,US3
"REDUCED_REDUNDANCY"- Reduced redundancy storage class
- Provider: AWS
"STANDARD_IA"- Standard Infrequent Access storage class
- Provider: AWS,OVHcloud
"ONEZONE_IA"- One Zone Infrequent Access storage class
- Provider: AWS
"GLACIER"- Glacier Flexible Retrieval storage class
- Provider: AWS
"DEEP_ARCHIVE"- Glacier Deep Archive storage class
- Provider: AWS
"INTELLIGENT_TIERING"- Intelligent-Tiering storage class
- Provider: AWS
"GLACIER_IR"- Glacier Instant Retrieval storage class
- Provider: AWS,Magalu
"GLACIER"- Archive storage mode
- Provider: Alibaba,ChinaMobile,Qiniu
"STANDARD_IA"- Infrequent access storage mode
- Provider: Alibaba,ChinaMobile,TencentCOS,US3
"EXPRESS_ONEZONE"- High Performance storage class
- Provider: OVHcloud
"ONEZONE_IA"- Standard Infrequent Access storage class
- Provider: OVHcloud
"GLACIER"- Active Archive storage class
- Provider: OVHcloud
"GLACIER_IR"- Active Archive storage class
- Provider: OVHcloud
"DEEP_ARCHIVE"- Cold Archive storage class
- Provider: OVHcloud
"INTELLIGENT_TIERING"- Standard storage class
- Provider: OVHcloud
"LINE"- Infrequent access storage mode
- Provider: Qiniu
"DEEP_ARCHIVE"- Deep archive storage mode
- Provider: Qiniu
""- Default.
- Provider: Scaleway
"STANDARD"- The Standard class for any upload.
- Suitable for on-demand content like streaming or CDN.
- Available in all regions.
- Provider: Scaleway
"GLACIER"- Archived storage.
- Prices are lower, but it needs to be restored first to be accessed.
- Available in the FR-PAR region only.
- Provider: Scaleway
"ONEZONE_IA"- One Zone - Infrequent Access.
- A good choice for storing secondary backup copies or easily re-creatable data.
- Available in all regions.
- Provider: Scaleway
"ARCHIVE"- Archive storage mode
- Provider: TencentCOS,US3
--s3-ibm-api-keyโ IBM API Key to be used to obtain IAM token ๐
Properties:
- Config:
ibm_api_key - Env Var:
RCLONE_S3_IBM_API_KEY - Provider: IBMCOS
- Type:
string - Required:
false
--s3-ibm-resource-instance-idโ IBM service instance id ๐
Properties:
- Config:
ibm_resource_instance_id - Env Var:
RCLONE_S3_IBM_RESOURCE_INSTANCE_ID - Provider: IBMCOS
- Type:
string - Required:
false
--s3-bucket-object-lock-enabledโ enable Object Lock when creating new buckets ๐ (no take-backsies, that's kinda the whole point of a lock)
Properties:
- Config:
bucket_object_lock_enabled - Env Var:
RCLONE_S3_BUCKET_OBJECT_LOCK_ENABLED - Type:
bool - Default:
false
๐ Advanced options ๐
Okay bestie, here are the Advanced options specific to s3 (Amazon S3 Compliant Storage Providers including AWS, Alibaba, ArvanCloud, BizflyCloud, Ceph, ChinaMobile, Cloudflare, Cubbit, DigitalOcean, Dreamhost, Exaba, Fastly, FileLu, FlashBlade, GCS, HCP, Hetzner, HuaweiOBS, IBMCOS, IDrive, ImpossibleCloud, Intercolo, IONOS, Leviia, Liara, Linode, LyveCloud, Magalu, Mega, Minio, Netease, Outscale, OVHcloud, Petabox, Qiniu, Rabata, RackCorp, Rclone, Scaleway, Scality, SeaweedFS, Selectel, Servercore, SpectraLogic, Storj, Synology, TencentCOS, US3, Wasabi, Zadara, Zata, ZeroServices, Other). That's a lot of providers and they all ate ๐
--s3-bucket-aclโ Canned ACL used when creating buckets.
For more info visit https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#canned-acl
Okay so real talk: this ACL only does anything when you're creating buckets, bestie. If it's not set, then acl gets used instead. And if both acl and bucket_acl are empty strings? Then no X-Amz-Acl: header goes out at all and the default (private) is what you get. ๐
Properties:
- Config:
bucket_acl - Env Var:
RCLONE_S3_BUCKET_ACL - Provider:
AWS,Alibaba,ArvanCloud,BizflyCloud,Ceph,ChinaMobile,Cubbit,DigitalOcean,Dreamhost,Exaba,FileLu,GCS,HCP,Hetzner,HuaweiOBS,IBMCOS,IDrive,ImpossibleCloud,Intercolo,IONOS,Leviia,Liara,Linode,LyveCloud,Magalu,Mega,Minio,Netease,Outscale,OVHcloud,Petabox,Qiniu,RackCorp,Scaleway,SeaweedFS,Servercore,TencentCOS,US3,Wasabi,Zata,ZeroServices,Other - Type: string
- Required: false
- Examples:
"private"- Owner gets
FULL_CONTROL. - No one else has access rights (default).
- Owner gets
"public-read"- Owner gets
FULL_CONTROL. - The
AllUsersgroup getsREADaccess.
- Owner gets
"public-read-write"- Owner gets
FULL_CONTROL. - The
AllUsersgroup getsREADandWRITEaccess. - Granting this on a bucket is generally not recommended.
- Owner gets
"authenticated-read"- Owner gets
FULL_CONTROL. - The
AuthenticatedUsersgroup getsREADaccess.
- Owner gets
๐ธ --s3-requester-pays
Turns on the requester pays option when you're interacting with an S3 bucket. Yes, you pay for the requests instead of the bucket owner. Iconic but also ๐ธ.
Properties:
- Config:
requester_pays - Env Var:
RCLONE_S3_REQUESTER_PAYS - Provider:
AWS - Type: bool
- Default: false
๐ --s3-sse-customer-algorithm
If you're using SSE-C, this is the server-side encryption algorithm used when storing this object in S3. iykyk.
Properties:
- Config:
sse_customer_algorithm - Env Var:
RCLONE_S3_SSE_CUSTOMER_ALGORITHM - Provider:
AWS,Ceph,ChinaMobile,Minio - Type: string
- Required: false
- Examples:
""- None
"AES256"- AES256
๐๏ธ --s3-sse-customer-key
To use SSE-C you may provide the secret encryption key used to encrypt/decrypt your data.
Alternatively you can provide --sse-customer-key-base64.
Properties:
- Config:
sse_customer_key - Env Var:
RCLONE_S3_SSE_CUSTOMER_KEY - Provider:
AWS,Ceph,ChinaMobile,Minio - Type: string
- Required: false
- Examples:
""- None
๐ --s3-sse-customer-key-base64
If you're using SSE-C you must provide the secret encryption key encoded in base64 format to encrypt/decrypt your data. no cap, it's required for this route.
Alternatively you can provide --sse-customer-key.
Properties:
- Config:
sse_customer_key_base64 - Env Var:
RCLONE_S3_SSE_CUSTOMER_KEY_BASE64 - Provider:
AWS,Ceph,ChinaMobile,Minio - Type: string
- Required: false
- Examples:
""- None
โจ --s3-sse-customer-key-md5
If you're using SSE-C you may provide the secret encryption key MD5 checksum (optional, bestie, breathe).
If you leave it blank, this gets calculated automatically from the sse_customer_key you provided. rclone's got you ๐ซถ
Properties:
- Config:
sse_customer_key_md5 - Env Var:
RCLONE_S3_SSE_CUSTOMER_KEY_MD5 - Provider:
AWS,Ceph,ChinaMobile,Minio - Type: string
- Required: false
- Examples:
""- None
๐ฆ --s3-upload-cutoff
Cutoff for switching to chunked upload.
Any files larger than this get uploaded in chunks of chunk_size. The minimum is 0 and the maximum is 5 GiB.
Properties:
- Config:
upload_cutoff - Env Var:
RCLONE_S3_UPLOAD_CUTOFF - Type: SizeSuffix
- Default: 200Mi
๐งฉ --s3-chunk-size
Chunk size to use for uploading.
When uploading files larger than upload_cutoff, or files with unknown size (e.g. from rclone rcat, or uploaded with rclone mount or google photos or google docs), they get uploaded as multipart uploads using this chunk size.
Note that --s3-upload-concurrency chunks of this size are buffered in memory per transfer. So like, memory check bestie ๐ง
If you're transferring large files over high-speed links and you have enough memory, then increasing this will speed up the transfers. slay.
Rclone will automatically increase the chunk size when uploading a large file of known size to stay below the 10,000 chunks limit.
Files of unknown size are uploaded with the configured chunk_size. Since the default chunk size is 5 MiB and there can be at most 10,000 chunks, this means that by default the maximum size of a file you can stream upload is 48 GiB. If you wish to stream upload larger files then you will need to increase chunk_size.
Increasing the chunk size decreases the accuracy of the progress statistics displayed with the -P flag. Rclone treats a chunk as sent when it's buffered by the AWS SDK, when in fact it may still be uploading. A bigger chunk size means a bigger AWS SDK buffer and progress reporting more deviating from the truth. ๐ญ the lies.
Properties:
- Config:
chunk_size - Env Var:
RCLONE_S3_CHUNK_SIZE - Type: SizeSuffix
- Default: 5Mi
๐ข --s3-max-upload-parts
Maximum number of parts in a multipart upload.
This option defines the maximum number of multipart chunks to use when doing a multipart upload.
This can be useful if a service does not support the AWS S3 specification of 10,000 chunks. rude of them honestly.
Rclone will automatically increase the chunk size when uploading a large file of a known size to stay below this number of chunks limit.
Properties:
- Config:
max_upload_parts - Env Var:
RCLONE_S3_MAX_UPLOAD_PARTS - Type: int
- Default: 10000
๐ --s3-copy-cutoff
Cutoff for switching to multipart copy.
Any files larger than this that need to be server-side copied will be copied in chunks of this size.
The minimum is 1 byte and the maximum is 5 GiB.
Properties:
- Config:
copy_cutoff - Env Var:
RCLONE_S3_COPY_CUTOFF - Type: SizeSuffix
- Default: 4.656Gi
๐ซ --s3-disable-checksum
Don't store MD5 checksum with object metadata.
Normally rclone will calculate the MD5 checksum of the input before uploading it so it can add it to metadata on the object. This is great for data integrity checking but can cause long delays for large files to start uploading. it's giving "waiting forever for a progress bar". ๐
Properties:
- Config:
disable_checksum - Env Var:
RCLONE_S3_DISABLE_CHECKSUM - Type: bool
- Default: false
๐๏ธ --s3-shared-credentials-file
Path to the shared credentials file.
If env_auth = true then rclone can use a shared credentials file.
If this variable is empty rclone will look for the AWS_SHARED_CREDENTIALS_FILE env variable. If the env value is empty it will default to the current user's home directory. ๐
Linux/OSX: "$HOME/.aws/credentials"
Windows: "%USERPROFILE%\.aws\credentials"
Properties:
- Config:
shared_credentials_file - Env Var:
RCLONE_S3_SHARED_CREDENTIALS_FILE - Type: string
- Required: false
๐ค --s3-profile
Profile to use in the shared credentials file.
If env_auth = true then rclone can use a shared credentials file. This variable controls which profile is used in that file.
If empty it will default to the environment variable AWS_PROFILE or default if that environment variable is also not set.
Properties:
- Config:
profile - Env Var:
RCLONE_S3_PROFILE - Type: string
- Required: false
๐๏ธ --s3-session-token
An AWS session token.
Properties:
- Config:
session_token - Env Var:
RCLONE_S3_SESSION_TOKEN - Type: string
- Required: false
๐ชช --s3-role-arn
ARN of the IAM role to assume.
Leave blank if not using assume role. main character energy only if you actually need it ๐
Properties:
- Config:
role_arn - Env Var:
RCLONE_S3_ROLE_ARN - Type: string
- Required: false
๐ท๏ธ --s3-role-session-name
Session name for assumed role.
If empty, a session name will be generated automatically. rclone's on it โจ
Properties:
- Config:
role_session_name - Env Var:
RCLONE_S3_ROLE_SESSION_NAME - Type: string
- Required: false
โณ --s3-role-session-duration
Session duration for assumed role.
If empty, the default session duration will be used.
Properties:
- Config:
role_session_duration - Env Var:
RCLONE_S3_ROLE_SESSION_DURATION - Type: string
- Required: false
๐ --s3-role-external-id
External ID for assumed role.
Leave blank if not using an external ID.
Properties:
- Config:
role_external_id - Env Var:
RCLONE_S3_ROLE_EXTERNAL_ID - Type: string
- Required: false
๐ --s3-upload-concurrency
Concurrency for multipart uploads and copies.
This is the number of chunks of the same file that are uploaded concurrently for multipart uploads and copies.
If you're uploading small numbers of large files over high-speed links and these uploads do not fully utilize your bandwidth, then increasing this may help to speed up the transfers. ate. ๐ฅ
Properties:
- Config:
upload_concurrency - Env Var:
RCLONE_S3_UPLOAD_CONCURRENCY - Type: int
- Default: 4
๐ฃ๏ธ --s3-force-path-style
If true use path style access, if false use virtual hosted style.
If this is true (the default) then rclone will use path style access, if false then rclone will use virtual path style. See the AWS S3 docs (https://docs.aws.amazon.com/AmazonS3/latest/userguide/VirtualHosting.html) for more info.
Some providers (e.g. AWS, Aliyun OSS, Netease COS, or Tencent COS) require this set to false - rclone will do this automatically based on the provider setting.
Note that if your bucket isn't a valid DNS name, i.e. has . or _ in, you'll need to set this to true. ๐ don't skip this one.
Properties:
- Config:
force_path_style - Env Var:
RCLONE_S3_FORCE_PATH_STYLE - Type: bool
- Default: true
๐ฐ๏ธ --s3-v2-auth
If true use v2 authentication.
If this is false (the default) then rclone will use v4 authentication. If it is set then rclone will use v2 authentication.
Use this only if v4 signatures don't work, e.g. pre Jewel/v10 CEPH. like, only if you're desperate bestie ๐ญ
Properties:
- Config:
v2_auth - Env Var:
RCLONE_S3_V2_AUTH - Type: bool
- Default: false
๐ --s3-use-dual-stack
If true use AWS S3 dual-stack endpoint (IPv6 support).
See AWS Docs on Dualstack Endpoints (https://docs.aws.amazon.com/AmazonS3/latest/userguide/dual-stack-endpoints.html)
Properties:
- Config:
use_dual_stack - Env Var:
RCLONE_S3_USE_DUAL_STACK - Type: bool
- Default: false
๐ --s3-use-accelerate-endpoint
If true use the AWS S3 accelerated endpoint.
See: AWS S3 Transfer acceleration โ https://docs.aws.amazon.com/AmazonS3/latest/dev/transfer-acceleration-examples.html โจ
And the receipt (aka its properties, bestie):
- Config:
use_accelerate_endpoint - Env Var:
RCLONE_S3_USE_ACCELERATE_ENDPOINT - Provider:
AWS - Type:
bool - Default:
false
--s3-use-arn-region
Set this to true and boom ๐ฅ โ you get arn region support for the service. That's the whole plot.
- Config:
use_arn_region - Env Var:
RCLONE_S3_USE_ARN_REGION - Type:
bool - Default:
false
--s3-leave-parts-on-error
Okay so when an upload fails, if this is true rclone will not call abort upload โ it literally leaves all the successfully uploaded parts chillin' on S3 so you can rescue them by hand. ๐ซถ
Set it to true if you wanna resume uploads across different sessions. That's the whole point of it, no cap.
โ ๏ธ WARNING: keeping parts of an incomplete multipart upload around still counts toward your space usage on S3, and if you don't clean it up, it'll cost you extra money. So like, don't forget about them. ๐ญ
- Config:
leave_parts_on_error - Env Var:
RCLONE_S3_LEAVE_PARTS_ON_ERROR - Provider:
AWS - Type:
bool - Default:
false
--s3-list-chunk
How big the listing chunk is โ i.e. the response list for every single ListObject S3 request. ๐ฆ
You might know this option by its other names: "MaxKeys", "max-items", or "page-size" in the AWS S3 spec. Most services will truncate the response list to 1000 objects even if you ask for more than that. And for AWS S3 specifically, 1000 is a global maximum and cannot be changed โ see AWS S3: https://docs.aws.amazon.com/cli/latest/reference/s3/ls.html. Over in Ceph land though, you can bump it up with the "rgw list buckets max chunk" option. ๐ง
- Config:
list_chunk - Env Var:
RCLONE_S3_LIST_CHUNK - Type:
int - Default:
1000
--s3-list-version
Which version of ListObjects we're using: 1, 2, or 0 for auto. ๐
Back when S3 first launched it only had the ListObjects call for enumerating objects in a bucket. Then in May 2016, ListObjectsV2 showed up and it's so much higher performance, so you should use it if it's even remotely possible.
If you leave it at the default, 0, rclone will guess based on the provider setting which list objects method to call. And if it guesses wrong? Just set it manually here, bestie. ๐
- Config:
list_version - Env Var:
RCLONE_S3_LIST_VERSION - Type:
int - Default:
0
--s3-list-url-encode
Whether to url encode listings: true/false/unset. ๐
Some providers support URL encoding listings, and where it's available it's genuinely more reliable when you've got control characters in your file names. If this is set to unset (which is the default), rclone picks based on the provider setting what to apply โ but you can override rclone's choice right here. ๐
- Config:
list_url_encode - Env Var:
RCLONE_S3_LIST_URL_ENCODE - Type:
Tristate - Default:
unset
--s3-no-check-bucket
If set, rclone won't try to check whether the bucket exists or create it. ๐
Lowkey useful when you're trying to minimise the number of transactions rclone does, and you already know the bucket exists.
It can also be necessary when the user you're running as doesn't have bucket creation permissions. And fun fact: before v1.52.0 this would have passed silently anyway because of a bug. ๐
- Config:
no_check_bucket - Env Var:
RCLONE_S3_NO_CHECK_BUCKET - Type:
bool - Default:
false
--s3-no-head
If set, rclone won't HEAD uploaded objects to check integrity. โจ
Again: great for minimising how many transactions rclone does.
Setting it means that if rclone gets a 200 OK message back after uploading an object with PUT, it just... assumes it uploaded properly. Main character energy, honestly.
Specifically it will assume:
- the metadata was as uploaded โ and that includes modtime, storage class and content type
- the size was as uploaded
It does read these items from the response for a single part PUT:
- the
MD5SUM - the uploaded date
For multipart uploads, these items aren't read at all.
Oh and if a source object of unknown length gets uploaded, rclone will do a HEAD request anyway.
โ ๏ธ Setting this flag raises the chance of undetected upload failures โ incorrect size especially โ so it is not recommended for normal operation. That said, in practice the chance of an undetected upload failure is very, very small, even with this flag on. ๐ค
- Config:
no_head - Env Var:
RCLONE_S3_NO_HEAD - Type:
bool - Default:
false
--s3-no-head-object
If set, no HEAD before GET when you're getting objects. Simple as that. ๐ฆ
- Config:
no_head_object - Env Var:
RCLONE_S3_NO_HEAD_OBJECT - Type:
bool - Default:
false
--s3-encoding
The encoding for the backend. ๐ค
Peep the encoding section in the overview for more: https://rclone.org/overview/#encoding
- Config:
encoding - Env Var:
RCLONE_S3_ENCODING - Type:
Encoding - Default:
Slash,InvalidUtf8,Dot
--s3-disable-http2
Disables usage of http2 for S3 backends. ๐ซ
Right now there's an unsolved issue with the s3 backend (specifically minio) and HTTP/2. HTTP/2 is enabled by default for the s3 backend, but you can turn it off here. When the issue finally gets solved, this flag will be removed, so don't get too attached. ๐ญ
See: https://github.com/rclone/rclone/issues/4673, https://github.com/rclone/rclone/issues/3631
- Config:
disable_http2 - Env Var:
RCLONE_S3_DISABLE_HTTP2 - Type:
bool - Default:
false
--s3-download-url
Custom endpoint for downloads. ๐
Usually you'd set this to a CloudFront CDN URL, because AWS S3 offers cheaper egress for data downloaded through the CloudFront network. Save that coin, bestie ๐ธ
- Config:
download_url - Env Var:
RCLONE_S3_DOWNLOAD_URL - Type:
string - Required:
false
--s3-directory-markers
Uploads an empty object with a trailing slash whenever a new directory is created. ๐
Empty folders are unsupported for bucket based remotes, so this option creates an empty object ending with "/" to make the folder persist. It's giving "fake it till you make it" but for directories.
- Config:
directory_markers - Env Var:
RCLONE_S3_DIRECTORY_MARKERS - Type:
bool - Default:
false
--s3-use-multipart-etag
Whether to use ETag in multipart uploads for verification. ๐
This should be true, false, or just left unset to use whatever the default is for the provider.
- Config:
use_multipart_etag - Env Var:
RCLONE_S3_USE_MULTIPART_ETAG - Type:
Tristate - Default:
unset
--s3-use-unsigned-payload
Whether to use an unsigned payload in PutObject. โ๏ธ
Here's the tea: rclone has to stop the AWS SDK from seeking the body when it calls PutObject. The AWS provider can add checksums in the trailer to dodge the seeking, but other providers simply can't.
This should be true, false, or left unset to use the provider's default.
- Config:
use_unsigned_payload - Env Var:
RCLONE_S3_USE_UNSIGNED_PAYLOAD - Type:
Tristate - Default:
unset
--s3-use-presigned-request
Whether to use a presigned request or PutObject for single part uploads. ๐
If this is false, rclone uses PutObject from the AWS SDK to upload an object.
Versions of rclone < 1.59 used presigned requests to upload a single part object, and setting this flag to true re-enables that functionality. You shouldn't need it except in exceptional circumstances or for testing. Like, genuinely exceptional. ๐ซฃ
- Config:
use_presigned_request - Env Var:
RCLONE_S3_USE_PRESIGNED_REQUEST - Type:
bool - Default:
false
--s3-use-data-integrity-protections
If true, use AWS S3 data integrity protections. ๐ก๏ธโจ
See the AWS Docs on Data Integrity Protections: https://docs.aws.amazon.com/sdkref/latest/guide/feature-dataintegrity.html
- Config:
use_data_integrity_protections - Env Var:
RCLONE_S3_USE_DATA_INTEGRITY_PROTECTIONS - Type:
Tristate - Default:
unset
--s3-versions
Include old versions in directory listings. ๐ป
- Config:
versions - Env Var:
RCLONE_S3_VERSIONS - Type:
bool - Default:
false
--s3-version-at
Shows file versions exactly as they were at a specified time. โฐ
The parameter should be a date, "2006-01-02", a datetime "2006-01-02 15:04:05", or a duration meaning "that long ago", like "100d" or "1h".
Heads up: when you're using this, no file write operations are permitted โ so you can't upload files or delete them. Read-only era. ๐
See the time option docs for valid formats: https://rclone.org/docs/#time-options
- Config:
version_at - Env Var:
RCLONE_S3_VERSION_AT - Type:
Time - Default:
off
--s3-version-deleted
Shows deleted file markers when you're using versions. ๐ชฆ
This makes deleted file markers show up in the listing when using versions. They'll appear as 0 size files, and the only operation you can perform on them is deletion.
Deleting a delete marker reveals the previous version โ iconic behaviour, honestly. ๐
Deleted files will always show with a timestamp.
- Config:
version_deleted - Env Var:
RCLONE_S3_VERSION_DELETED - Type:
bool - Default:
false
--s3-decompress
If set, this will decompress gzip encoded objects. ๐๏ธ
So it's totally possible to upload objects to S3 with "Content-Encoding: gzip" set. Normally rclone downloads those files as compressed objects.
But if this flag is set, rclone will decompress those "Content-Encoding: gzip" files as they're received. Which means rclone can't check the size and hash โ but the file contents will be decompressed. Trade-offs, bestie. โ๏ธ
- Config:
decompress - Env Var:
RCLONE_S3_DECOMPRESS - Type:
bool - Default:
false
--s3-might-gzip
Set this if the backend might gzip objects. ๐ค
Normally providers won't alter objects when they're downloaded. If an object wasn't uploaded with Content-Encoding: gzip, then that won't be set on download either.
However, some providers may gzip objects even if they weren't uploaded with Content-Encoding: gzip โ Cloudflare, for example. ๐
A symptom of this would be receiving errors like:
ERROR corrupted on transfer: sizes differ NNN vs MMM
If you set this flag and rclone downloads an object with Content-Encoding: gzip set and chunked transfer encoding, then rclone will decompress the object on the fly. โจ
If this is set to unset (the default), rclone chooses according to the provider setting what to apply โ but you can override rclone's choice here.
- Config:
might_gzip - Env Var:
RCLONE_S3_MIGHT_GZIP - Type:
Tristate - Default:
unset
--s3-use-accept-encoding-gzip
Whether to send the Accept-Encoding: gzip header. ๐ซถ
By default, rclone will append Accept-Encoding: gzip to the request to download compressed objects whenever possible.
However some providers, like Google Cloud Storage, will go and mess with the HTTP headers, which completely breaks the signature on the request ๐ญ
If that's happening to you, you'll see errors like this:
SignatureDoesNotMatch: The request signature we calculated does not match the signature you provided.
And in that case, bestie, you might wanna try disabling this option โจ
Properties:
- Config:
use_accept_encoding_gzip - Env Var:
RCLONE_S3_USE_ACCEPT_ENCODING_GZIP - Type: Tristate
- Default: unset
--s3-no-system-metadataโ Suppress setting and reading of system metadata
Properties:
- Config:
no_system_metadata - Env Var:
RCLONE_S3_NO_SYSTEM_METADATA - Type:
bool - Default:
false
--s3-use-already-existsโ Set if rclone should reportBucketAlreadyExistserrors on bucket creation.
Okay so storytime ๐ at some point while the s3 protocol was evolving, AWS started returning an AlreadyOwnedByYou error when you attempt to create a bucket you already own โ instead of a BucketAlreadyExists error. Classic glow-up, honestly.
And unfortunately, the way the s3 clones implemented this is kinda all over the place ๐ some return AlreadyOwnedByYou, some return BucketAlreadyExists, and some just return no error at all. Not them being inconsistent ๐
This matters to rclone because it makes sure the bucket exists by creating it on quite a lot of operations (unless --s3-no-check-bucket is used).
So if rclone knows the provider can return AlreadyOwnedByYou or returns no error, then it can report BucketAlreadyExists errors when you try to create a bucket that isn't yours. Otherwise rclone just ignores the BucketAlreadyExists error, which can lead to confusion ๐
This should be automatically set correctly for all providers rclone knows about โ but if it isn't, please make a bug report ๐ซถ
Properties:
- Config:
use_already_exists - Env Var:
RCLONE_S3_USE_ALREADY_EXISTS - Type: Tristate
- Default: unset
--s3-use-multipart-uploadsโ Set if rclone should use multipart uploads.
You can change this if you wanna disable the use of multipart uploads. Lowkey this shouldn't be necessary in normal operation though โจ
This should be automatically set correctly for all providers rclone knows about โ if it's not, please make a bug report ๐ซถ
Properties:
- Config:
use_multipart_uploads - Env Var:
RCLONE_S3_USE_MULTIPART_UPLOADS - Type: Tristate
- Default: unset
--s3-list-versions-oldest-firstโ Set if the backend returns object versions oldest first.
So the S3 standard returns object versions newest first. But some backends (e.g. Hitachi HCP) return them oldest first instead. Not them being quirky ๐
Set this quirk if --s3-version-at or --s3-versions are producing incorrect results with your backend.
This should be automatically set correctly for all providers rclone knows about โ if it's not, please make a bug report ๐ซถ
Properties:
- Config:
list_versions_oldest_first - Env Var:
RCLONE_S3_LIST_VERSIONS_OLDEST_FIRST - Type: Tristate
- Default: unset
--s3-use-x-idโ Set if rclone should addx-idURL parameters.
You can change this if you want to stop the AWS SDK from adding x-id URL parameters. Again, this shouldn't be necessary in normal operation, bestie โจ
This should be automatically set correctly for all providers rclone knows about โ if it's not, please make a bug report ๐ซถ
Properties:
- Config:
use_x_id - Env Var:
RCLONE_S3_USE_X_ID - Type: Tristate
- Default: unset
--s3-sign-accept-encodingโ Set if rclone should includeAccept-Encodingas part of the signature.
You can change this if you want to stop rclone including Accept-Encoding as part of the signature. And yep โ this shouldn't be necessary in normal operation either ๐
This should be automatically set correctly for all providers rclone knows about โ if it's not, please make a bug report ๐ซถ
Properties:
- Config:
sign_accept_encoding - Env Var:
RCLONE_S3_SIGN_ACCEPT_ENCODING - Type: Tristate
- Default: unset
--s3-directory-bucketโ Set to use AWS Directory Buckets
If you're using an AWS Directory Bucket then set this flag, bestie ๐
This will make sure no Content-Md5 headers are sent and make sure ETag headers are not interpreted as MD5 sums. And X-Amz-Meta-Md5chksum will be set on all objects, whether single or multipart uploaded.
This also sets no_check_bucket = true.
Just so you know, Directory Buckets do not support:
- Versioning
Content-Encoding: gzip
And here are the rclone limitations with Directory Buckets (not ideal, we know ๐ญ):
- rclone does not support creating Directory Buckets with
rclone mkdir - ...or removing them with
rclone rmdiryet - Directory Buckets do not appear when doing
rclone lsfat the top level. - Rclone can't remove auto created directories yet. In theory this should work with
directory_markers = truebut it doesn't. - Directories don't seem to appear in recursive (
ListR) listings.
Properties:
- Config:
directory_bucket - Env Var:
RCLONE_S3_DIRECTORY_BUCKET - Provider: AWS
- Type:
bool - Default:
false
--s3-sdk-log-modeโ Set to debug the SDK
This can be set to a comma separated list of the following functions:
SigningRetriesRequestRequestWithBodyResponseResponseWithBodyDeprecatedUsageRequestEventMessageResponseEventMessage
Use Off to disable and All to set all log levels. And heads up ๐ซถ you'll need to use -vv to actually see the debug level logs.
Properties:
- Config:
sdk_log_mode - Env Var:
RCLONE_S3_SDK_LOG_MODE - Type: Bits
- Default:
Off
--s3-ibm-iam-endpointโ IBM IAM Endpoint to use for authentication.
Leave blank to use the default public endpoint.
Properties:
- Config:
ibm_iam_endpoint - Env Var:
RCLONE_S3_IBM_IAM_ENDPOINT - Provider: IBMCOS
- Type:
string - Required:
false
--s3-object-lock-modeโ Object Lock mode to apply when uploading or copying objects.
Set this to apply Object Lock retention mode to objects. If you don't set it, no Object Lock mode is applied (even with --metadata).
โ ๏ธ Note bestie: to enable Object Lock retention, you must set BOTHobject_lock_modeANDobject_lock_retain_until_date. Setting only one has no effect.
GOVERNANCE: Set Object Lock mode toGOVERNANCECOMPLIANCE: Set Object Lock mode toCOMPLIANCEcopy: Copy the mode from the source object (requires--metadata)
See: https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lock.html
Properties:
- Config:
object_lock_mode - Env Var:
RCLONE_S3_OBJECT_LOCK_MODE - Type:
string - Required:
false - Examples:
"GOVERNANCE"- Set Object Lock mode to
GOVERNANCE
- Set Object Lock mode to
"COMPLIANCE"- Set Object Lock mode to
COMPLIANCE
- Set Object Lock mode to
"copy"- Copy from source object (requires
--metadata)
- Copy from source object (requires
--s3-object-lock-retain-until-dateโ Object Lock retention until date to apply when uploading or copying objects.
Set this to apply an Object Lock retention date to objects. If you don't set it, no retention date is applied (even with --metadata).
โ ๏ธ Note bestie: to enable Object Lock retention, you must set BOTHobject_lock_modeANDobject_lock_retain_until_date. Setting only one has no effect.
Accepts:
- RFC 3339 format:
2030-01-02T15:04:05Z - Duration from now:
365d,1y,6M(days, years, months) copy: Copy the date from the source object (requires--metadata)
See: https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lock.html
Properties:
- Config:
object_lock_retain_until_date - Env Var:
RCLONE_S3_OBJECT_LOCK_RETAIN_UNTIL_DATE - Type:
string - Required:
false - Examples:
"copy"- Copy from source object (requires
--metadata)
- Copy from source object (requires
"2030-01-01T00:00:00Z"- Set specific date (RFC 3339 format)
"365d"- Set retention for 365 days from now
"1y"- Set retention for 1 year from now
--s3-object-lock-legal-hold-statusโ Object Lock legal hold status to apply when uploading or copying objects.
Set this to apply Object Lock legal hold to objects. If you don't set it, no legal hold is applied (even with --metadata).
โ ๏ธ Note: legal hold is independent of retention and can be set separately โจ
ON: Enable legal holdOFF: Disable legal holdcopy: Copy the legal hold status from the source object (requires--metadata)
See: https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lock.html
Properties:
- Config:
object_lock_legal_hold_status - Env Var:
RCLONE_S3_OBJECT_LOCK_LEGAL_HOLD_STATUS - Type:
string - Required:
false - Examples:
"ON"- Enable legal hold
"OFF"- Disable legal hold
"copy"- Copy from source object (requires
--metadata)
- Copy from source object (requires
--s3-bypass-governance-retentionโ Allow deleting or modifying objects locked withGOVERNANCEmode.
Properties:
- Config:
bypass_governance_retention - Env Var:
RCLONE_S3_BYPASS_GOVERNANCE_RETENTION - Type:
bool - Default:
false
--s3-object-lock-set-after-uploadโ Set Object Lock via separate API calls after upload.
Use this for S3-compatible providers that don't support setting Object Lock headers during PUT operations. When it's enabled, Object Lock gets set via separate PutObjectRetention and PutObjectLegalHold API calls after the upload finishes.
Heads up though ๐ซถ this adds extra API calls per object, so only enable it if your provider actually requires it.
Properties:
- Config:
object_lock_set_after_upload - Env Var:
RCLONE_S3_OBJECT_LOCK_SET_AFTER_UPLOAD - Type:
bool - Default:
false
--s3-object-lock-supportedโ Whether the provider supports S3 Object Lock.
This should be true, false or left unset to use the default for the provider.
Set it to false for providers that don't fully support the S3 Object Lock API (e.g. GCS, which uses non-standard headers for bypass governance retention and doesn't implement Legal Hold via the S3 API).
Properties:
- Config:
object_lock_supported - Env Var:
RCLONE_S3_OBJECT_LOCK_SUPPORTED - Type: Tristate
- Default: unset
--s3-descriptionโ Description of the remote.
Properties:
- Config:
description - Env Var:
RCLONE_S3_DESCRIPTION - Type:
string - Required:
false
๐ธ Metadata ๐ธ
User metadata is stored as x-amz-meta- keys. And fun fact ๐
S3 metadata keys are case insensitive and are always returned in lowercase.
Here are the possible system metadata items for the s3 backend.
btimeโ Time of file birth (creation) read from Last-Modified header ๐ ยท Type:RFC 3339ยท Example:2006-01-02T15:04:05.999999999Z07:00ยท Read Only: Ycache-controlโ Cache-Control header ๐ ยท Type:stringยท Example:no-cacheยท Read Only: Ncontent-dispositionโ Content-Disposition header ๐ฆ ยท Type:stringยท Example:inlineยท Read Only: Ncontent-encodingโ Content-Encoding header ๐ธ ยท Type:stringยท Example:gzipยท Read Only: Ncontent-languageโ Content-Language header โจ ยท Type:stringยท Example:en-USยท Read Only: Ncontent-typeโ Content-Type header ๐ ยท Type:stringยท Example:text/plainยท Read Only: Nmtimeโ Time of last modification, read from rclone metadata โญ ยท Type:RFC 3339ยท Example:2006-01-02T15:04:05.999999999Z07:00ยท Read Only: Nobject-lock-legal-hold-statusโ Object Lock legal hold status:ONorOFF๐ซถ ยท Type:stringยท Example:OFFยท Read Only: Nobject-lock-modeโ Object Lock mode:GOVERNANCEorCOMPLIANCE๐ญ ยท Type:stringยท Example:GOVERNANCEยท Read Only: Nobject-lock-retain-until-dateโ Object Lock retention until date ๐ฅ ยท Type:RFC 3339ยท Example:2030-01-02T15:04:05Zยท Read Only: Ntierโ Tier of the object ๐ ยท Type:stringยท Example:GLACIERยท Read Only: Y
See the metadata docs (https://rclone.org/docs/#metadata) for more info, bestie โ it's giving โจ essential reading โจ.
๐ ๏ธ Backend commands ๐ ๏ธ
Okay so these are the commands that are specific to the s3 backend โ like, only s3 ones, not your everyday rclone moves ๐.
Run them like this:
rclone backend COMMAND remote:
The help below spills all the tea on what arguments each command takes ๐.
See the backend command (https://rclone.org/commands/rclone_backend/) for more info on how to pass options and arguments, iykyk.
These can be run on a running backend using the rc command backend/command (https://rclone.org/rc/#backend-command) ๐.
restore
Restore objects from GLACIER or INTELLIGENT-TIERING archive tier ๐งโก๏ธ๐ฅ.
rclone backend restore remote: [options] [<arguments>+]
This command can be used to restore one or more objects from GLACIER to normal storage or from INTELLIGENT-TIERING Archive Access / Deep Archive Access tier to the Frequent Access tier ๐.
Usage examples:
rclone backend restore s3:bucket/path/to/ --include /object -o priority=PRIORITY -o lifetime=DAYS
rclone backend restore s3:bucket/path/to/directory -o priority=PRIORITY -o lifetime=DAYS
rclone backend restore s3:bucket -o priority=PRIORITY -o lifetime=DAYS
rclone backend restore s3:bucket/path/to/directory -o priority=PRIORITY
This flag also obeys the filters. Test first with --interactive/-i or --dry-run flags โ no cap, always vibe-check before you commit ๐.
rclone --interactive backend restore --include "*.txt" s3:bucket/path -o priority=Standard -o lifetime=1
All the objects shown will be marked for restore, then:
rclone backend restore --include "*.txt" s3:bucket/path -o priority=Standard -o lifetime=1
It returns a list of status dictionaries with Remote and Status keys. The Status will be OK if it was successful or an error message if not โญ.
[
{
"Status": "OK",
"Remote": "test.txt"
},
{
"Status": "OK",
"Remote": "test/file4.txt"
}
]
Options:
descriptionโ The optional description for the job ๐.lifetimeโ Lifetime of the active copy in days, ignored forINTELLIGENT-TIERINGstorage โณ.priorityโ Priority of restore:Standard|Expedited|Bulk๐.
restore-status
Show the status for objects being restored from GLACIER or INTELLIGENT-TIERING ๐.
rclone backend restore-status remote: [options] [<arguments>+]
This command can be used to show the status for objects being restored from GLACIER to normal storage or from INTELLIGENT-TIERING Archive Access / Deep Archive Access tier to the Frequent Access tier ๐ซ.
Usage examples:
rclone backend restore-status s3:bucket/path/to/object
rclone backend restore-status s3:bucket/path/to/directory
rclone backend restore-status -o all s3:bucket/path/to/directory
Heads up bestie: this command does not obey the filters ๐ซโจ.
It returns a list of status dictionaries:
[
{
"Remote": "file.txt",
"VersionID": null,
"RestoreStatus": {
"IsRestoreInProgress": true,
"RestoreExpiryDate": "2023-09-06T12:29:19+01:00"
},
"StorageClass": "GLACIER"
},
{
"Remote": "test.pdf",
"VersionID": null,
"RestoreStatus": {
"IsRestoreInProgress": false,
"RestoreExpiryDate": "2023-09-06T12:29:19+01:00"
},
"StorageClass": "DEEP_ARCHIVE"
},
{
"Remote": "test.gz",
"VersionID": null,
"RestoreStatus": {
"IsRestoreInProgress": true,
"RestoreExpiryDate": "null"
},
"StorageClass": "INTELLIGENT_TIERING"
}
]
Options:
allโ If set then show all objects, not just ones with restore status ๐.
list-multipart-uploads
List the unfinished multipart uploads ๐.
rclone backend list-multipart-uploads remote: [options] [<arguments>+]
This command lists the unfinished multipart uploads in JSON format ๐ฆ.
Usage examples:
rclone backend list-multipart s3:bucket/path/to/object
It returns a dictionary of buckets with values as lists of unfinished multipart uploads ๐ .
You can call it with no bucket in which case it lists all bucket, with a bucket or with a bucket and path ๐.
{
"rclone": [
{
"Initiated": "2020-06-26T14:20:36Z",
"Initiator": {
"DisplayName": "XXX",
"ID": "arn:aws:iam::XXX:user/XXX"
},
"Key": "KEY",
"Owner": {
"DisplayName": null,
"ID": "XXX"
},
"StorageClass": "STANDARD",
"UploadId": "XXX"
}
],
"rclone-1000files": [],
"rclone-dst": []
}
cleanup
Remove unfinished multipart uploads ๐งน.
rclone backend cleanup remote: [options] [<arguments>+]
This command removes unfinished multipart uploads of age greater than max-age which defaults to 24 hours โฐ.
Note that you can use --interactive/-i or --dry-run with this command to see what it would do โ peep before you yeet, fr fr ๐.
Usage examples:
rclone backend cleanup s3:bucket/path/to/object
rclone backend cleanup -o max-age=7w s3:bucket/path/to/object
Durations are parsed as per the rest of rclone, 2h, 7d, 7w etc. โณ.
Options:
max-ageโ Max age of upload to delete ๐๏ธ.
cleanup-hidden
Remove old versions of files ๐ป.
rclone backend cleanup-hidden remote: [options] [<arguments>+]
This command removes any old hidden versions of files on a versions enabled bucket ๐ธ.
Note that you can use --interactive/-i or --dry-run with this command to see what it would do ๐.
Usage example:
rclone backend cleanup-hidden s3:bucket/path/to/dir
versioning
Set/get versioning support for a bucket ๐.
rclone backend versioning remote: [options] [<arguments>+]
This command sets versioning support if a parameter is passed and then returns the current versioning status for the bucket supplied โจ.
Usage examples:
rclone backend versioning s3:bucket # read status only
rclone backend versioning s3:bucket Enabled
rclone backend versioning s3:bucket Suspended
It may return Enabled, Suspended or Unversioned ๐. Note that once versioning has been enabled the status can't be set back to Unversioned ๐ญ โ like, that door is locked bestie.
set
Set command for updating the config parameters ๐ง.
rclone backend set remote: [options] [<arguments>+]
This set command can be used to update the config parameters for a running s3 backend ๐.
Usage examples:
rclone backend set s3: [-o opt_name=opt_value] [-o opt_name2=opt_value2]
rclone rc backend/command command=set fs=s3: [-o opt_name=opt_value] [-o opt_name2=opt_value2]
rclone rc backend/command command=set fs=s3: -o session_token=X -o access_key_id=X -o secret_access_key=X
The option keys are named as they are in the config file ๐.
This rebuilds the connection to the s3 backend when it is called with the new parameters ๐. Only new parameters need be passed as the values will default to those currently in use ๐.
It doesn't return anything ๐ค.
๐ Anonymous access to public buckets ๐
If you want to use rclone to access a public bucket, configure with a blank access_key_id and secret_access_key ๐. Your config should end up looking like this:
[anons3]
type = s3
provider = AWS
Then use it as normal with the name of the public bucket, e.g.
rclone lsd anons3:1000genomes
You will be able to list and copy data but not upload it ๐ซโฌ๏ธ.
You can also do this entirely on the command line โจ:
rclone lsd :s3,provider=AWS:1000genomes
๐ฉ๏ธ Providers ๐ฉ๏ธ
AWS S3
This is the provider used as main example and described in the configuration section above ๐ โ the blueprint, the blueprint-iest, the main character of s3 providers ๐.
AWS Directory Buckets
From rclone v1.69 Directory Buckets (https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-buckets-overview.html) are supported ๐.
You will need to set the directory_bucket = true config parameter or use --s3-directory-bucket ๐ฆ.
Note that rclone cannot yet:
- Create directory buckets ๐ซ
- List directory buckets ๐ซ
See the --s3-directory-bucket flag for more info ๐
.
โ๏ธ AWS Snowball Edge
okay so AWS Snowball (https://aws.amazon.com/snowball/) is a literal physical hardware appliance ๐ฆ that you use to haul bulk data back to AWS. Its main software interface is S3 object storage.
To use rclone with AWS Snowball Edge devices, just configure it as a standard 'S3 Compatible Service'.
If you're on rclone pre v1.59, bestie, be sure to set upload_cutoff = 0, otherwise you will run into authentication header issues, because the snowball device does not support query parameter based authentication. ๐ญ
With rclone v1.59 or later, setting upload_cutoff should not be necessary. โจ
eg.
[snowball]
type = s3
provider = Other
access_key_id = YOUR_ACCESS_KEY
secret_access_key = YOUR_SECRET_KEY
endpoint = http://[IP of Snowball]:8080
upload_cutoff = 0
๐ธ Alibaba OSS
Here is an example of making an Alibaba Cloud (Aliyun) OSS (https://www.alibabacloud.com/product/oss/) configuration. First run:
rclone config
This will guide you through an interactive setup process. ๐ซถ
No remotes found, make a new one\?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
name> oss
Type of storage to configure.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
[snip]
XX / Amazon S3 Compliant Storage Providers including AWS, ...
\ "s3"
[snip]
Storage> s3
Choose your S3 provider.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
1 / Amazon Web Services (AWS) S3
\ "AWS"
2 / Alibaba Cloud Object Storage System (OSS) formerly Aliyun
\ "Alibaba"
3 / Ceph Object Storage
\ "Ceph"
[snip]
provider> Alibaba
Get AWS credentials from runtime (environment variables or EC2/ECS meta data if no env vars).
Only applies if access_key_id and secret_access_key is blank.
Enter a boolean value (true or false). Press Enter for the default ("false").
Choose a number from below, or type in your own value
1 / Enter AWS credentials in the next step
\ "false"
2 / Get AWS credentials from the environment (env vars or IAM)
\ "true"
env_auth> 1
AWS Access Key ID.
Leave blank for anonymous access or runtime credentials.
Enter a string value. Press Enter for the default ("").
access_key_id> accesskeyid
AWS Secret Access Key (password)
Leave blank for anonymous access or runtime credentials.
Enter a string value. Press Enter for the default ("").
secret_access_key> secretaccesskey
Endpoint for OSS API.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
1 / East China 1 (Hangzhou)
\ "oss-cn-hangzhou.aliyuncs.com"
2 / East China 2 (Shanghai)
\ "oss-cn-shanghai.aliyuncs.com"
3 / North China 1 (Qingdao)
\ "oss-cn-qingdao.aliyuncs.com"
[snip]
endpoint> 1
Canned ACL used when creating buckets and storing or copying objects.
Note that this ACL is applied when server-side copying objects as S3
doesn't copy the ACL from the source but rather writes a fresh one.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
1 / Owner gets FULL_CONTROL. No one else has access rights (default).
\ "private"
2 / Owner gets FULL_CONTROL. The AllUsers group gets READ access.
\ "public-read"
/ Owner gets FULL_CONTROL. The AllUsers group gets READ and WRITE access.
[snip]
acl> 1
The storage class to use when storing new objects in OSS.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
1 / Default
\ ""
2 / Standard storage class
\ "STANDARD"
3 / Archive storage mode.
\ "GLACIER"
4 / Infrequent access storage mode.
\ "STANDARD_IA"
storage_class> 1
Edit advanced config? (y/n)
y) Yes
n) No
y/n> n
Remote config
--------------------
[oss]
type = s3
provider = Alibaba
env_auth = false
access_key_id = accesskeyid
secret_access_key = secretaccesskey
endpoint = oss-cn-hangzhou.aliyuncs.com
acl = private
storage_class = Standard
--------------------
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d> y
๐ฆ ArvanCloud
ArvanCloud (https://www.arvancloud.com/en/products/cloud-storage) โ ArvanCloud Object Storage goes beyond the limited traditional file storage. It gives you access to backup and archived files and allows sharing. Files like profile image in the app, images sent by users or scanned documents can be stored securely and easily in our Object Storage service. ๐
ArvanCloud provides an S3 interface which can be configured for use with rclone like this.
No remotes found, make a new one\?
n) New remote
s) Set configuration password
n/s> n
name> ArvanCloud
Type of storage to configure.
Choose a number from below, or type in your own value
[snip]
XX / Amazon S3 (also Dreamhost, Ceph, ChinaMobile, ArvanCloud, Liara, Minio)
\ "s3"
[snip]
Storage> s3
Get AWS credentials from runtime (environment variables or EC2/ECS meta data if no env vars). Only applies if access_key_id and secret_access_key is blank.
Choose a number from below, or type in your own value
1 / Enter AWS credentials in the next step
\ "false"
2 / Get AWS credentials from the environment (env vars or IAM)
\ "true"
env_auth> 1
AWS Access Key ID - leave blank for anonymous access or runtime credentials.
access_key_id> YOURACCESSKEY
AWS Secret Access Key (password) - leave blank for anonymous access or runtime credentials.
secret_access_key> YOURSECRETACCESSKEY
Region to connect to.
Choose a number from below, or type in your own value
/ The default endpoint - a good choice if you are unsure.
1 | US Region, Northern Virginia, or Pacific Northwest.
| Leave location constraint empty.
\ "us-east-1"
[snip]
region>
Endpoint for S3 API.
Leave blank if using ArvanCloud to use the default endpoint for the region.
Specify if using an S3 clone such as Ceph.
endpoint> s3.arvanstorage.com
Location constraint - must be set to match the Region. Used when creating buckets only.
Choose a number from below, or type in your own value
1 / Empty for Iran-Tehran Region.
\ ""
[snip]
location_constraint>
Canned ACL used when creating buckets and/or storing objects in S3.
For more info visit https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#canned-acl
Choose a number from below, or type in your own value
1 / Owner gets FULL_CONTROL. No one else has access rights (default).
\ "private"
[snip]
acl>
The server-side encryption algorithm used when storing this object in S3.
Choose a number from below, or type in your own value
1 / None
\ ""
2 / AES256
\ "AES256"
server_side_encryption>
The storage class to use when storing objects in S3.
Choose a number from below, or type in your own value
1 / Default
\ ""
2 / Standard storage class
\ "STANDARD"
storage_class>
Remote config
--------------------
[ArvanCloud]
env_auth = false
access_key_id = YOURACCESSKEY
secret_access_key = YOURSECRETACCESSKEY
region = ir-thr-at1
endpoint = s3.arvanstorage.com
location_constraint =
acl =
server_side_encryption =
storage_class =
--------------------
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d> y
This will leave the config file looking like this.
[ArvanCloud]
type = s3
provider = ArvanCloud
env_auth = false
access_key_id = YOURACCESSKEY
secret_access_key = YOURSECRETACCESSKEY
region =
endpoint = s3.arvanstorage.com
location_constraint =
acl =
server_side_encryption =
storage_class =
๐ BizflyCloud
Bizfly Cloud Simple Storage (https://bizflycloud.vn/simple-storage) is an S3-compatible service with regions in Hanoi (HN) and Ho Chi Minh City (HCM).
Use the endpoint for your region:
- HN:
hn.ss.bfcplatform.vn - HCM:
hcm.ss.bfcplatform.vn
A minimal configuration looks like this.
[bizfly]
type = s3
provider = BizflyCloud
env_auth = false
access_key_id = YOUR_ACCESS_KEY
secret_access_key = YOUR_SECRET_KEY
region = HN
endpoint = hn.ss.bfcplatform.vn
location_constraint =
acl =
server_side_encryption =
storage_class =
Switch region and endpoint to HCM and hcm.ss.bfcplatform.vn for Ho Chi Minh City. ๐ซ
๐ Ceph
Ceph (https://ceph.com/) is an open-source, unified, distributed storage system designed for excellent performance, reliability and scalability. It has an S3 compatible object storage interface.
To use rclone with Ceph, configure as above but leave the region blank and set the endpoint. You should end up with something like this in your config:
[ceph]
type = s3
provider = Ceph
env_auth = false
access_key_id = XXX
secret_access_key = YYY
region =
endpoint = https://ceph.endpoint.example.com
location_constraint =
acl =
server_side_encryption =
storage_class =
โ ๏ธ bestie listen up, if you're on an ancient Ceph (like 10.2.x Jewel energy) and an rclone from before v1.59, you might have to pass--s3-upload-cutoff 0โ or dropupload_cutoff 0into your config file โ to dodge a bug that makes uploading small files justโฆ fail. ๐
Rclone defaults sign_accept_encoding to false for the Ceph provider. Why? Because it avoids SignatureDoesNotMatch errors when a reverse proxy (hi Cloudflare ๐) rewrites the Accept-Encoding request header. You can override that whenever you need with --s3-sign-accept-encoding / sign_accept_encoding. No cap. ๐ซถ
Also PSA: Ceph sometimes sneaks a / into the passwords it hands out. If you read the secret access key using the command line tools you'll get a JSON blob where the / is escaped as \/. So make sure you only write / in the secret access key. Like, just the slash, nothing else. ๐
For example, the dump from Ceph looks something like this (irrelevant keys removed, because who has time):
{
"user_id": "xxx",
"display_name": "xxxx",
"keys": [
{
"user": "xxx",
"access_key": "xxxxxx",
"secret_key": "xxxxxx\/xxxx"
}
],
}
Because this is a json dump, it's encoding the / as \/, so if you use the secret key as xxxxxx/xxxx it will work fine. โจ Easy. Iconic. Moving on.
๐ธ China Mobile Ecloud Elastic Object Storage (EOS) ๐ธ
Here's an example of making a China Mobile Ecloud Elastic Object Storage (EOS) (https:///ecloud.10086.cn/home/product-introduction/eos/) configuration. First run:
rclone config
This will guide you through an interactive setup process. ๐ Step by step, hand held, main character energy โ we love to see it.
okay so like, watch the terminal do its little dance ๐ฉฐ โ every line is a real prompt, and the replies are what you type:
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
name> ChinaMobile
Option Storage.
Type of storage to configure.
Choose a number from below, or type in your own value.
...
XX / Amazon S3 Compliant Storage Providers including AWS, ...
\ (s3)
...
Storage> s3
Option provider.
Choose your S3 provider.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
...
4 / China Mobile Ecloud Elastic Object Storage (EOS)
\ (ChinaMobile)
...
provider> ChinaMobile
Option env_auth.
Get AWS credentials from runtime (environment variables or EC2/ECS meta data if no env vars).
Only applies if access_key_id and secret_access_key is blank.
Choose a number from below, or type in your own boolean value (true or false).
Press Enter for the default (false).
1 / Enter AWS credentials in the next step.
\ (false)
2 / Get AWS credentials from the environment (env vars or IAM).
\ (true)
env_auth>
Option access_key_id.
AWS Access Key ID.
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
access_key_id> accesskeyid
Option secret_access_key.
AWS Secret Access Key (password).
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
secret_access_key> secretaccesskey
Option endpoint.
Endpoint for China Mobile Ecloud Elastic Object Storage (EOS) API.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
/ The default endpoint - a good choice if you are unsure.
1 | East China (Suzhou)
\ (eos-wuxi-1.cmecloud.cn)
2 / East China (Jinan)
\ (eos-jinan-1.cmecloud.cn)
3 / East China (Hangzhou)
\ (eos-ningbo-1.cmecloud.cn)
4 / East China (Shanghai-1)
\ (eos-shanghai-1.cmecloud.cn)
5 / Central China (Zhengzhou)
\ (eos-zhengzhou-1.cmecloud.cn)
6 / Central China (Changsha-1)
\ (eos-hunan-1.cmecloud.cn)
7 / Central China (Changsha-2)
\ (eos-zhuzhou-1.cmecloud.cn)
8 / South China (Guangzhou-2)
\ (eos-guangzhou-1.cmecloud.cn)
9 / South China (Guangzhou-3)
\ (eos-dongguan-1.cmecloud.cn)
10 / North China (Beijing-1)
\ (eos-beijing-1.cmecloud.cn)
11 / North China (Beijing-2)
\ (eos-beijing-2.cmecloud.cn)
12 / North China (Beijing-3)
\ (eos-beijing-4.cmecloud.cn)
13 / North China (Huhehaote)
\ (eos-huhehaote-1.cmecloud.cn)
14 / Southwest China (Chengdu)
\ (eos-chengdu-1.cmecloud.cn)
15 / Southwest China (Chongqing)
\ (eos-chongqing-1.cmecloud.cn)
16 / Southwest China (Guiyang)
\ (eos-guiyang-1.cmecloud.cn)
17 / Nouthwest China (Xian)
\ (eos-xian-1.cmecloud.cn)
18 / Yunnan China (Kunming)
\ (eos-yunnan.cmecloud.cn)
19 / Yunnan China (Kunming-2)
\ (eos-yunnan-2.cmecloud.cn)
20 / Tianjin China (Tianjin)
\ (eos-tianjin-1.cmecloud.cn)
21 / Jilin China (Changchun)
\ (eos-jilin-1.cmecloud.cn)
22 / Hubei China (Xiangyan)
\ (eos-hubei-1.cmecloud.cn)
23 / Jiangxi China (Nanchang)
\ (eos-jiangxi-1.cmecloud.cn)
24 / Gansu China (Lanzhou)
\ (eos-gansu-1.cmecloud.cn)
25 / Shanxi China (Taiyuan)
\ (eos-shanxi-1.cmecloud.cn)
26 / Liaoning China (Shenyang)
\ (eos-liaoning-1.cmecloud.cn)
27 / Hebei China (Shijiazhuang)
\ (eos-hebei-1.cmecloud.cn)
28 / Fujian China (Xiamen)
\ (eos-fujian-1.cmecloud.cn)
29 / Guangxi China (Nanning)
\ (eos-guangxi-1.cmecloud.cn)
30 / Anhui China (Huainan)
\ (eos-anhui-1.cmecloud.cn)
endpoint> 1
Option location_constraint.
Location constraint - must match endpoint.
Used when creating buckets only.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
1 / East China (Suzhou)
\ (wuxi1)
2 / East China (Jinan)
\ (jinan1)
3 / East China (Hangzhou)
\ (ningbo1)
4 / East China (Shanghai-1)
\ (shanghai1)
5 / Central China (Zhengzhou)
\ (zhengzhou1)
6 / Central China (Changsha-1)
\ (hunan1)
7 / Central China (Changsha-2)
\ (zhuzhou1)
8 / South China (Guangzhou-2)
\ (guangzhou1)
9 / South China (Guangzhou-3)
\ (dongguan1)
10 / North China (Beijing-1)
\ (beijing1)
11 / North China (Beijing-2)
\ (beijing2)
12 / North China (Beijing-3)
\ (beijing4)
13 / North China (Huhehaote)
\ (huhehaote1)
14 / Southwest China (Chengdu)
\ (chengdu1)
15 / Southwest China (Chongqing)
\ (chongqing1)
16 / Southwest China (Guiyang)
\ (guiyang1)
17 / Nouthwest China (Xian)
\ (xian1)
18 / Yunnan China (Kunming)
\ (yunnan)
19 / Yunnan China (Kunming-2)
\ (yunnan2)
20 / Tianjin China (Tianjin)
\ (tianjin1)
21 / Jilin China (Changchun)
\ (jilin1)
22 / Hubei China (Xiangyan)
\ (hubei1)
23 / Jiangxi China (Nanchang)
\ (jiangxi1)
24 / Gansu China (Lanzhou)
\ (gansu1)
25 / Shanxi China (Taiyuan)
\ (shanxi1)
26 / Liaoning China (Shenyang)
\ (liaoning1)
27 / Hebei China (Shijiazhuang)
\ (hebei1)
28 / Fujian China (Xiamen)
\ (fujian1)
29 / Guangxi China (Nanning)
\ (guangxi1)
30 / Anhui China (Huainan)
\ (anhui1)
location_constraint> 1
Option acl.
Canned ACL used when creating buckets and storing or copying objects.
This ACL is used for creating objects and if bucket_acl isn't set, for creating buckets too.
For more info visit https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#canned-acl
Note that this ACL is applied when server-side copying objects as S3
doesn't copy the ACL from the source but rather writes a fresh one.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
/ Owner gets FULL_CONTROL.
1 | No one else has access rights (default).
\ (private)
/ Owner gets FULL_CONTROL.
2 | The AllUsers group gets READ access.
\ (public-read)
/ Owner gets FULL_CONTROL.
3 | The AllUsers group gets READ and WRITE access.
| Granting this on a bucket is generally not recommended.
\ (public-read-write)
/ Owner gets FULL_CONTROL.
4 | The AuthenticatedUsers group gets READ access.
\ (authenticated-read)
/ Object owner gets FULL_CONTROL.
acl> private
Option server_side_encryption.
The server-side encryption algorithm used when storing this object in S3.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
1 / None
\ ()
2 / AES256
\ (AES256)
server_side_encryption>
Option storage_class.
The storage class to use when storing new objects in ChinaMobile.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
1 / Default
\ ()
2 / Standard storage class
\ (STANDARD)
3 / Archive storage mode
\ (GLACIER)
4 / Infrequent access storage mode
\ (STANDARD_IA)
storage_class>
Edit advanced config?
y) Yes
n) No (default)
y/n> n
--------------------
[ChinaMobile]
type = s3
provider = ChinaMobile
access_key_id = accesskeyid
secret_access_key = secretaccesskey
endpoint = eos-wuxi-1.cmecloud.cn
location_constraint = wuxi1
acl = private
--------------------
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d> y
obsessed</p> with how clean that came out ๐ quick recap of what you just watched happen: no remotes existed yet, so you made a new remote called ChinaMobile, picked storage type s3, then told the provider prompt it's ChinaMobile (that's option 4, China Mobile Ecloud Elastic Object Storage (EOS)). You skipped env_auth entirely, so it stayed at the default false and you hand-typed the access_key_id and secret_access_key. Then you chose endpoint option 1, which is East China (Suzhou) โ eos-wuxi-1.cmecloud.cn, and location_constraint option 1, which is wuxi1 (and yeah, they must match โ that's not a suggestion, bestie, it's literally in the prompt text ๐ซ ). acl = private, server_side_encryption left empty, storage_class left empty, advanced config? <purple>n</purple>. Then the config preview, then y because yes, this is OK, and boom โ remote secured. โจ
lowkey important thing to clock: that acl thing is applied when server-side copying objects too, because S3 doesn't carry the ACL over from the source โ it just writes a fresh one. No cap. So your copy gets the ACL you configured, not the one the original file was chilling with. ๐
๐ฆ Cloudflare R2
Cloudflare R2 (https://blog.cloudflare.com/r2-open-beta/) Storage lets devs store, like, huge amounts of unstructured data without the costly egress bandwidth fees that come with your typical cloud storage services. The way that's such a glow-up ๐ญ the egress fees were giving scam fr fr.
Here's an example of making a Cloudflare R2 configuration. First run:
rclone config
This will guide you through an interactive setup process. ๐ง
โ ๏ธ okay so heads up bestie, all buckets are private, and they're all stored in the same "auto" region. If you wanna share the content of a bucket publicly you have to use Cloudflare workers. That's the whole vibe โ no sneaky public bucket setting here, iykyk. ๐
Edit advanced config?
y) Yes
n) No (default)
y/n> n
--------------------
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d> y
and boom, your config file is gonna look a lil something like this ๐
[r2]
type = s3
provider = Cloudflare
access_key_id = ACCESS_KEY
secret_access_key = SECRET_ACCESS_KEY
region = auto
endpoint = https://ACCOUNT_ID.r2.cloudflarestorage.com
acl = private
now go be nosy ๐ run rclone lsf r2: to peek at your buckets, and rclone lsf r2:bucket to snoop inside a bucket. it's giving detective energy.
heads up bestie: if your R2 token has the "Object Read & Write" permission, you might also need to add no_check_bucket = true or your object uploads will simply not work. tragic, but fixable.
also, ngl, Cloudflare decompresses files that get uploaded with Content-Encoding: gzip by default, which is a deviation from what AWS does. so if that's causing you pain, upload your files with --header-upload "Cache-Control: no-transform" and you're golden โจ
one lil consequence of all this (iykyk): Content-Encoding: gzip is literally never gonna show up in the metadata on Cloudflare. periodt.
๐ฆ Cubbit DS3
Cubbit Object Storage (https://www.cubbit.io/ds3-cloud) is a geo-distributed cloud object storage platform. very โจglobalโจ of it.
to connect to Cubbit DS3 you need an access key + secret key pair. you can follow this guide (https://docs.cubbit.io/getting-started/quickstart#api-keys) to grab those keys. rclone config is gonna ask you for them, so have 'em ready ๐ซถ
the default region corresponds to eu-west-1, and the endpoint has to be specified as s3.cubbit.eu. and listen โ if you set a custom tenant endpoint, you must use s3.{tenant_name}.cubbit.eu, because the generic s3.cubbit.eu endpoint will not work in that case. no cap.
going through the whole "make a new remote" journey with rclone config, every prompt should be answered like this:
name> cubbit-ds3 (or any name you like)
Storage> s3
provider> Cubbit
env_auth> false
access_key_id> YOUR_ACCESS_KEY
secret_access_key> YOUR_SECRET_KEY
region> eu-west-1 (or leave empty)
endpoint> s3.cubbit.eu (or s3.{tenant_name}.cubbit.eu)
acl>
and the config file that falls out of that should look like:
[cubbit-ds3]
type = s3
provider = Cubbit
access_key_id = ACCESS_KEY
secret_access_key = SECRET_KEY
region = eu-west-1
endpoint = s3.cubbit.eu
then you can start using Cubbit DS3 with rclone fr fr. for example, to make a new bucket and copy files into it, run:
rclone mkdir cubbit-ds3:my-bucket
rclone copy /path/to/files cubbit-ds3:my-bucket
main character setup complete ๐
๐ DigitalOcean Spaces
Spaces (https://www.digitalocean.com/products/object-storage/) is an S3-interoperable (https://developers.digitalocean.com/documentation/spaces/) object storage service from cloud provider DigitalOcean. slay.
to connect to DigitalOcean Spaces you'll need an access key and a secret key. you can retrieve these on the Applications & API (https://cloud.digitalocean.com/settings/api/tokens) page of the DigitalOcean control panel. rclone config is gonna want them for your access_key_id and secret_access_key, so yeah.
when it asks for a region or location_constraint, just press enter to use the default value. the region must be included in the endpoint setting (e.g. nyc3.digitaloceanspaces.com). the default values work fine for the other settings, no stress ๐ธ
going through the whole new-remote process with rclone config, each prompt should be answered like so:
Storage> s3
env_auth> 1
access_key_id> YOUR_ACCESS_KEY
secret_access_key> YOUR_SECRET_KEY
region>
endpoint> nyc3.digitaloceanspaces.com
location_constraint>
acl>
storage_class>
the resulting config file should look like:
[spaces]
type = s3
provider = DigitalOcean
env_auth = false
access_key_id = YOUR_ACCESS_KEY
secret_access_key = YOUR_SECRET_KEY
region =
endpoint = nyc3.digitaloceanspaces.com
location_constraint =
acl =
server_side_encryption =
storage_class =
once it's configured, you can create a new Space and start copying files. for example:
rclone mkdir spaces:my-new-space
rclone copy /path/to/files spaces:my-new-space
๐ Dreamhost
Dreamhost DreamObjects (https://www.dreamhost.com/cloud/storage/) is an object storage system based on CEPH. vintage but valid.
to use rclone with Dreamhost, configure as above but leave the region blank and set the endpoint. you should end up with something like this in your config:
[dreamobjects]
type = s3
provider = DreamHost
env_auth = false
access_key_id = your_access_key
secret_access_key = your_secret_key
region =
endpoint = objects-us-west-1.dream.io
location_constraint =
acl = private
server_side_encryption =
storage_class =
๐ Exaba
Exaba (https://exaba.com/) is an on-premises, S3-compatible storage for service providers and large enterprises. it's quick to deploy, with dynamic node management, tenant accounting, and a built-in key management system. it delivers secure, high-performance data storage with flexible, usage-based pricing. corporate but make it โจ
a container version exaba/exaba (https://hub.docker.com/r/exaba/exaba) is free for end-users, and on that page you can find instructions on how to set it up. you'll need to log into the admin first (on port 9006 by default) to set up the container, then you can use the service on port 9000. two ports, one destiny ๐
you can also join the exaba support slack (https://join.slack.com/t/exabasupport/shared_invite/zt-3b5jycjs3-0gDNyv60xKsAdNgjX72amQ) if you need more help. community support era ๐
an rclone config walkthrough might look like this, but details may vary depending exactly on how you've set up the container:
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
Enter name for new remote.
name> exaba
Option Storage.
Type of storage to configure.
Storage> s3
Option provider.
Choose your S3 provider.
provider> Exaba
Option env_auth.
env_auth> 1
Option access_key_id.
access_key_id> XXX
Option secret_access_key.
secret_access_key> YYY
Option region.
region>
Option endpoint.
endpoint> http://127.0.0.1:9000/
Option location_constraint.
location_constraint>
Option acl.
acl>
Edit advanced config?
y) Yes
n) No (default)
y/n> n
and the config generated will end up looking like this:
[exaba]
type = s3
provider = Exaba
access_key_id = XXX
secret_access_key = XXX
endpoint = http://127.0.0.1:9000/
๐ฅ Fastly Object Storage
Fastly Object Storage (https://www.fastly.com/products/storage) is an S3-compatible object storage service from Fastly. it provides three regions โ US East, US West, and EU Central โ with mandatory server-side encryption. no opting out, it's required, don't even try it ๐
here's an example of making a configuration. first run:
rclone config
this will guide you through an interactive setup process.
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
Enter name for new remote.
name> fastly
Option Storage.
Type of storage to configure.
Storage> s3
Option provider.
Choose your S3 provider.
provider> Fastly
Option env_auth.
Get AWS credentials from runtime (environment variables or EC2/ECS meta data if no env vars).
Only applies if access_key_id and secret_access_key is blank.
env_auth> false
Option access_key_id.
AWS Access Key ID.
access_key_id> YOUR_ACCESS_KEY
Option secret_access_key.
AWS Secret Access Key (password).
secret_access_key> YOUR_SECRET_KEY
Option region.
Region where your bucket will be created and your data stored.
region> us-east
Option endpoint.
Endpoint for S3 API.
endpoint> us-east.object.fastlystorage.app
Edit advanced config?
y) Yes
n) No (default)
y/n> n
Configuration complete.
Options:
- type: s3
- provider: Fastly
- access_key_id: YOUR_ACCESS_KEY
- secret_access_key: YOUR_SECRET_KEY
- region: us-east
- endpoint: us-east.object.fastlystorage.app
Keep this "fastly" remote?
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d> y
And bestie, this is what your config file should look like when the dust settles: ๐
[fastly]
type = s3
provider = Fastly
access_key_id = YOUR_ACCESS_KEY
secret_access_key = YOUR_SECRET_KEY
region = us-east
endpoint = us-east.object.fastlystorage.app
๐ Google Cloud Storage ๐
GoogleCloudStorage (https://cloud.google.com/storage/docs) is an S3-interoperable (https://cloud.google.com/storage/docs/interoperability) object storage service from Google Cloud Platform. it's giving corporate cloud but make it interoperable โจ
To connect to Google Cloud Storage you will need an access key and a secret key. These can be retrieved by creating an HMAC key (https://cloud.google.com/storage/docs/authentication/managing-hmackeys). yeah bestie, HMAC, not OAuth, it's a whole thing, just go make one ๐ซถ
[gs]
type = s3
provider = GCS
access_key_id = your_access_key
secret_access_key = your_secret_key
endpoint = https://storage.googleapis.com
โ ๏ธ Heads up fr fr:--s3-versionsdoes not work with GCS when it needs to do directory paging. rclone will return the error:s3 protocol error: received versions listing with IsTruncated set with no NextKeyMarkerThis is Google bug #312292516 (https://issuetracker.google.com/u/0/issues/312292516). not rclone's fault bestie, we're just the messenger ๐ญ
๐ธ Hetzner Object Storage ๐ธ
Here's an example of making a Hetzner Object Storage (https://www.hetzner.com/storage/object-storage/) configuration. First run:
rclone config
This will guide you through an interactive setup process. walk with me ๐ซ
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
Enter name for new remote.
name> my-hetzner
Option Storage.
Type of storage to configure.
Choose a number from below, or type in your own value.
[snip]
XX / Amazon S3 Compliant Storage Providers including AWS, Alibaba, ArvanCloud, Ceph, ChinaMobile, Cloudflare, DigitalOcean, Dreamhost, GCS, Hetzner, HuaweiOBS, IBMCOS, IDrive, IONOS, LyveCloud, Leviia, Liara, Linode, Magalu, Minio, Netease, Outscale, Petabox, RackCorp, Rclone, Scaleway, SeaweedFS, Selectel, Storj, Synology, TencentCOS, Wasabi, Qiniu and others
\ (s3)
[snip]
Storage> s3
Option provider.
Choose your S3 provider.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
[snip]
XX / Hetzner Object Storage
\ (Hetzner)
[snip]
provider> Hetzner
Option env_auth.
Get AWS credentials from runtime (environment variables or EC2/ECS meta data if no env vars).
Only applies if access_key_id and secret_access_key is blank.
Choose a number from below, or type in your own boolean value (true or false).
Press Enter for the default (false).
1 / Enter AWS credentials in the next step.
\ (false)
2 / Get AWS credentials from the environment (env vars or IAM).
\ (true)
env_auth>
Option access_key_id.
AWS Access Key ID.
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
access_key_id> ACCESS_KEY
Option secret_access_key.
AWS Secret Access Key (password).
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
secret_access_key> SECRET_KEY
Option region.
Region to connect to.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
1 / Helsinki
\ (hel1)
2 / Falkenstein
\ (fsn1)
3 / Nuremberg
\ (nbg1)
region>
Option endpoint.
Endpoint for Hetzner Object Storage
Choose a number from below, or type in your own value.
Press Enter to leave empty.
1 / Helsinki
\ (hel1.your-objectstorage.com)
2 / Falkenstein
\ (fsn1.your-objectstorage.com)
3 / Nuremberg
\ (nbg1.your-objectstorage.com)
endpoint>
Option location_constraint.
Location constraint - must be set to match the Region.
Leave blank if not sure. Used when creating buckets only.
Enter a value. Press Enter to leave empty.
location_constraint>
Option acl.
Canned ACL used when creating buckets and storing or copying objects.
This ACL is used for creating objects and if bucket_acl isn't set, for creating buckets too.
For more info visit https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#canned-acl
Note that this ACL is applied when server-side copying objects as S3
doesn't copy the ACL from the source but rather writes a fresh one.
If the acl is an empty string then no X-Amz-Acl: header is added and
the default (private) will be used.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
/ Owner gets FULL_CONTROL.
1 | No one else has access rights (default).
\ (private)
/ Owner gets FULL_CONTROL.
2 | The AllUsers group gets READ access.
\ (public-read)
acl>
Edit advanced config?
y) Yes
n) No (default)
y/n>
Configuration complete.
Options:
- type: s3
- provider: Hetzner
- access_key_id: ACCESS_KEY
- secret_access_key: SECRET_KEY
Keep this "my-hetzner" remote?
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d>
Current remotes:
Name Type
==== ====
my-hetzner s3
e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
e/n/d/r/c/s/q>
This will leave the config file looking like this. ๐
[my-hetzner]
type = s3
provider = Hetzner
access_key_id = ACCESS_KEY
secret_access_key = SECRET_KEY
region = hel1
endpoint = hel1.your-objectstorage.com
acl = private
๐ Hitachi Content Platform (HCP) ๐
Here's an example of making a Hitachi Content Platform (HCP) (https://www.hitachivantara.com/en-us/products/storage/content-platform.html) configuration. First run:
rclone config
This will guide you through an interactive setup process. let's goooo ๐ฅ
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
Enter name for new remote.
name> my-hcp
Option Storage.
Type of storage to configure.
Choose a number from below, or type in your own value.
[snip]
XX / Amazon S3 Compliant Storage Providers including AWS, Alibaba, ArvanCloud, Ceph, ChinaMobile, Cloudflare, DigitalOcean, Dreamhost, GCS, HCP, Hetzner, HuaweiOBS, IBMCOS, IDrive, IONOS, LyveCloud, Leviia, Liara, Linode, Magalu, Minio, Netease, Outscale, Petabox, RackCorp, Rclone, Scaleway, SeaweedFS, Selectel, Storj, Synology, TencentCOS, Wasabi, Qiniu and others
\ (s3)
[snip]
Storage> s3
Option provider.
Choose your S3 provider.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
[snip]
XX / Hitachi Content Platform (HCP)
\ (HCP)
[snip]
provider> HCP
Option env_auth.
Get AWS credentials from runtime (environment variables or EC2/ECS meta data if no env vars).
Only applies if access_key_id and secret_access_key is blank.
Choose a number from below, or type in your own boolean value (true or false).
Press Enter for the default (false).
1 / Enter AWS credentials in the next step.
\ (false)
2 / Get AWS credentials from the environment (env vars or IAM).
\ (true)
env_auth>
Option access_key_id.
AWS Access Key ID.
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
access_key_id> ACCESS_KEY
Option secret_access_key.
AWS Secret Access Key (password).
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
secret_access_key> SECRET_KEY
Option endpoint.
Endpoint for HCP S3 compatible API.
Enter a value. Press Enter to leave empty.
endpoint> https://hcp.example.com
Edit advanced config?
y) Yes
n) No (default)
y/n>
Configuration complete.
Options:
- type: s3
- provider: HCP
- access_key_id: ACCESS_KEY
- secret_access_key: SECRET_KEY
- endpoint: https://hcp.example.com
Keep this "my-hcp" remote?
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d>
Current remotes:
Name Type
==== ====
my-hcp s3
e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
e/n/d/r/c/s/q>
and boom, your config file ends up looking exactly like this ๐
[my-hcp]
type = s3
provider = HCP
access_key_id = ACCESS_KEY
secret_access_key = SECRET_KEY
endpoint = https://hcp.example.com
Known limitations ๐ง
okay bestie, these ones have been spotted out in the wild with HCP version 9.7.x. no cap.
Automatic directory objects
HCP is out here auto-creating zero-byte directory objects (keys ending in /) for every single path component whenever an object gets stored. and these directory objects? HCP manages them internally โ so deleting one through the S3 API doesn't actually delete it, it just drops a delete marker with a special version ID (-3) that cannot itself be deleted ๐ญ. which means rclone literally can't fully purge a bucket on HCP โ you'll have leftover directory objects chilling there after a purge or delete operation. it's giving unkillable.
Transparent gzip decompression
HCP transparently decompresses objects that were uploaded with Content-Encoding: gzip before it stores them (docs: https://docs.hitachivantara.com/r/en-us/content-platform/9.6.x/mk-95hcph002/using-the-hitachi-api-for-amazon-s3/working-with-objects/creating-an-object ). so the stored object ends up holding the raw (uncompressed) data, but the Content-MD5 rclone sent was computed over the compressed bytes ๐. HCP is gonna reject those uploads with a BadDigest error. to dodge that entirely: do not set content-encoding: gzip in object metadata when you're using HCP. periodt.
Huawei OBS ๐ธ
Object Storage Service (OBS) is out here providing stable, secure, efficient, and easy-to-use cloud storage โ letting you store basically any volume of unstructured data in any format and access it from anywhere. iconic behavior.
OBS offers an S3 interface, so you can copy and modify the config below and just drop it into your rclone configuration file โจ
[obs]
type = s3
provider = HuaweiOBS
access_key_id = your-access-key-id
secret_access_key = your-secret-access-key
region = af-south-1
endpoint = obs.af-south-1.myhuaweicloud.com
acl = private
or, if you're a chatty girlie, you can also configure it through the interactive command line ๐
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
name> obs
Option Storage.
Type of storage to configure.
Choose a number from below, or type in your own value.
[snip]
XX / Amazon S3 Compliant Storage Providers including AWS, ...
\ (s3)
[snip]
Storage> s3
Option provider.
Choose your S3 provider.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
[snip]
9 / Huawei Object Storage Service
\ (HuaweiOBS)
[snip]
provider> 9
Option env_auth.
Get AWS credentials from runtime (environment variables or EC2/ECS meta data if no env vars).
Only applies if access_key_id and secret_access_key is blank.
Choose a number from below, or type in your own boolean value (true or false).
Press Enter for the default (false).
1 / Enter AWS credentials in the next step.
\ (false)
2 / Get AWS credentials from the environment (env vars or IAM).
\ (true)
env_auth> 1
Option access_key_id.
AWS Access Key ID.
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
access_key_id> your-access-key-id
Option secret_access_key.
AWS Secret Access Key (password).
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
secret_access_key> your-secret-access-key
Option region.
Region to connect to.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
1 / AF-Johannesburg
\ (af-south-1)
2 / AP-Bangkok
\ (ap-southeast-2)
[snip]
region> 1
Option endpoint.
Endpoint for OBS API.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
1 / AF-Johannesburg
\ (obs.af-south-1.myhuaweicloud.com)
2 / AP-Bangkok
\ (obs.ap-southeast-2.myhuaweicloud.com)
[snip]
endpoint> 1
Option acl.
Canned ACL used when creating buckets and storing or copying objects.
This ACL is used for creating objects and if bucket_acl isn't set, for creating buckets too.
For more info visit https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#canned-acl
Note that this ACL is applied when server-side copying objects as S3
doesn't copy the ACL from the source but rather writes a fresh one.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
/ Owner gets FULL_CONTROL.
1 | No one else has access rights (default).
\ (private)
[snip]
acl> 1
Edit advanced config?
y) Yes
n) No (default)
y/n>
--------------------
[obs]
type = s3
provider = HuaweiOBS
access_key_id = your-access-key-id
secret_access_key = your-secret-access-key
region = af-south-1
endpoint = obs.af-south-1.myhuaweicloud.com
acl = private
--------------------
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d> y
Current remotes:
Name Type
==== ====
obs s3
e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
e/n/d/r/c/s/q> q
IBM COS (S3) ๐ง
info you store with IBM Cloud Object Storage gets encrypted and dispersed across multiple geographic locations, and you reach it through an implementation of the S3 API. this service is running on the distributed storage tech from IBM's Cloud Object Storage System (formerly Cleversafe). more deets right here: <http://www.ibm.com/cloud/object-storage>
to set up access to IBM COS S3, just follow along bestie ๐
- run
rclone configand picknfor a new remote.
2018/02/14 14:13:11 NOTICE: Config file "C:\\Users\\a\\.config\\rclone\\rclone.conf" not found - using defaults
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
- enter the name for the configuration
name> <YOUR NAME>
- select
s3storage.
Choose a number from below, or type in your own value
[snip]
XX / Amazon S3 Compliant Storage Providers including AWS, ...
\ "s3"
[snip]
Storage> s3
- select IBM COS as the S3 Storage Provider.
Choose the S3 provider.
Choose a number from below, or type in your own value
1 / Choose this option to configure Storage to AWS S3
\ "AWS"
2 / Choose this option to configure Storage to Ceph Systems
\ "Ceph"
3 / Choose this option to configure Storage to Dreamhost
\ "Dreamhost"
4 / Choose this option to the configure Storage to IBM COS S3
\ "IBMCOS"
5 / Choose this option to the configure Storage to Minio
\ "Minio"
Provider>4
- enter the Access Key and Secret.
AWS Access Key ID - leave blank for anonymous access or runtime credentials.
access_key_id> <>
AWS Secret Access Key (password) - leave blank for anonymous access or runtime credentials.
secret_access_key> <>
- specify the endpoint for IBM COS. for Public IBM COS, pick from the option below. for On Premise IBM COS, enter an endpoint address.
Endpoint for IBM COS S3 API.
Specify if using an IBM COS On Premise.
Choose a number from below, or type in your own value
1 / US Cross Region Endpoint
\ "s3-api.us-geo.objectstorage.softlayer.net"
2 / US Cross Region Dallas Endpoint
\ "s3-api.dal.us-geo.objectstorage.softlayer.net"
3 / US Cross Region Washington DC Endpoint
\ "s3-api.wdc-us-geo.objectstorage.softlayer.net"
4 / US Cross Region San Jose Endpoint
\ "s3-api.sjc-us-geo.objectstorage.softlayer.net"
5 / US Cross Region Private Endpoint
\ "s3-api.us-geo.objectstorage.service.networklayer.com"
6 / US Cross Region Dallas Private Endpoint
\ "s3-api.dal-us-geo.objectstorage.service.networklayer.com"
7 / US Cross Region Washington DC Private Endpoint
\ "s3-api.wdc-us-geo.objectstorage.service.networklayer.com"
8 / US Cross Region San Jose Private Endpoint
\ "s3-api.sjc-us-geo.objectstorage.service.networklayer.com"
9 / US Region East Endpoint
\ "s3.us-east.objectstorage.softlayer.net"
10 / US Region East Private Endpoint
\ "s3.us-east.objectstorage.service.networklayer.com"
11 / US Region South Endpoint
[snip]
34 / Toronto Single Site Private Endpoint
\ "s3.tor01.objectstorage.service.networklayer.com"
endpoint>1
- specify a IBM COS Location Constraint. the location constraint has to match endpoint when you're using IBM Cloud Public. for on-prem COS, don't select anything from this list โ just hit enter
1 / US Cross Region Standard
\ "us-standard"
2 / US Cross Region Vault
\ "us-vault"
3 / US Cross Region Cold
\ "us-cold"
4 / US Cross Region Flex
\ "us-flex"
5 / US East Region Standard
\ "us-east-standard"
6 / US East Region Vault
\ "us-east-vault"
7 / US East Region Cold
\ "us-east-cold"
8 / US East Region Flex
\ "us-east-flex"
9 / US South Region Standard
\ "us-south-standard"
10 / US South Region Vault
\ "us-south-vault"
[snip]
32 / Toronto Flex
\ "tor01-flex"
location_constraint>1
8. bestie it's ACL time ๐
Pick a canned ACL. IBM Cloud (Storage) supports "public-read" and "private". IBM Cloud(Infra) supports literally every canned ACL. And On-Premise COS? Also supports all the canned ACLs. Slay.
Canned ACL used when creating buckets and/or storing objects in S3.
For more info visit https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#canned-acl
Choose a number from below, or type in your own value
1 / Owner gets FULL_CONTROL. No one else has access rights (default). This acl is available on IBM Cloud (Infra), IBM Cloud (Storage), On-Premise COS
\ "private"
2 / Owner gets FULL_CONTROL. The AllUsers group gets READ access. This acl is available on IBM Cloud (Infra), IBM Cloud (Storage), On-Premise IBM COS
\ "public-read"
3 / Owner gets FULL_CONTROL. The AllUsers group gets READ and WRITE access. This acl is available on IBM Cloud (Infra), On-Premise IBM COS
\ "public-read-write"
4 / Owner gets FULL_CONTROL. The AuthenticatedUsers group gets READ access. Not supported on Buckets. This acl is available on IBM Cloud (Infra) and On-Premise IBM COS
\ "authenticated-read"
acl> 1
9. Okay so now you scroll through the config it just showed you, vibe check it ๐ธ, accept it, save that remote, and dip. Your config file should be giving exactly this:
[xxx]
type = s3
Provider = IBMCOS
access_key_id = xxx
secret_access_key = yyy
endpoint = s3-api.us-geo.objectstorage.softlayer.net
location_constraint = us-standard
acl = private
10. Time to actually run rclone commands, this is the fun part fr fr โจ
- Create a bucket.
rclone mkdir IBM-COS-XREGION:newbucket
- List available buckets.
rclone lsd IBM-COS-XREGION:
-1 2017-11-08 21:16:22 -1 test
-1 2018-02-14 20:16:39 -1 newbucket
- List contents of a bucket.
rclone ls IBM-COS-XREGION:newbucket
18685952 test.exe
- Copy a file from local to remote.
rclone copy /Users/file.txt IBM-COS-XREGION:newbucket
- Copy a file from remote to local.
rclone copy IBM-COS-XREGION:newbucket/file.txt .
- Delete a file on remote.
rclone delete IBM-COS-XREGION:newbucket/file.txt
IBM IAM authentication ๐
If you're using IBM IAM authentication with an IBM API KEY, bestie you gotta fill in these extra parameters too, no skipping:
- Select
falseforenv_auth - Leave
access_key_idandsecret_access_keyblank - Paste your
ibm_api_key
Option ibm_api_key.
IBM API Key to be used to obtain IAM token
Enter a value of type string. Press Enter for the default (1).
ibm_api_key>
- Paste your
ibm_resource_instance_id
Option ibm_resource_instance_id.
IBM service instance id
Enter a value of type string. Press Enter for the default (2).
ibm_resource_instance_id>
- In advanced settings type
trueforv2_auth
Option v2_auth.
If true use v2 authentication.
If this is false (the default) then rclone will use v4 authentication.
If it is set then rclone will use v2 authentication.
Use this only if v4 signatures don't work, e.g. pre Jewel/v10 CEPH.
Enter a boolean value (true or false). Press Enter for the default (true).
v2_auth>
IDrive e2 ๐ฆ
Here's an example of making an IDrive e2 (https://www.idrive.com/e2/) configuration. First run:
rclone config
This will guide you through an interactive setup process, hand-held style ๐ซถ
No remotes found, make a new one\?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
Enter name for new remote.
name> e2
Option Storage.
Type of storage to configure.
Choose a number from below, or type in your own value.
[snip]
XX / Amazon S3 Compliant Storage Providers including AWS, ...
\ (s3)
[snip]
Storage> s3
Option provider.
Choose your S3 provider.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
[snip]
XX / IDrive e2
\ (IDrive)
[snip]
provider> IDrive
Option env_auth.
Get AWS credentials from runtime (environment variables or EC2/ECS meta data if no env vars).
Only applies if access_key_id and secret_access_key is blank.
Choose a number from below, or type in your own boolean value (true or false).
Press Enter for the default (false).
1 / Enter AWS credentials in the next step.
\ (false)
2 / Get AWS credentials from the environment (env vars or IAM).
\ (true)
env_auth>
Option access_key_id.
AWS Access Key ID.
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
access_key_id> YOUR_ACCESS_KEY
Option secret_access_key.
AWS Secret Access Key (password).
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
secret_access_key> YOUR_SECRET_KEY
Option acl.
Canned ACL used when creating buckets and storing or copying objects.
This ACL is used for creating objects and if bucket_acl isn't set, for creating buckets too.
For more info visit https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#canned-acl
Note that this ACL is applied when server-side copying objects as S3
doesn't copy the ACL from the source but rather writes a fresh one.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
/ Owner gets FULL_CONTROL.
1 | No one else has access rights (default).
\ (private)
/ Owner gets FULL_CONTROL.
2 | The AllUsers group gets READ access.
\ (public-read)
/ Owner gets FULL_CONTROL.
3 | The AllUsers group gets READ and WRITE access.
| Granting this on a bucket is generally not recommended.
\ (public-read-write)
/ Owner gets FULL_CONTROL.
4 | The AuthenticatedUsers group gets READ access.
\ (authenticated-read)
/ Object owner gets FULL_CONTROL.
5 | Bucket owner gets READ access.
| If you specify this canned ACL when creating a bucket, Amazon S3 ignores it.
\ (bucket-owner-read)
/ Both the object owner and the bucket owner get FULL_CONTROL over the object.
6 | If you specify this canned ACL when creating a bucket, Amazon S3 ignores it.
\ (bucket-owner-full-control)
acl>
Edit advanced config?
y) Yes
n) No (default)
y/n>
Configuration complete.
Options:
- type: s3
- provider: IDrive
- access_key_id: YOUR_ACCESS_KEY
- secret_access_key: YOUR_SECRET_KEY
- endpoint: q9d9.la12.idrivee2-5.com
Keep this "e2" remote?
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d> y
Impossible Cloud ๐
Impossible Cloud (https://www.impossiblecloud.com/) is a European S3-compatible object storage provider with regions in Europe and the US. Very demure, very European ๐ช๐บ
Heads up bestie, this one matters: Impossible Cloud does not preserve theCache-Control,Content-Disposition,Content-EncodingorContent-Languagesystem metadata fields on retrieval, even when they were set at upload time. And because theContent-Encodingresponse header is also dropped, the--s3-decompressflag has no effect on objects stored there ๐ญ Other metadata such asContent-Typeand the modification time round-trip normally, so those are fine.
Here's an example of making an Impossible Cloud configuration. First run:
rclone config
This will guide you through an interactive setup process. ๐
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
โฆand the transcript just keeps rolling, bestie. Here's the rest of the Impossible Cloud setup, every line of it ๐
Enter name for new remote.
name> my-impossible-cloud
Option Storage.
Type of storage to configure.
Choose a number from below, or type in your own value.
[snip]
XX / Amazon S3 Compliant Storage Providers including AWS, Alibaba, ArvanCloud, Ceph, ChinaMobile, Cloudflare, DigitalOcean, Dreamhost, GCS, Hetzner, HuaweiOBS, IBMCOS, IDrive, ImpossibleCloud, IONOS, LyveCloud, Leviia, Liara, Linode, Magalu, Minio, Netease, Outscale, Petabox, RackCorp, Rclone, Scaleway, SeaweedFS, Selectel, Storj, Synology, TencentCOS, Wasabi, Qiniu and others
\ (s3)
[snip]
Storage> s3
Option provider.
Choose your S3 provider.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
[snip]
XX / Impossible Cloud Object Storage
\ (ImpossibleCloud)
[snip]
provider> ImpossibleCloud
Option env_auth.
Get AWS credentials from runtime (environment variables or EC2/ECS meta data if no env vars).
Only applies if access_key_id and secret_access_key is blank.
Choose a number from below, or type in your own boolean value (true or false).
Press Enter for the default (false).
1 / Enter AWS credentials in the next step.
\ (false)
2 / Get AWS credentials from the environment (env vars or IAM).
\ (true)
env_auth>
Option access_key_id.
AWS Access Key ID.
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
access_key_id> ACCESS_KEY
Option secret_access_key.
AWS Secret Access Key (password).
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
secret_access_key> SECRET_KEY
Option region.
Region to connect to.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
1 / Frankfurt, Germany
\ (eu-central-2)
2 / Amsterdam, Netherlands
\ (eu-west-1)
3 / London, UK
\ (eu-west-2)
4 / Paris, France
\ (eu-west-3)
5 / Poznaล, Poland
\ (eu-east-1)
6 / Copenhagen, Denmark
\ (eu-north-1)
7 / New York, USA
\ (us-east-1)
region> 1
Option endpoint.
Endpoint for Impossible Cloud Object Storage
Choose a number from below, or type in your own value.
Press Enter to leave empty.
1 / Frankfurt, Germany
\ (eu-central-2.storage.impossibleapi.net)
2 / Amsterdam, Netherlands
\ (eu-west-1.storage.impossibleapi.net)
3 / London, UK
\ (eu-west-2.storage.impossibleapi.net)
4 / Paris, France
\ (eu-west-3.storage.impossibleapi.net)
5 / Poznaล, Poland
\ (eu-east-1.storage.impossibleapi.net)
6 / Copenhagen, Denmark
\ (eu-north-1.storage.impossibleapi.net)
7 / New York, USA
\ (us-east-1.storage.impossibleapi.net)
endpoint> 1
Option location_constraint.
Location constraint - must be set to match the Region.
Leave blank if not sure. Used when creating buckets only.
Enter a value. Press Enter to leave empty.
location_constraint>
Option acl.
Canned ACL used when creating buckets and storing or copying objects.
This ACL is used for creating objects and if bucket_acl isn't set, for creating buckets too.
For more info visit https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#canned-acl
Note that this ACL is applied when server-side copying objects as S3
doesn't copy the ACL from the source but rather writes a fresh one.
If the acl is an empty string then no X-Amz-Acl: header is added and
the default (private) will be used.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
/ Owner gets FULL_CONTROL.
1 | No one else has access rights (default).
\ (private)
/ Owner gets FULL_CONTROL.
2 | The AllUsers group gets READ access.
\ (public-read)
acl>
Edit advanced config?
y) Yes
n) No (default)
y/n>
Configuration complete.
Options:
- type: s3
- provider: ImpossibleCloud
- access_key_id: ACCESS_KEY
- secret_access_key: SECRET_KEY
- region: eu-central-2
- endpoint: eu-central-2.storage.impossibleapi.net
Keep this "my-impossible-cloud" remote?
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d>
Current remotes:
Name Type
==== ====
my-impossible-cloud s3
e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
e/n/d/r/c/s/q>
and literally this is what your config file ends up looking like, no cap ๐
[my-impossible-cloud]
type = s3
provider = ImpossibleCloud
access_key_id = ACCESS_KEY
secret_access_key = SECRET_KEY
region = eu-central-2
endpoint = eu-central-2.storage.impossibleapi.net
acl = private
๐ธ Intercolo Object Storage ๐ธ
Intercolo Object Storage (https://intercolo.de/object-storage) is giving GDPR-compliant, transparently priced, S3-compatible cloud storage, and it's hosted in Frankfurt, Germany. Immaculate. ๐ฉ๐ช
ok so here's a lil example of making a configuration for Intercolo.
First run:
rclone config
and it's gonna walk you through an interactive setup process, hand in hand, like a bestie ๐ซถ
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
Enter name for new remote.
name> intercolo
Option Storage.
Type of storage to configure.
Choose a number from below, or type in your own value.
[snip]
xx / Amazon S3 Compliant Storage Providers including AWS, ...
\ (s3)
[snip]
Storage> s3
Option provider.
Choose your S3 provider.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
[snip]
xx / Intercolo Object Storage
\ (Intercolo)
[snip]
provider> Intercolo
Option env_auth.
Get AWS credentials from runtime (environment variables or EC2/ECS meta data if no env vars).
Only applies if access_key_id and secret_access_key is blank.
Choose a number from below, or type in your own boolean value (true or false).
Press Enter for the default (false).
1 / Enter AWS credentials in the next step.
\ (false)
2 / Get AWS credentials from the environment (env vars or IAM).
\ (true)
env_auth> false
Option access_key_id.
AWS Access Key ID.
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
access_key_id> ACCESS_KEY
Option secret_access_key.
AWS Secret Access Key (password).
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
secret_access_key> SECRET_KEY
Option region.
Region where your bucket will be created and your data stored.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
1 / Frankfurt, Germany
\ (de-fra)
region> 1
Option endpoint.
Endpoint for Intercolo Object Storage.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
1 / Frankfurt, Germany
\ (de-fra.i3storage.com)
endpoint> 1
Option acl.
Canned ACL used when creating buckets and storing or copying objects.
This ACL is used for creating objects and if bucket_acl isn't set, for creating buckets too.
For more info visit https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#canned-acl
Note that this ACL is applied when server-side copying objects as S3
doesn't copy the ACL from the source but rather writes a fresh one.
If the acl is an empty string then no X-Amz-Acl: header is added and
the default (private) will be used.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
/ Owner gets FULL_CONTROL.
1 | No one else has access rights (default).
\ (private)
[snip]
acl>
Edit advanced config?
y) Yes
n) No (default)
y/n> n
Configuration complete.
Options:
- type: s3
- provider: Intercolo
- access_key_id: ACCESS_KEY
- secret_access_key: SECRET_KEY
- region: de-fra
- endpoint: de-fra.i3storage.com
Keep this "intercolo" remote?
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d> y
and this is what the config file says afterwards, iconic โจ
[intercolo]
type = s3
provider = Intercolo
access_key_id = ACCESS_KEY
secret_access_key = SECRET_KEY
region = de-fra
endpoint = de-fra.i3storage.com
๐ IONOS Cloud ๐
IONOS S3 Object Storage (https://cloud.ionos.com/storage/object-storage) is a service offered by IONOS for storing and accessing unstructured data. To connect to the service, you're gonna need an access key and a secret key โ those live in the Data Center Designer (https://dcd.ionos.com/), you get there by selecting Manager resources > Object Storage Key Manager. Slay, go fetch them ๐
Here's an example of a configuration. First, run rclone config. This will walk you through an interactive setup process. Type n to add the new remote, and then enter a name:
Enter name for new remote.
name> ionos-fra
Type s3 to choose the connection type:
okay so you're staring at the storage picker, bestie โ let's pick s3 and keep it moving ๐
Option Storage.
Type of storage to configure.
Choose a number from below, or type in your own value.
[snip]
XX / Amazon S3 Compliant Storage Providers including AWS, ...
\ (s3)
[snip]
Storage> s3
Now type IONOS โ that's the provider we're doing here:
Option provider.
Choose your S3 provider.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
[snip]
XX / IONOS Cloud
\ (IONOS)
[snip]
provider> IONOS
Then just smash that Enter to take the default, which is Enter AWS credentials in the next step:
Option env_auth.
Get AWS credentials from runtime (environment variables or EC2/ECS meta data if no env vars).
Only applies if access_key_id and secret_access_key is blank.
Choose a number from below, or type in your own boolean value (true or false).
Press Enter for the default (false).
1 / Enter AWS credentials in the next step.
\ (false)
2 / Get AWS credentials from the environment (env vars or IAM).
\ (true)
env_auth>
Drop in your Access Key and Secret key, okay? โจ You can grab both from the Data Center Designer (https://dcd.ionos.com/) โ click the menu "Manager resources" / "Object Storage Key Manager". iykyk.
Option access_key_id.
AWS Access Key ID.
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
access_key_id> YOUR_ACCESS_KEY
Option secret_access_key.
AWS Secret Access Key (password).
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
secret_access_key> YOUR_SECRET_KEY
Pick the region where your bucket actually lives, queen ๐:
Option region.
Region where your bucket will be created and your data stored.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
1 / Frankfurt, Germany
\ (de)
2 / Berlin, Germany
\ (eu-central-2)
3 / Logrono, Spain
\ (eu-south-2)
region> 2
And then the endpoint from that same region โ they gotta match, fr fr:
Option endpoint.
Endpoint for IONOS S3 Object Storage.
Specify the endpoint from the same region.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
1 / Frankfurt, Germany
\ (s3-eu-central-1.ionoscloud.com)
2 / Berlin, Germany
\ (s3-eu-central-2.ionoscloud.com)
3 / Logrono, Spain
\ (s3-eu-south-2.ionoscloud.com)
endpoint> 1
Now hit Enter for the default, or pick whichever ACL setting your heart desires:
Option acl.
Canned ACL used when creating buckets and storing or copying objects.
This ACL is used for creating objects and if bucket_acl isn't set, for creating buckets too.
For more info visit https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#canned-acl
Note that this ACL is applied when server-side copying objects as S3
doesn't copy the ACL from the source but rather writes a fresh one.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
/ Owner gets FULL_CONTROL.
1 | No one else has access rights (default).
\ (private)
/ Owner gets FULL_CONTROL.
[snip]
acl>
Press Enter again to bounce past the advanced config โ no notes, it's giving minimal ๐ :
Edit advanced config?
y) Yes
n) No (default)
y/n>
Then Enter to save the whole thing, and q to dip out of the config process:
Configuration complete.
Options:
- type: s3
- provider: IONOS
- access_key_id: YOUR_ACCESS_KEY
- secret_access_key: YOUR_SECRET_KEY
- endpoint: s3-eu-central-1.ionoscloud.com
Keep this "ionos-fra" remote?
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d> y
Done! ๐ Now you can try some commands (for macOS, use ./rclone instead of rclone).
- Create a bucket (the name must be unique within the whole IONOS S3)
rclone mkdir ionos-fra:my-bucket
- List available buckets
rclone lsd ionos-fra:
- Copy a file from local to remote
rclone copy /Users/file.txt ionos-fra:my-bucket
- List contents of a bucket
rclone ls ionos-fra:my-bucket
- Copy a file from remote to local
rclone copy ionos-fra:my-bucket/file.txt
๐ธ Leviia Cloud Object Storage ๐ธ
Leviia Object Storage (https://www.leviia.com/object-storage/), backup and secure your data in a 100% French cloud, independent of GAFAM.. ๐ฅ
To configure access to Leviia, follow the steps below:
- Run
rclone configand selectnfor a new remote.
rclone config
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
- Give the name of the configuration. For example, name it 'leviia'.
name> leviia
- Select s3 storage.
Choose a number from below, or type in your own value
[snip]
XX / Amazon S3 Compliant Storage Providers including AWS, ...
\ (s3)
[snip]
Storage> s3
- Select Leviia provider.
Choose a number from below, or type in your own value
1 / Amazon Web Services (AWS) S3
\ "AWS"
[snip]
15 / Leviia Object Storage
\ (Leviia)
[snip]
provider> Leviia
- Enter your SecretId and SecretKey of Leviia.
Get AWS credentials from runtime (environment variables or EC2/ECS meta data if no env vars).
Only applies if access_key_id and secret_access_key is blank.
Enter a boolean value (true or false). Press Enter for the default ("false").
Choose a number from below, or type in your own value
1 / Enter AWS credentials in the next step
\ "false"
2 / Get AWS credentials from the environment (env vars or IAM)
\ "true"
env_auth> 1
AWS Access Key ID.
Leave blank for anonymous access or runtime credentials.
Enter a string value. Press Enter for the default ("").
access_key_id> ZnIx.xxxxxxxxxxxxxxx
AWS Secret Access Key (password)
Leave blank for anonymous access or runtime credentials.
Enter a string value. Press Enter for the default ("").
secret_access_key> xxxxxxxxxxx
- Select endpoint for Leviia.
/ The default endpoint
1 | Leviia.
\ (s3.leviia.com)
[snip]
endpoint> 1
- Choose acl.
Note that this ACL is applied when server-side copying objects as S3
doesn't copy the ACL from the source but rather writes a fresh one.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
/ Owner gets FULL_CONTROL.
1 | No one else has access rights (default).
\ (private)
/ Owner gets FULL_CONTROL.
2 | The AllUsers group gets READ access.
\ (public-read)
[snip]
acl> 1
Edit advanced config? (y/n)
y) Yes
n) No (default)
y/n> n
Remote config
--------------------
[leviia]
- type: s3
- provider: Leviia
- access_key_id: ZnIx.xxxxxxx
- secret_access_key: xxxxxxxx
- endpoint: s3.leviia.com
- acl: private
--------------------
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d> y
Current remotes:
Name Type
==== ====
leviia s3
๐ฆ Liara ๐ฆ
Here's an example of making a Liara Object Storage (https://liara.ir/landing/object-storage) configuration. First run:
rclone config
This will guide you through an interactive setup process.
okay bestie so we're mid-rclone config for Liara and the wizard is doing its lil thing ๐
the whole vibe is โจinteractiveโจ and here's literally every keystroke, no cap:
No remotes found, make a new one?
n) New remote
s) Set configuration password
n/s> n
name> Liara
Type of storage to configure.
Choose a number from below, or type in your own value
[snip]
XX / Amazon S3 (also Dreamhost, Ceph, ChinaMobile, ArvanCloud, Liara, Minio)
\ "s3"
[snip]
Storage> s3
Get AWS credentials from runtime (environment variables or EC2/ECS meta data if no env vars). Only applies if access_key_id and secret_access_key is blank.
Choose a number from below, or type in your own value
1 / Enter AWS credentials in the next step
\ "false"
2 / Get AWS credentials from the environment (env vars or IAM)
\ "true"
env_auth> 1
AWS Access Key ID - leave blank for anonymous access or runtime credentials.
access_key_id> YOURACCESSKEY
AWS Secret Access Key (password) - leave blank for anonymous access or runtime credentials.
secret_access_key> YOURSECRETACCESSKEY
Region to connect to.
Choose a number from below, or type in your own value
/ The default endpoint
1 | US Region, Northern Virginia, or Pacific Northwest.
| Leave location constraint empty.
\ "us-east-1"
[snip]
region>
Endpoint for S3 API.
Leave blank if using Liara to use the default endpoint for the region.
Specify if using an S3 clone such as Ceph.
endpoint> storage.iran.liara.space
Canned ACL used when creating buckets and/or storing objects in S3.
For more info visit https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#canned-acl
Choose a number from below, or type in your own value
1 / Owner gets FULL_CONTROL. No one else has access rights (default).
\ "private"
[snip]
acl>
The server-side encryption algorithm used when storing this object in S3.
Choose a number from below, or type in your own value
1 / None
\ ""
2 / AES256
\ "AES256"
server_side_encryption>
The storage class to use when storing objects in S3.
Choose a number from below, or type in your own value
1 / Default
\ ""
2 / Standard storage class
\ "STANDARD"
storage_class>
Remote config
--------------------
[Liara]
env_auth = false
access_key_id = YOURACCESSKEY
secret_access_key = YOURSECRETACCESSKEY
endpoint = storage.iran.liara.space
location_constraint =
acl =
server_side_encryption =
storage_class =
--------------------
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d> y
and boom โ your config file is gonna end up looking exactly like this, fr fr ๐ซถ
[Liara]
type = s3
provider = Liara
env_auth = false
access_key_id = YOURACCESSKEY
secret_access_key = YOURSECRETACCESSKEY
region =
endpoint = storage.iran.liara.space
location_constraint =
acl =
server_side_encryption =
storage_class =
๐ Linode ๐
okay so if you're setting up a Linode Object Storage (https://www.linode.com/products/object-storage/) config, it goes a lil something like this. kick it off with:
rclone config
and it's gonna hold your hand through the whole interactive setup, bestie ๐
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
Enter name for new remote.
name> linode
Option Storage.
Type of storage to configure.
Choose a number from below, or type in your own value.
[snip]
XX / Amazon S3 Compliant Storage Providers including AWS, ...Linode, ...and others
\ (s3)
[snip]
Storage> s3
Option provider.
Choose your S3 provider.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
[snip]
XX / Linode Object Storage
\ (Linode)
[snip]
provider> Linode
Option env_auth.
Get AWS credentials from runtime (environment variables or EC2/ECS meta data if no env vars).
Only applies if access_key_id and secret_access_key is blank.
Choose a number from below, or type in your own boolean value (true or false).
Press Enter for the default (false).
1 / Enter AWS credentials in the next step.
\ (false)
2 / Get AWS credentials from the environment (env vars or IAM).
\ (true)
env_auth>
Option access_key_id.
AWS Access Key ID.
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
access_key_id> ACCESS_KEY
Option secret_access_key.
AWS Secret Access Key (password).
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
secret_access_key> SECRET_ACCESS_KEY
Option endpoint.
Endpoint for Linode Object Storage API.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
1 / Amsterdam (Netherlands), nl-ams-1
\ (nl-ams-1.linodeobjects.com)
2 / Atlanta, GA (USA), us-southeast-1
\ (us-southeast-1.linodeobjects.com)
3 / Chennai (India), in-maa-1
\ (in-maa-1.linodeobjects.com)
4 / Chicago, IL (USA), us-ord-1
\ (us-ord-1.linodeobjects.com)
5 / Frankfurt (Germany), eu-central-1
\ (eu-central-1.linodeobjects.com)
6 / Jakarta (Indonesia), id-cgk-1
\ (id-cgk-1.linodeobjects.com)
7 / London 2 (Great Britain), gb-lon-1
\ (gb-lon-1.linodeobjects.com)
8 / Los Angeles, CA (USA), us-lax-1
\ (us-lax-1.linodeobjects.com)
9 / Madrid (Spain), es-mad-1
\ (es-mad-1.linodeobjects.com)
10 / Melbourne (Australia), au-mel-1
\ (au-mel-1.linodeobjects.com)
11 / Miami, FL (USA), us-mia-1
\ (us-mia-1.linodeobjects.com)
12 / Milan (Italy), it-mil-1
\ (it-mil-1.linodeobjects.com)
13 / Newark, NJ (USA), us-east-1
\ (us-east-1.linodeobjects.com)
14 / Osaka (Japan), jp-osa-1
\ (jp-osa-1.linodeobjects.com)
15 / Paris (France), fr-par-1
\ (fr-par-1.linodeobjects.com)
16 / Sรฃo Paulo (Brazil), br-gru-1
\ (br-gru-1.linodeobjects.com)
17 / Seattle, WA (USA), us-sea-1
\ (us-sea-1.linodeobjects.com)
18 / Singapore, ap-south-1
\ (ap-south-1.linodeobjects.com)
19 / Singapore 2, sg-sin-1
\ (sg-sin-1.linodeobjects.com)
20 / Stockholm (Sweden), se-sto-1
\ (se-sto-1.linodeobjects.com)
21 / Washington, DC, (USA), us-iad-1
\ (us-iad-1.linodeobjects.com)
endpoint> 5
Option acl.
Canned ACL used when creating buckets and storing or copying objects.
This ACL is used for creating objects and if bucket_acl isn't set, for creating buckets too.
For more info visit https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#canned-acl
Note that this ACL is applied when server-side copying objects as S3
doesn't copy the ACL from the source but rather writes a fresh one.
If the acl is an empty string then no X-Amz-Acl: header is added and
the default (private) will be used.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
/ Owner gets FULL_CONTROL.
1 | No one else has access rights (default).
\ (private)
[snip]
acl>
Edit advanced config?
y) Yes
n) No (default)
y/n> n
Configuration complete.
Options:
- type: s3
- provider: Linode
- access_key_id: ACCESS_KEY
- secret_access_key: SECRET_ACCESS_KEY
- endpoint: eu-central-1.linodeobjects.com
Keep this "linode" remote?
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d> y
and your config file ends up looking like this ๐
[linode]
type = s3
provider = Linode
access_key_id = ACCESS_KEY
secret_access_key = SECRET_ACCESS_KEY
endpoint = eu-central-1.linodeobjects.com
heads up babes ๐ธ Linode Object Storage is Ceph-backed. rclone defaultssign_accept_encodingtofalsefor this provider so that SigV4 requests don't fail withSignatureDoesNotMatch(peep the Ceph section ๐).
๐ Magalu ๐
want a Magalu Object Storage (https://magalu.cloud/object-storage/) config? iconic, let's go. first run:
rclone config
and the wizard's got you, no thoughts head empty, just follow along โจ
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
Enter name for new remote.
name> magalu
Option Storage.
Type of storage to configure.
Choose a number from below, or type in your own value.
[snip]
XX / Amazon S3 Compliant Storage Providers including AWS, ...Magalu, ...and others
\ (s3)
[snip]
Storage> s3
Option provider.
Choose your S3 provider.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
[snip]
XX / Magalu Object Storage
\ (Magalu)
[snip]
provider> Magalu
Option env_auth.
Get AWS credentials from runtime (environment variables or EC2/ECS meta data if no env vars).
Only applies if access_key_id and secret_access_key is blank.
Choose a number from below, or type in your own boolean value (true or false).
Press Enter for the default (false).
1 / Enter AWS credentials in the next step.
\ (false)
2 / Get AWS credentials from the environment (env vars or IAM).
\ (true)
env_auth> 1
magalu, part two โ the saga continues ๐
Okay so we're still in the middle of the Magalu rclone config interview and it is still asking questions, because of course it is. Here's the rest of the convo, bestie:
Option access_key_id.
AWS Access Key ID.
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
access_key_id> ACCESS_KEY
Option secret_access_key.
AWS Secret Access Key (password).
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
secret_access_key> SECRET_ACCESS_KEY
Option endpoint.
Endpoint for Magalu Object Storage API.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
1 / Sรฃo Paulo, SP (BR), br-se1
\ (br-se1.magaluobjects.com)
2 / Fortaleza, CE (BR), br-ne1
\ (br-ne1.magaluobjects.com)
endpoint> 2
Option acl.
Canned ACL used when creating buckets and storing or copying objects.
This ACL is used for creating objects and if bucket_acl isn't set, for creating buckets too.
For more info visit https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#canned-acl
Note that this ACL is applied when server-side copying objects as S3
doesn't copy the ACL from the source but rather writes a fresh one.
If the acl is an empty string then no X-Amz-Acl: header is added and
the default (private) will be used.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
/ Owner gets FULL_CONTROL.
1 | No one else has access rights (default).
\ (private)
[snip]
acl>
Edit advanced config?
y) Yes
n) No (default)
y/n> n
Configuration complete.
Options:
- type: s3
- provider: magalu
- access_key_id: ACCESS_KEY
- secret_access_key: SECRET_ACCESS_KEY
- endpoint: br-ne1.magaluobjects.com
Keep this "magalu" remote?
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d> y
quick note on that acl question โ if you hand it an empty string, rclone does not add an X-Amz-Acl: header at all, and the default private gets used instead. And remember the ACL is a fresh write, not a copy โ S3 doesn't carry the source's ACL over during a server-side copy. ๐ซถ
And boom, the config file ends up looking like this:
[magalu]
type = s3
provider = Magalu
access_key_id = ACCESS_KEY
secret_access_key = SECRET_ACCESS_KEY
endpoint = br-ne1.magaluobjects.com
MEGA S4 ๐
MEGA S4 Object Storage (https://mega.io/objectstorage) is an S3 compatible object storage system. It's got one single pricing tier, no extra charges for data transfers or API requests, and it's included in existing Pro plans. No cap, that's a vibe. ๐
Here's an example of making a configuration. First run:
rclone config
and it'll walk you through the whole interactive setup process, like so:
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
Enter name for new remote.
name> megas4
Option Storage.
Type of storage to configure.
Choose a number from below, or type in your own value.
[snip]
XX / Amazon S3 Compliant Storage Providers including AWS,... Mega, ...
\ (s3)
[snip]
Storage> s3
Option provider.
Choose your S3 provider.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
[snip]
XX / MEGA S4 Object Storage
\ (Mega)
[snip]
provider> Mega
Option env_auth.
Get AWS credentials from runtime (environment variables or EC2/ECS meta data if no env vars).
Only applies if access_key_id and secret_access_key is blank.
Choose a number from below, or type in your own boolean value (true or false).
Press Enter for the default (false).
1 / Enter AWS credentials in the next step.
\ (false)
2 / Get AWS credentials from the environment (env vars or IAM).
\ (true)
env_auth>
Option access_key_id.
AWS Access Key ID.
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
access_key_id> XXX
Option secret_access_key.
AWS Secret Access Key (password).
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
secret_access_key> XXX
Option endpoint.
Endpoint for S3 API.
Required when using an S3 clone.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
1 / Mega S4 eu-central-1 (Amsterdam)
\ (s3.eu-central-1.s4.mega.io)
2 / Mega S4 eu-central-2 (Bettembourg)
\ (s3.eu-central-2.s4.mega.io)
3 / Mega S4 ca-central-1 (Montreal)
\ (s3.ca-central-1.s4.mega.io)
4 / Mega S4 ca-west-1 (Vancouver)
\ (s3.ca-west-1.s4.mega.io)
endpoint> 1
Edit advanced config?
y) Yes
n) No (default)
y/n> n
Configuration complete.
Options:
- type: s3
- provider: Mega
- access_key_id: XXX
- secret_access_key: XXX
- endpoint: s3.eu-central-1.s4.mega.io
Keep this "megas4" remote?
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d> y
Look at those endpoint options โ Amsterdam, Bettembourg, Montreal, Vancouver. Pick your city, pick your vibe. ๐โจ And that leaves the config file looking like:
[megas4]
type = s3
provider = Mega
access_key_id = XXX
secret_access_key = XXX
endpoint = s3.eu-central-1.s4.mega.io
Minio ๐
Minio (https://minio.io/) is an object storage server built for cloud application developers and devops.
It's super easy to install and it gives you an S3 compatible server that rclone can talk to. Obsessed.
To use it, install Minio following the instructions here (https://docs.minio.io/docs/minio-quickstart-guide).
When it configures itself, Minio will print something like this:
Endpoint: http://192.168.1.106:9000 http://172.23.0.1:9000
AccessKey: USWUXHGYZQYFYFFIT3RE
SecretKey: MOJRH0mkL1IPauahWITSVvyDrQbEEIwljvmxdq03
Region: us-east-1
SQS ARNs: arn:minio:sqs:us-east-1:1:redis arn:minio:sqs:us-east-1:2:redis
Browser Access:
http://192.168.1.106:9000 http://172.23.0.1:9000
Command-line Access: https://docs.minio.io/docs/minio-client-quickstart-guide
$ mc config host add myminio http://192.168.1.106:9000 USWUXHGYZQYFYFFIT3RE MOJRH0mkL1IPauahWITSVvyDrQbEEIwljvmxdq03
Object API (Amazon S3 compatible):
Go: https://docs.minio.io/docs/golang-client-quickstart-guide
Java: https://docs.minio.io/docs/java-client-quickstart-guide
Python: https://docs.minio.io/docs/python-client-quickstart-guide
JavaScript: https://docs.minio.io/docs/javascript-client-quickstart-guide
.NET: https://docs.minio.io/docs/dotnet-client-quickstart-guide
Drive Capacity: 26 GiB Free, 165 GiB Total
Those details need to go into rclone config like this. Note that it is important to put the region in as stated above. Don't skip it, bestie, it matters:
env_auth> 1
access_key_id> USWUXHGYZQYFYFFIT3RE
secret_access_key> MOJRH0mkL1IPauahWITSVvyDrQbEEIwljvmxdq03
region> us-east-1
endpoint> http://192.168.1.106:9000
location_constraint>
server_side_encryption>
Which makes the config file look like this:
[minio]
type = s3
provider = Minio
env_auth = false
access_key_id = USWUXHGYZQYFYFFIT3RE
secret_access_key = MOJRH0mkL1IPauahWITSVvyDrQbEEIwljvmxdq03
region = us-east-1
endpoint = http://192.168.1.106:9000
location_constraint =
server_side_encryption =
So once you're set up, for example, to copy files into a bucket:
rclone copy /path/to/files minio:bucket
slay. ๐
Netease NOS ๐ง
For Netease NOS, configure as per the configurator โ just run rclone config setting the provider to Netease. This will automatically set force_path_style = false, which is necessary for it to run properly. It just does it for you, no notes. ๐
Outscale ๐ธ
OUTSCALE Object Storage (OOS) (https://en.outscale.com/storage/outscale-object-storage/) is an enterprise-grade, S3-compatible storage service provided by OUTSCALE, a brand of Dassault Systรจmes. For more information about OOS, see the official documentation (https://docs.outscale.com/en/userguide/OUTSCALE-Object-Storage-OOS.html).
Here's an example of an OOS configuration that you can paste straight into your rclone configuration file:
[outscale]
type = s3
provider = Outscale
env_auth = false
access_key_id = ABCDEFGHIJ0123456789
secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
region = eu-west-2
endpoint = oos.eu-west-2.outscale.com
acl = private
Or you can also run rclone config to go through the interactive setup process instead, if that's more your energy:
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
Enter name for new remote.
name> outscale
Option Storage.
Type of storage to configure.
Choose a number from below, or type in your own value.
[snip]
X / Amazon S3 Compliant Storage Providers including AWS, ...Outscale, ...and others
\ (s3)
[snip]
Storage> outscale
Option provider.
Choose your S3 provider.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
[snip]
XX / OUTSCALE Object Storage (OOS)
\ (Outscale)
[snip]
provider> Outscale
Option env_auth.
Get AWS credentials from runtime (environment variables or EC2/ECS meta data if no env vars).
Only applies if access_key_id and secret_access_key is blank.
Choose a number from below, or type in your own boolean value (true or false).
Press Enter for the default (false).
1 / Enter AWS credentials in the next step.
\ (false)
2 / Get AWS credentials from the environment (env vars or IAM).
\ (true)
env_auth>
(psst โ the snip lines are just the long option lists getting trimmed in the docs, that's not rclone hiding anything from you, iykyk ๐)
...okay bestie we were literally mid-outscale setup, so let's just keep the transcript rolling โจ
Option access_key_id.
AWS Access Key ID.
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
access_key_id> ABCDEFGHIJ0123456789
Option secret_access_key.
AWS Secret Access Key (password).
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
secret_access_key> XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Option region.
Region where your bucket will be created and your data stored.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
1 / Paris, France
\ (eu-west-2)
2 / New Jersey, USA
\ (us-east-2)
3 / California, USA
\ (us-west-1)
4 / SecNumCloud, Paris, France
\ (cloudgouv-eu-west-1)
5 / Tokyo, Japan
\ (ap-northeast-1)
region> 1
Option endpoint.
Endpoint for S3 API.
Required when using an S3 clone.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
1 / Outscale EU West 2 (Paris)
\ (oos.eu-west-2.outscale.com)
2 / Outscale US east 2 (New Jersey)
\ (oos.us-east-2.outscale.com)
3 / Outscale EU West 1 (California)
\ (oos.us-west-1.outscale.com)
4 / Outscale SecNumCloud (Paris)
\ (oos.cloudgouv-eu-west-1.outscale.com)
5 / Outscale AP Northeast 1 (Japan)
\ (oos.ap-northeast-1.outscale.com)
endpoint> 1
Option acl.
Canned ACL used when creating buckets and storing or copying objects.
This ACL is used for creating objects and if bucket_acl isn't set, for creating buckets too.
For more info visit https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#canned-acl
Note that this ACL is applied when server-side copying objects as S3
doesn't copy the ACL from the source but rather writes a fresh one.
If the acl is an empty string then no X-Amz-Acl: header is added and
the default (private) will be used.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
/ Owner gets FULL_CONTROL.
1 | No one else has access rights (default).
\ (private)
[snip]
acl> 1
Edit advanced config?
y) Yes
n) No (default)
y/n> n
Configuration complete.
Options:
- type: s3
- provider: Outscale
- access_key_id: ABCDEFGHIJ0123456789
- secret_access_key: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
- endpoint: oos.eu-west-2.outscale.com
Keep this "outscale" remote?
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d> y
and that's the whole <hotpink>outscale</hotpink> remote, slayed ๐ peep the receipts at the end: it spat out endpoint: oos.eu-west-2.outscale.com because you picked 1 for both region (Paris, France โ eu-west-2) and endpoint (Outscale EU West 2 (Paris)).
also note the acl menu is literally clipped with [snip] in the docs โ like, they said "you get the idea" ๐ญ โ but don't worry, the next provider spells out the entire canned-ACL menu for you, so stay tuned.
๐ฆ OVHcloud ๐ฆ
OVHcloud Object Storage (https://www.ovhcloud.com/en-ie/public-cloud/object-storage/) is an S3-compatible general-purpose object storage platform and it's available in all OVHcloud regions, which is giving coverage, honestly ๐
to actually use the platform you're gonna need an access key and a secret key. want the full lore on how to interact with it? the documentation lives at https://ovh.to/8stqhuo ๐ซถ
here's an example of making an OVHcloud Object Storage configuration with rclone config โจ
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
Enter name for new remote.
name> ovhcloud-rbx
Option Storage.
Type of storage to configure.
Choose a number from below, or type in your own value.
[...]
XX / Amazon S3 Compliant Storage Providers including AWS, Alibaba, ArvanCloud, Ceph, ChinaMobile, Cloudflare, DigitalOcean, Dreamhost, GCS, HuaweiOBS, IBMCOS, IDrive, IONOS, LyveCloud, Leviia, Liara, Linode, Magalu, Minio, Netease, Outscale, OVHcloud, Petabox, RackCorp, Rclone, Scaleway, SeaweedFS, Selectel, Storj, Synology, TencentCOS, Wasabi, Qiniu and others
\ (s3)
[...]
Storage> s3
Option provider.
Choose your S3 provider.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
[...]
XX / OVHcloud Object Storage
\ (OVHcloud)
[...]
provider> OVHcloud
okay so <purple>Storage</purple> is always the mega-list of S3-compliant providers (it's โจlongโจ, hence the [...]), and then provider is where you pick your actual vibe. this bestie went with OVHcloud. the XX bits are just placeholder numbers standing in for "wherever it lands in the list", iykyk.
Option env_auth.
Get AWS credentials from runtime (environment variables or EC2/ECS meta data if no env vars).
Only applies if access_key_id and secret_access_key is blank.
Choose a number from below, or type in your own boolean value (true or false).
Press Enter for the default (false).
1 / Enter AWS credentials in the next step.
\ (false)
2 / Get AWS credentials from the environment (env vars or IAM).
\ (true)
env_auth> 1
Option access_key_id.
AWS Access Key ID.
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
access_key_id> my_access
Option secret_access_key.
AWS Secret Access Key (password).
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
secret_access_key> my_secret
Option region.
Region where your bucket will be created and your data stored.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
1 / Gravelines, France
\ (gra)
2 / Roubaix, France
\ (rbx)
3 / Strasbourg, France
\ (sbg)
4 / Paris, France (3AZ)
\ (eu-west-par)
5 / Frankfurt, Germany
\ (de)
6 / London, United Kingdom
\ (uk)
7 / Warsaw, Poland
\ (waw)
8 / Beauharnois, Canada
\ (bhs)
9 / Toronto, Canada
\ (ca-east-tor)
10 / Singapore
\ (sgp)
11 / Sydney, Australia
\ (ap-southeast-syd)
12 / Mumbai, India
\ (ap-south-mum)
13 / Vint Hill, Virginia, USA
\ (us-east-va)
14 / Hillsboro, Oregon, USA
\ (us-west-or)
15 / Roubaix, France (Cold Archive)
\ (rbx-archive)
region> 2
Option endpoint.
Endpoint for OVHcloud Object Storage.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
1 / OVHcloud Gravelines, France
\ (s3.gra.io.cloud.ovh.net)
2 / OVHcloud Roubaix, France
\ (s3.rbx.io.cloud.ovh.net)
3 / OVHcloud Strasbourg, France
\ (s3.sbg.io.cloud.ovh.net)
4 / OVHcloud Paris, France (3AZ)
\ (s3.eu-west-par.io.cloud.ovh.net)
5 / OVHcloud Frankfurt, Germany
\ (s3.de.io.cloud.ovh.net)
6 / OVHcloud London, United Kingdom
\ (s3.uk.io.cloud.ovh.net)
7 / OVHcloud Warsaw, Poland
\ (s3.waw.io.cloud.ovh.net)
8 / OVHcloud Beauharnois, Canada
\ (s3.bhs.io.cloud.ovh.net)
9 / OVHcloud Toronto, Canada
\ (s3.ca-east-tor.io.cloud.ovh.net)
10 / OVHcloud Singapore
\ (s3.sgp.io.cloud.ovh.net)
11 / OVHcloud Sydney, Australia
\ (s3.ap-southeast-syd.io.cloud.ovh.net)
12 / OVHcloud Mumbai, India
\ (s3.ap-south-mum.io.cloud.ovh.net)
13 / OVHcloud Vint Hill, Virginia, USA
\ (s3.us-east-va.io.cloud.ovh.us)
14 / OVHcloud Hillsboro, Oregon, USA
\ (s3.us-west-or.io.cloud.ovh.us)
15 / OVHcloud Roubaix, France (Cold Archive)
\ (s3.rbx-archive.io.cloud.ovh.net)
endpoint> 2
fifteen regions and fifteen endpoints, one-to-one, no cap ๐ง they even line up numerically, which is so satisfying ngl. env_auth> 1 means "imma type my creds in right now" โ that's the false option โ and 2 (the true one) is the one that says "go fetch them from the environment (env vars or IAM)". also, env_auth only even matters if access_key_id and secret_access_key are blank, so if you're filling them in like this bestie did, it's just vibes.
Option acl.
Canned ACL used when creating buckets and storing or copying objects.
This ACL is used for creating objects and if bucket_acl isn't set, for creating buckets too.
For more info visit https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#canned-acl
Note that this ACL is applied when server-side copying objects as S3
doesn't copy the ACL from the source but rather writes a fresh one.
If the acl is an empty string then no X-Amz-Acl: header is added and
the default (private) will be used.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
/ Owner gets FULL_CONTROL.
1 | No one else has access rights (default).
\ (private)
/ Owner gets FULL_CONTROL.
2 | The AllUsers group gets READ access.
\ (public-read)
/ Owner gets FULL_CONTROL.
3 | The AllUsers group gets READ and WRITE access.
| Granting this on a bucket is generally not recommended.
\ (public-read-write)
/ Owner gets FULL_CONTROL.
4 | The AuthenticatedUsers group gets READ access.
\ (authenticated-read)
/ Object owner gets FULL_CONTROL.
5 | Bucket owner gets READ access.
| If you specify this canned ACL when creating a bucket, Amazon S3 ignores it.
\ (bucket-owner-read)
/ Both the object owner and the bucket owner get FULL_CONTROL over the object.
6 | If you specify this canned ACL when creating a bucket, Amazon S3 ignores it.
\ (bucket-owner-full-control)
acl> 1
Edit advanced config?
y) Yes
n) No (default)
y/n> n
Configuration complete.
Options:
- type: s3
- provider: OVHcloud
- access_key_id: my_access
- secret_access_key: my_secret
- region: rbx
- endpoint: s3.rbx.io.cloud.ovh.net
- acl: private
Keep this "ovhcloud-rbx" remote?
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d> y
here's the full ACL menu the Outscale section clipped out, bestie ๐ and okay let's talk about it for a sec:
aclis the canned ACL used when creating buckets and storing or copying objects. it's used for creating objects, and ifbucket_aclisn't set, for creating buckets too.- it's applied when server-side copying objects, because S3 doesn't copy the ACL from the source โ it writes a fresh one instead. periodt.
- if
aclis an empty string then noX-Amz-Acl:header is added at all and the default (private) gets used.
heads up: option3(public-read-write) โ "Granting this on a bucket is generally not recommended." ๐ like the docs are being polite but that's a no from me. and options5(bucket-owner-read) and6(bucket-owner-full-control) both come with "If you specify this canned ACL when creating a bucket, Amazon S3 ignores it." so, y'know. noted.
then Edit advanced config? โ n (default), and it hands you the final summary. y/e/d> y = keep this remote, she's a keeper ๐
your configuration file should now look like this:
[ovhcloud-rbx]
type = s3
provider = OVHcloud
access_key_id = my_access
secret_access_key = my_secret
region = rbx
endpoint = s3.rbx.io.cloud.ovh.net
acl = private
and that's <rainbow>ovhcloud-rbx</rainbow> all set up and looking absolutely correct in your config file ๐ฆ๐
๐ธ Petabox ๐ธ
ok bestie so here's the whole vibe of setting up a Petabox (https://petabox.io/) config. First thing you do is run:
rclone config
and then it just walks you through the whole interactive setup, no cap:
No remotes found, make a new one\?
n) New remote
s) Set configuration password
n/s> n
Enter name for new remote.
name> My Petabox Storage
Option Storage.
Type of storage to configure.
Choose a number from below, or type in your own value.
[snip]
XX / Amazon S3 Compliant Storage Providers including AWS, ...
\ "s3"
[snip]
Storage> s3
Option provider.
Choose your S3 provider.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
[snip]
XX / Petabox Object Storage
\ (Petabox)
[snip]
provider> Petabox
Option env_auth.
Get AWS credentials from runtime (environment variables or EC2/ECS meta data if no env vars).
Only applies if access_key_id and secret_access_key is blank.
Choose a number from below, or type in your own boolean value (true or false).
Press Enter for the default (false).
1 / Enter AWS credentials in the next step.
\ (false)
2 / Get AWS credentials from the environment (env vars or IAM).
\ (true)
env_auth> 1
Option access_key_id.
AWS Access Key ID.
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
access_key_id> YOUR_ACCESS_KEY_ID
Option secret_access_key.
AWS Secret Access Key (password).
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
secret_access_key> YOUR_SECRET_ACCESS_KEY
Option region.
Region where your bucket will be created and your data stored.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
1 / US East (N. Virginia)
\ (us-east-1)
2 / Europe (Frankfurt)
\ (eu-central-1)
3 / Asia Pacific (Singapore)
\ (ap-southeast-1)
4 / Middle East (Bahrain)
\ (me-south-1)
5 / South America (Sรฃo Paulo)
\ (sa-east-1)
region> 1
Option endpoint.
Endpoint for Petabox S3 Object Storage.
Specify the endpoint from the same region.
Choose a number from below, or type in your own value.
1 / US East (N. Virginia)
\ (s3.petabox.io)
2 / US East (N. Virginia)
\ (s3.us-east-1.petabox.io)
3 / Europe (Frankfurt)
\ (s3.eu-central-1.petabox.io)
4 / Asia Pacific (Singapore)
\ (s3.ap-southeast-1.petabox.io)
5 / Middle East (Bahrain)
\ (s3.me-south-1.petabox.io)
6 / South America (Sรฃo Paulo)
\ (s3.sa-east-1.petabox.io)
endpoint> 1
Option acl.
Canned ACL used when creating buckets and storing or copying objects.
This ACL is used for creating objects and if bucket_acl isn't set, for creating buckets too.
For more info visit https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#canned-acl
Note that this ACL is applied when server-side copying objects as S3
doesn't copy the ACL from the source but rather writes a fresh one.
If the acl is an empty string then no X-Amz-Acl: header is added and
the default (private) will be used.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
/ Owner gets FULL_CONTROL.
1 | No one else has access rights (default).
\ (private)
/ Owner gets FULL_CONTROL.
2 | The AllUsers group gets READ access.
\ (public-read)
/ Owner gets FULL_CONTROL.
3 | The AllUsers group gets READ and WRITE access.
| Granting this on a bucket is generally not recommended.
\ (public-read-write)
/ Owner gets FULL_CONTROL.
4 | The AuthenticatedUsers group gets READ access.
\ (authenticated-read)
/ Object owner gets FULL_CONTROL.
5 | Bucket owner gets READ access.
| If you specify this canned ACL when creating a bucket, Amazon S3 ignores it.
\ (bucket-owner-read)
/ Both the object owner and the bucket owner get FULL_CONTROL over the object.
6 | If you specify this canned ACL when creating a bucket, Amazon S3 ignores it.
\ (bucket-owner-full-control)
acl> 1
Edit advanced config?
y) Yes
n) No (default)
y/n> No
Configuration complete.
Options:
- type: s3
- provider: Petabox
- access_key_id: YOUR_ACCESS_KEY_ID
- secret_access_key: YOUR_SECRET_ACCESS_KEY
- region: us-east-1
- endpoint: s3.petabox.io
Keep this "My Petabox Storage" remote?
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d> y
โจ and after all that, your config file is just sitting there looking like this ๐
[My Petabox Storage]
type = s3
provider = Petabox
access_key_id = YOUR_ACCESS_KEY_ID
secret_access_key = YOUR_SECRET_ACCESS_KEY
region = us-east-1
endpoint = s3.petabox.io
๐ Pure Storage FlashBlade ๐
Pure Storage FlashBlade (https://www.purestorage.com/products/unstructured-data-storage.html) is like, a high performance S3-compatible object store. main character storage fr.
FlashBlade supports most modern S3 features, including:
ListObjectsV2- Multipart uploads with AWS-compatible ETags
- Advanced checksum algorithms (SHA256, CRC32, CRC32C) with trailer support (Purity//FB 4.4.2+)
- Object versioning and lifecycle management
- Virtual hosted-style requests (requires DNS configuration)
So to configure rclone for Pure Storage FlashBlade, first run:
rclone config
and it'll hold your hand through the whole interactive setup:
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
Enter name for new remote.
name> flashblade
Option Storage.
Type of storage to configure.
Choose a number from below, or type in your own value.
[snip]
4 / Amazon S3 Compliant Storage Providers including AWS, Alibaba, ArvanCloud, Ceph, ChinaMobile, Cloudflare, DigitalOcean, Dreamhost, FlashBlade, GCS, HuaweiOBS, IBMCOS, IDrive, IONOS, LyveCloud, Leviia, Liara, Linode, Magalu, Minio, Netease, Outscale, Petabox, RackCorp, Rclone, Scaleway, SeaweedFS, Selectel, Storj, Synology, TencentCOS, Wasabi, Qiniu and others
\ (s3)
[snip]
Storage> s3
Option provider.
Choose your S3 provider.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
[snip]
9 / Pure Storage FlashBlade Object Storage
\ (FlashBlade)
[snip]
provider> FlashBlade
Option env_auth.
Get AWS credentials from runtime (environment variables or EC2/ECS meta data if no env vars).
Only applies if access_key_id and secret_access_key is blank.
Choose a number from below, or type in your own boolean value (true or false).
Press Enter for the default (false).
1 / Enter AWS credentials in the next step.
\ (false)
2 / Get AWS credentials from the environment (env vars or IAM).
\ (true)
env_auth> 1
Option access_key_id.
AWS Access Key ID.
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
access_key_id> ACCESS_KEY_ID
Option secret_access_key.
AWS Secret Access Key (password).
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
secret_access_key> SECRET_ACCESS_KEY
Option endpoint.
Endpoint for S3 API.
Required when using an S3 clone.
Enter a value. Press Enter to leave empty.
endpoint> https://s3.flashblade.example.com
Edit advanced config?
y) Yes
n) No (default)
y/n> n
Configuration complete.
Options:
- type: s3
- provider: FlashBlade
- access_key_id: ACCESS_KEY_ID
- secret_access_key: SECRET_ACCESS_KEY
- endpoint: https://s3.flashblade.example.com
Keep this "flashblade" remote?
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d> y
And boom, that leaves you with this stored in ~/.config/rclone/rclone.conf:
[flashblade]
type = s3
provider = FlashBlade
access_key_id = ACCESS_KEY_ID
secret_access_key = SECRET_ACCESS_KEY
endpoint = https://s3.flashblade.example.com
๐ซถ Note bestie: the FlashBlade endpoint should be the S3 data VIP. For virtual-hosted style requests, make sure your DNS is set up right โ subdomains of the endpoint hostname should resolve to a FlashBlade data VIP. So like, if your endpoint ishttps://s3.flashblade.example.com, thenbucket-name.s3.flashblade.example.comshould also resolve to that data VIP. iykyk ๐
๐ฆ Qiniu Cloud Object Storage (Kodo) ๐ฆ
Qiniu Cloud Object Storage (Kodo) (https://www.qiniu.com/en/products/kodo), a completely independent-researched core technology which is proven by repeated customer experience has occupied absolute leading market leader position. Kodo can be widely applied to mass data management. ๐
To configure access to Qiniu Kodo, follow the steps below:
- Run
rclone configand selectnfor a new remote.
rclone config
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
- Give the name of the configuration. For example, name it 'qiniu'.
name> qiniu
- Select
s3storage.
okay bestie, the wizard's still mid-glow-up and it just asked which storage type you want โ and obviously you're picking s3 ๐ซถ
Choose a number from below, or type in your own value
[snip]
XX / Amazon S3 Compliant Storage Providers including AWS, ...
\ (s3)
[snip]
Storage> s3
- Select Qiniu provider. ๐ซ It's literally in the list, just scroll to it.
Choose a number from below, or type in your own value
1 / Amazon Web Services (AWS) S3
\ "AWS"
[snip]
22 / Qiniu Object Storage (Kodo)
\ (Qiniu)
[snip]
provider> Qiniu
- Enter your SecretId and SecretKey of Qiniu Kodo. ๐ (
access_key_idandsecret_access_key, same energy.)
Get AWS credentials from runtime (environment variables or EC2/ECS meta data if no env vars).
Only applies if access_key_id and secret_access_key is blank.
Enter a boolean value (true or false). Press Enter for the default ("false").
Choose a number from below, or type in your own value
1 / Enter AWS credentials in the next step
\ "false"
2 / Get AWS credentials from the environment (env vars or IAM)
\ "true"
env_auth> 1
AWS Access Key ID.
Leave blank for anonymous access or runtime credentials.
Enter a string value. Press Enter for the default ("").
access_key_id> AKIDxxxxxxxxxx
AWS Secret Access Key (password)
Leave blank for anonymous access or runtime credentials.
Enter a string value. Press Enter for the default ("").
secret_access_key> xxxxxxxxxxx
- Select endpoint for Qiniu Kodo. ๐ This is the standard endpoint for different regions.
Choose a number from below, or type in your own value
/ The default endpoint - a good choice if you are unsure.
1 | East China Region 1.
| Needs location constraint cn-east-1.
\ (cn-east-1)
/ East China Region 2.
2 | Needs location constraint cn-east-2.
\ (cn-east-2)
/ North China Region 1.
3 | Needs location constraint cn-north-1.
\ (cn-north-1)
/ South China Region 1.
4 | Needs location constraint cn-south-1.
\ (cn-south-1)
/ North America Region.
5 | Needs location constraint us-north-1.
\ (us-north-1)
/ Southeast Asia Region 1.
6 | Needs location constraint ap-southeast-1.
\ (ap-southeast-1)
/ Northeast Asia Region 1.
7 | Needs location constraint ap-northeast-1.
\ (ap-northeast-1)
[snip]
endpoint> 1
and then rclone gets very specific about it: ๐ธ
Option endpoint.
Endpoint for Qiniu Object Storage.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
1 / East China Endpoint 1
\ (s3-cn-east-1.qiniucs.com)
2 / East China Endpoint 2
\ (s3-cn-east-2.qiniucs.com)
3 / North China Endpoint 1
\ (s3-cn-north-1.qiniucs.com)
4 / South China Endpoint 1
\ (s3-cn-south-1.qiniucs.com)
5 / North America Endpoint 1
\ (s3-us-north-1.qiniucs.com)
6 / Southeast Asia Endpoint 1
\ (s3-ap-southeast-1.qiniucs.com)
7 / Northeast Asia Endpoint 1
\ (s3-ap-northeast-1.qiniucs.com)
endpoint> 1
Option location_constraint.
Location constraint - must be set to match the Region.
Used when creating buckets only.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
1 / East China Region 1
\ (cn-east-1)
2 / East China Region 2
\ (cn-east-2)
3 / North China Region 1
\ (cn-north-1)
4 / South China Region 1
\ (cn-south-1)
5 / North America Region 1
\ (us-north-1)
6 / Southeast Asia Region 1
\ (ap-southeast-1)
7 / Northeast Asia Region 1
\ (ap-northeast-1)
location_constraint> 1
side note: location_constraint is only used when creating buckets, ok? so don't stress about it later ๐
- Choose acl and storage class. ๐
Note that this ACL is applied when server-side copying objects as S3
doesn't copy the ACL from the source but rather writes a fresh one.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
/ Owner gets FULL_CONTROL.
1 | No one else has access rights (default).
\ (private)
/ Owner gets FULL_CONTROL.
2 | The AllUsers group gets READ access.
\ (public-read)
[snip]
acl> 2
The storage class to use when storing new objects in Tencent COS.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
1 / Standard storage class
\ (STANDARD)
2 / Infrequent access storage mode
\ (LINE)
3 / Archive storage mode
\ (GLACIER)
4 / Deep archive storage mode
\ (DEEP_ARCHIVE)
[snip]
storage_class> 1
Edit advanced config? (y/n)
y) Yes
n) No (default)
y/n> n
Remote config
--------------------
[qiniu]
- type: s3
- provider: Qiniu
- access_key_id: xxx
- secret_access_key: xxx
- region: cn-east-1
- endpoint: s3-cn-east-1.qiniucs.com
- location_constraint: cn-east-1
- acl: public-read
- storage_class: STANDARD
--------------------
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d> y
Current remotes:
Name Type
==== ====
qiniu s3
(yes the storage-class prompt literally says Tencent COS in the middle of the Qiniu section โ that's just what it prints, don't @ me ๐ญ)
๐ธ FileLu S5 ๐ธ
FileLu S5 Object Storage (https://s5lu.com) is an S3-compatible object storage situation. It's giving multiple region options (Global, US-East, EU-Central, AP-Southeast, and ME-Central) โ all while using a single endpoint (s5lu.com). FileLu S5 is designed for scalability, security, and simplicity, with predictable pricing and no hidden charges for data transfers or API requests. obsessed. โจ
Here's an example of making a configuration. First run:
rclone config
This will guide you through an interactive setup process. ๐ฆ
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
Enter name for new remote.
name> s5lu
Option Storage.
Type of storage to configure.
Choose a number from below, or type in your own value.
[snip]
XX / Amazon S3 Compliant Storage Providers including AWS,... FileLu, ...
\ (s3)
[snip]
Storage> s3
Option provider.
Choose your S3 provider.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
[snip]
XX / FileLu S5 Object Storage
\ (FileLu)
[snip]
provider> FileLu
Option env_auth.
Get AWS credentials from runtime (environment variables or EC2/ECS meta data if no env vars).
Only applies if access_key_id and secret_access_key is blank.
Choose a number from below, or type in your own boolean value (true or false).
Press Enter for the default (false).
1 / Enter AWS credentials in the next step.
\ (false)
2 / Get AWS credentials from the environment (env vars or IAM).
\ (true)
env_auth>
Option access_key_id.
AWS Access Key ID.
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
access_key_id> XXX
Option secret_access_key.
AWS Secret Access Key (password).
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
secret_access_key> XXX
Option endpoint.
Endpoint for S3 API.
Required when using an S3 clone.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
1 / Global
\ (global)
2 / North America (US-East)
\ (us-east)
3 / Europe (EU-Central)
\ (eu-central)
4 / Asia Pacific (AP-Southeast)
\ (ap-southeast)
5 / Middle East (ME-Central)
\ (me-central)
region> 1
Edit advanced config?
y) Yes
n) No (default)
y/n> n
Configuration complete.
Options:
- type: s3
- provider: FileLu
- access_key_id: XXX
- secret_access_key: XXX
- endpoint: s5lu.com
Keep this "s5lu" remote?
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d> y
This will leave the config file looking like this. ๐
[s5lu]
type = s3
provider = FileLu
access_key_id = XXX
secret_access_key = XXX
endpoint = s5lu.com
๐ Rabata ๐
Rabata (https://rabata.io) is an S3-compatible secure cloud storage service that offers flat, transparent pricing (no API request fees) while supporting standard S3 APIs. ngl it's suitable for backup, application storage, media workflows, and archive use cases. ๐
โ ๏ธ real talk: server side copy is not implemented with Rabata, which also means modification time of objects cannot be updated. periodt, no notes.
Rclone config: ๐
rclone config
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
Enter name for new remote.
name> Rabata
Option Storage.
Type of storage to configure.
Choose a number from below, or type in your own value.
[snip]
XX / Amazon S3 Compliant Storage Providers including AWS, ...
\ (s3)
[snip]
Storage> s3
Option provider.
Choose your S3 provider.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
[snip]
XX / Rabata Cloud Storage
\ (Rabata)
[snip]
provider> Rabata
Option env_auth.
Get AWS credentials from runtime (environment variables or EC2/ECS meta data if no env vars).
Only applies if access_key_id and secret_access_key is blank.
Choose a number from below, or type in your own boolean value (true or false).
Press Enter for the default (false).
1 / Enter AWS credentials in the next step.
\ (false)
2 / Get AWS credentials from the environment (env vars or IAM).
\ (true)
env_auth>
Option access_key_id.
AWS Access Key ID.
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
access_key_id> ACCESS_KEY_ID
Option secret_access_key.
AWS Secret Access Key (password).
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
secret_access_key> SECRET_ACCESS_KEY
Option region.
Region where your bucket will be created and your data stored.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
1 / US East (N. Virginia)
\ (us-east-1)
2 / EU (Ireland)
\ (eu-west-1)
3 / EU (London)
\ (eu-west-2)
region> 3
Option endpoint.
Endpoint for Rabata Object Storage.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
1 / US East (N. Virginia)
\ (s3.us-east-1.rabata.io)
2 / EU West (Ireland)
\ (s3.eu-west-1.rabata.io)
3 / EU West (London)
\ (s3.eu-west-2.rabata.io)
endpoint> 3
Option location_constraint.
location where your bucket will be created and your data stored.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
1 / US East (N. Virginia)
\ (us-east-1)
2 / EU (Ireland)
\ (eu-west-1)
3 / EU (London)
\ (eu-west-2)
location_constraint> 3
Edit advanced config?
y) Yes
n) No (default)
y/n> n
Configuration complete.
Options:
- type: s3
- provider: Rabata
- access_key_id: ACCESS_KEY_ID
- secret_access_key: SECRET_ACCESS_KEY
- region: eu-west-2
- endpoint: s3.eu-west-2.rabata.io
- location_constraint: eu-west-2
Keep this "rabata" remote?
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d> y
Current remotes:
Name Type
==== ====
rabata s3
ok bestie that's the whole Rabata glow-up complete, remote saved, we love to see it ๐
RackCorp</p> ๐ธ
RackCorp Object Storage (https://www.rackcorp.com/storage/s3storage) is an S3 compatible object storage platform from your friendly cloud provider RackCorp. The service is fast, reliable, well priced and located in many strategic locations unserviced by others, to ensure you can maintain data sovereignty. sovereignty queen behaviour honestly ๐
Before you can use RackCorp Object Storage, you'll need to sign up (https://www.rackcorp.com/signup) for an account on our portal (https://portal.rackcorp.com). Next you can create an access key, a secret key and buckets, in your location of choice with ease. These details are required for the next steps of configuration, when rclone config asks for your access_key_id and secret_access_key.
Your config should end up looking a bit like this:
[RCS3-demo-config]
type = s3
provider = RackCorp
env_auth = true
access_key_id = YOURACCESSKEY
secret_access_key = YOURSECRETACCESSKEY
region = au-nsw
endpoint = s3.rackcorp.com
location_constraint = au-nsw
Rclone Serve S3 ๐ฆ
Rclone can serve any remote over the S3 protocol, no cap. For details see the rclone serve s3 (https://rclone.org/commands/rclone_serve_s3/) documentation.
For example, to serve remote:path over s3, run the server like this:
rclone serve s3 --auth-key ACCESS_KEY_ID,SECRET_ACCESS_KEY remote:path
This will be compatible with an rclone remote which is defined like this:
[serves3]
type = s3
provider = Rclone
endpoint = http://127.0.0.1:8080/
access_key_id = ACCESS_KEY_ID
secret_access_key = SECRET_ACCESS_KEY
use_multipart_uploads = false
Note that setting use_multipart_uploads = false is to work around a bug (https://rclone.org/commands/rclone_serve_s3/#bugs) which will be fixed in due course. ๐ it's a whole workaround, just leave it in, bestie.
Scaleway โจ
Scaleway (https://www.scaleway.com/object-storage/) The Object Storage platform allows you to store anything from backups, logs and web assets to documents and photos. Files can be dropped from the Scaleway console or transferred through our API and CLI or using any S3-compatible tool.
Scaleway provides an S3 interface which can be configured for use with rclone like this:
[scaleway]
type = s3
provider = Scaleway
env_auth = false
endpoint = s3.nl-ams.scw.cloud
access_key_id = SCWXXXXXXXXXXXXXX
secret_access_key = 1111111-2222-3333-44444-55555555555555
region = nl-ams
location_constraint = nl-ams
acl = private
upload_cutoff = 5M
chunk_size = 5M
copy_cutoff = 5M
Scaleway Glacier (https://www.scaleway.com/en/glacier-cold-storage/) is the low-cost S3 Glacier alternative from Scaleway and it works the same way as on S3 by accepting the "GLACIER" storage_class. So you can configure your remote with the storage_class = GLACIER option to upload directly to Scaleway Glacier.
๐จ bestie listen โ Don't forget that in this state you can't read files back after, you will need to restore them to"STANDARD"storage_classfirst before being able to read them (see "restore" section above). Fr fr, they are locked away until you go get them. ๐ญ
Scality ๐
Scality (https://www.scality.com/) RING and ARTESCA both expose an S3-compatible object storage API that works with rclone using s3 as the type and Scality as the provider.
Both products are S3 clones, so you always need to set the endpoint to the S3 API of your deployment (the S3 Connector service on RING, or the S3 data-service endpoint on ARTESCA). The Scality provider uses path-style addressing (endpoint/bucket/key) which is supported out of the box and does not require any wildcard/virtual-host DNS entries. no DNS gymnastics required, we stay winning ๐ง
Get your access key, secret key and endpoint from your Scality administrator (on ARTESCA these are created per account under Identity > Accounts in the UI; on RING they are created with vaultclient or the S3 Console).
Here is an example of making a Scality configuration. First run:
rclone config
This will guide you through an interactive setup process. ๐ซถ
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
Enter name for new remote.
name> scality
Option Storage.
Type of storage to configure.
Choose a number from below, or type in your own value.
[snip]
XX / Amazon S3 Compliant Storage Providers including AWS, ...Scaleway, Scality, SeaweedFS, ...
\ (s3)
[snip]
Storage> s3
Option provider.
Choose your S3 provider.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
[snip]
XX / Scality (RING / ARTESCA)
\ (Scality)
[snip]
provider> Scality
Option env_auth.
Get AWS credentials from runtime (environment variables or EC2/ECS meta data if no env vars).
Only applies if access_key_id and secret_access_key is blank.
Choose a number from below, or type in your own boolean value (true or false).
Press Enter for the default (false).
1 / Enter AWS credentials in the next step.
\ (false)
2 / Get AWS credentials from the environment (env vars or IAM).
\ (true)
env_auth>
Option access_key_id.
AWS Access Key ID.
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
access_key_id> S3_ACCESS_KEY
Option secret_access_key.
AWS Secret Access Key (password).
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
secret_access_key> S3_SECRET_KEY
Option region.
Region to connect to.
Leave blank if you are using an S3 clone and you don't have a region.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
/ Use this if unsure.
1 | Will use v4 signatures and an empty region.
\ ()
/ Use this only if v4 signatures don't work.
2 | E.g. pre Jewel/v10 CEPH.
\ (other-v2-signature)
region>
Option endpoint.
Endpoint for S3 API.
Required when using an S3 clone.
Enter a value. Press Enter to leave empty.
endpoint> https://s3.example.com
Edit advanced config?
y) Yes
n) No (default)
y/n>
Configuration complete.
Options:
- type: s3
- provider: Scality
- access_key_id: S3_ACCESS_KEY
- secret_access_key: S3_SECRET_KEY
- endpoint: https://s3.example.com
Keep this "scality" remote?
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d> y
iconic. we ate that entire config walkthrough and left no crumbs ๐
This will leave the config file looking like this.
[scality]
type = s3
provider = Scality
access_key_id = S3_ACCESS_KEY
secret_access_key = S3_SECRET_KEY
endpoint = https://s3.example.com
๐ Seagate Lyve Cloud ๐
Seagate Lyve Cloud (https://www.seagate.com/gb/en/services/cloud/storage/) is an S3 compatible object storage platform from Seagate (https://seagate.com/) and it's built for enterprise use, bestie. Big corporate energy, but the config is chill. ๐ขโจ
Here's a whole config run-through for a remote called remote โ you can literally name yours whatever you want, boo. ๐ซถ But heads up: to create an access key and secret key you're gonna need to make a service account first. No shortcuts there.
$ rclone config
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
name> remote
Okay so step one, pick the s3 backend:
Type of storage to configure.
Choose a number from below, or type in your own value.
[snip]
XX / Amazon S3 Compliant Storage Providers including AWS, ...
\ (s3)
[snip]
Storage> s3
Then choose LyveCloud as your S3 provider โ it's right there in the list, go get it:
Choose your S3 provider.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
[snip]
XX / Seagate Lyve Cloud
\ (LyveCloud)
[snip]
provider> LyveCloud
Now just take the default (aka smash that enter key ๐ ) so you can type your access key and secret straight into the config file:
Get AWS credentials from runtime (environment variables or EC2/ECS meta data if no env vars).
Only applies if access_key_id and secret_access_key is blank.
Choose a number from below, or type in your own boolean value (true or false).
Press Enter for the default (false).
1 / Enter AWS credentials in the next step.
\ (false)
2 / Get AWS credentials from the environment (env vars or IAM).
\ (true)
env_auth>
AWS Access Key ID.
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
access_key_id> XXX
AWS Secret Access Key (password).
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
secret_access_key> YYY
Leave the region blank, bestie, don't overthink it:
Region to connect to.
Leave blank if you are using an S3 clone and you don't have a region.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
/ Use this if unsure.
1 | Will use v4 signatures and an empty region.
\ ()
/ Use this only if v4 signatures don't work.
2 | E.g. pre Jewel/v10 CEPH.
\ (other-v2-signature)
region>
Now the important one โ enter your Lyve Cloud endpoint. ๐ซฃ This field cannot be kept empty. Like, you literally cannot skip it, so don't even try:
Endpoint for Lyve Cloud S3 API.
Required when using an S3 clone.
Please type in your LyveCloud endpoint.
Examples:
- s3.us-west-1.{account_name}.lyve.seagate.com (US West 1 - California)
- s3.eu-west-1.{account_name}.lyve.seagate.com (US West 1 - Ireland)
Enter a value.
endpoint> s3.us-west-1.global.lyve.seagate.com
Leave the location constraint blank too:
Location constraint - must be set to match the Region.
Leave blank if not sure. Used when creating buckets only.
Enter a value. Press Enter to leave empty.
location_constraint>
And pick the default ACL, which is private:
Canned ACL used when creating buckets and storing or copying objects.
This ACL is used for creating objects and if bucket_acl isn't set, for creating buckets too.
For more info visit https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#canned-acl
Note that this ACL is applied when server-side copying objects as S3
doesn't copy the ACL from the source but rather writes a fresh one.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
/ Owner gets FULL_CONTROL.
1 | No one else has access rights (default).
\ (private)
[snip]
acl>
And bestie, your config file should end up looking exactly like this:
[remote]
type = s3
provider = LyveCloud
access_key_id = XXX
secret_access_key = YYY
endpoint = s3.us-east-1.lyvecloud.seagate.com
๐ฟ SeaweedFS ๐ฑ
SeaweedFS (https://github.com/chrislusf/seaweedfs/) is a distributed storage system for blobs, objects, files, and data lake โ iconic behavior, honestly โ with O(1) disk seek and a scalable file metadata store. It's got an S3 compatible object storage interface. โจ
And plot twist: SeaweedFS can also act as a gateway to remote S3 compatible object store (https://github.com/chrislusf/seaweedfs/wiki/Gateway-to-Remote-Object-Storage) so it can cache data and metadata with asynchronous write back โ that's for fast local speed and to minimize access cost. Caching queen behavior, we love to see it. ๐
So let's say your SeaweedFS is configured with weed shell like this:
> s3.bucket.create -name foo
> s3.configure -access_key=any -secret_key=any -buckets=foo -user=me -actions=Read,Write,List,Tagging,Admin -apply
{
"identities": [
{
"name": "me",
"credentials": [
{
"accessKey": "any",
"secretKey": "any"
}
],
"actions": [
"Read:foo",
"Write:foo",
"List:foo",
"Tagging:foo",
"Admin:foo"
]
}
]
}
Then to use rclone with SeaweedFS, that config above should end up looking something like this in your rclone config:
[seaweedfs_s3]
type = s3
provider = SeaweedFS
access_key_id = any
secret_access_key = any
endpoint = localhost:8333
And once it's all set up, for example to copy files into a bucket:
rclone copy /path/to/files seaweedfs_s3:foo
Slay. That's it. ๐
๐ง Selectel ๐
Selectel Cloud Storage (https://selectel.ru/services/cloud/storage/) is an S3 compatible storage system packing triple redundancy storage, automatic scaling, high availability and a comprehensive IAM system. Triple redundancy?? Obsessed. ๐ญโจ
Selectel has a whole section on their website dedicated to configuring rclone (https://docs.selectel.ru/en/cloud/object-storage/tools/rclone/) that shows you how to make the right API keys. Go check it, bestie.
From rclone v1.69 Selectel is a supported operator โ so please choose the Selectel provider type, okay? No cap.
Also lowkey important: use "vHosted" access for the buckets (which is the recommended default), not "path style". Don't be out here picking path style, iykyk.
You can use rclone config to make a new provider like this:
No remotes found, make a new one\?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
Enter name for new remote.
name> selectel
Option Storage.
Type of storage to configure.
Choose a number from below, or type in your own value.
[snip]
XX / Amazon S3 Compliant Storage Providers including ..., Selectel, ...
\ (s3)
[snip]
Storage> s3
Option provider.
Choose your S3 provider.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
[snip]
XX / Selectel Object Storage
\ (Selectel)
[snip]
provider> Selectel
Option env_auth.
Get AWS credentials from runtime (environment variables or EC2/ECS meta data if no env vars).
Only applies if access_key_id and secret_access_key is blank.
Choose a number from below, or type in your own boolean value (true or false).
Press Enter for the default (false).
1 / Enter AWS credentials in the next step.
\ (false)
2 / Get AWS credentials from the environment (env vars or IAM).
\ (true)
env_auth> 1
Option access_key_id.
AWS Access Key ID.
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
access_key_id> ACCESS_KEY
Option secret_access_key.
AWS Secret Access Key (password).
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
secret_access_key> SECRET_ACCESS_KEY
Option region.
Region where your data stored.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
1 / St. Petersburg
\ (ru-1)
region> 1
Option endpoint.
Endpoint for Selectel Object Storage.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
1 / Saint Petersburg
\ (s3.ru-1.storage.selcloud.ru)
endpoint> 1
Edit advanced config?
y) Yes
n) No (default)
y/n> n
Configuration complete.
Options:
- type: s3
- provider: Selectel
- access_key_id: ACCESS_KEY
- secret_access_key: SECRET_ACCESS_KEY
- region: ru-1
- endpoint: s3.ru-1.storage.selcloud.ru
Keep this "selectel" remote?
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d> y
And your config should end up looking like this:
[selectel]
type = s3
provider = Selectel
access_key_id = ACCESS_KEY
secret_access_key = SECRET_ACCESS_KEY
region = ru-1
endpoint = s3.ru-1.storage.selcloud.ru
Ate that up, no crumbs. ๐
๐ฅ๏ธ Servercore ๐ก๏ธ
Servercore Object Storage (https://servercore.com/services/object-storage/) is an S3 compatible object storage system that gives you scalable and secure storage solutions for businesses of all sizes. Big, small, whatever โ it's giving flexible. โจ
Here's the rclone config example:
No remotes found, make a new one\?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
Enter name for new remote.
name> servercore
Option Storage.
Type of storage to configure.
Choose a number from below, or type in your own value.
[snip]
XX / Amazon S3 Compliant Storage Providers including ..., Servercore, ...
\ (s3)
[snip]
Storage> s3
Option provider.
Choose your S3 provider.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
[snip]
XX / Servercore Object Storage
\ (Servercore)
[snip]
provider> Servercore
Option env_auth.
Get AWS credentials from runtime (environment variables or EC2/ECS meta data if no env vars).
Only applies if access_key_id and secret_access_key is blank.
Choose a number from below, or type in your own boolean value (true or false).
Press Enter for the default (false).
1 / Enter AWS credentials in the next step.
\ (false)
2 / Get AWS credentials from the environment (env vars or IAM).
\ (true)
env_auth> 1
Option access_key_id.
AWS Access Key ID.
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
access_key_id> ACCESS_KEY
Option secret_access_key.
AWS Secret Access Key (password).
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
secret_access_key> SECRET_ACCESS_KEY
Option region.
Region where your is data stored.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
1 / St. Petersburg
\ (ru-1)
2 / Moscow
\ (gis-1)
3 / Moscow
\ (ru-7)
4 / Tashkent, Uzbekistan
\ (uz-2)
5 / Almaty, Kazakhstan
\ (kz-1)
region> 1
Option endpoint.
Endpoint for Servercore Object Storage.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
1 / Saint Petersburg
\ (s3.ru-1.storage.selcloud.ru)
2 / Moscow
\ (s3.gis-1.storage.selcloud.ru)
3 / Moscow
\ (s3.ru-7.storage.selcloud.ru)
4 / Tashkent, Uzbekistan
\ (s3.uz-2.srvstorage.uz)
5 / Almaty, Kazakhstan
\ (s3.kz-1.srvstorage.kz)
endpoint> 1
Edit advanced config?
y) Yes
n) No (default)
y/n> n
Configuration complete.
Options:
- type: s3
- provider: Servercore
- access_key_id: ACCESS_KEY
- secret_access_key: SECRET_ACCESS_KEY
- region: ru-1
- endpoint: s3.ru-1.storage.selcloud.ru
Keep this "servercore" remote?
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d> y
and boom, that's the whole Servercore glow-up bestie, look at that final config being all neat and tidy ๐
๐ Spectra Logic ๐
Spectra Logic (https://www.spectralogic.com/blackpearl-nearline-object-gateway) is an on-prem S3-compatible object storage gateway that exposes local object storage and policy-tiers data to Spectra tape and public clouds under a single namespace for backup and archiving. one namespace to rule them all, fr fr ๐
The S3 compatible gateway is configured using rclone config with a type of s3 and with a provider name of SpectraLogic. Here is an example run of the configurator.
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
Enter name for new remote.
name> spectralogic
Option Storage.
Type of storage to configure.
Choose a number from below, or type in your own value.
[snip]
XX / Amazon S3 Compliant Storage Providers including ..., SpectraLogic, ...
\ (s3)
[snip]
Storage> s3
Option provider.
Choose your S3 provider.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
[snip]
XX / SpectraLogic BlackPearl
\ (SpectraLogic)
[snip]
provider> SpectraLogic
Option env_auth.
Get AWS credentials from runtime (environment variables or EC2/ECS meta data if no env vars).
Only applies if access_key_id and secret_access_key is blank.
Choose a number from below, or type in your own boolean value (true or false).
Press Enter for the default (false).
1 / Enter AWS credentials in the next step.
\ (false)
2 / Get AWS credentials from the environment (env vars or IAM).
\ (true)
env_auth> 1
Option access_key_id.
AWS Access Key ID.
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
access_key_id> ACCESS_KEY
Option secret_access_key.
AWS Secret Access Key (password).
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
secret_access_key> SECRET_ACCESS_KEY
Option endpoint.
Endpoint for S3 API.
Required when using an S3 clone.
Enter a value. Press Enter to leave empty.
endpoint> https://bp.example.com
Edit advanced config?
y) Yes
n) No (default)
y/n> n
Configuration complete.
Options:
- type: s3
- provider: SpectraLogic
- access_key_id: ACCESS_KEY
- secret_access_key: SECRET_ACCESS_KEY
- endpoint: https://bp.example.com
Keep this "spectratest" remote?
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d> y
And your config should end up looking like this:
[spectratest]
type = s3
provider = SpectraLogic
access_key_id = ACCESS_KEY
secret_access_key = SECRET_ACCESS_KEY
endpoint = https://bp.example.com
not the name mismatch between the remote you typed and the one you keep, that's just how the example rolls, don't come for me ๐
๐ฆ Storj ๐ฆ
Storj is a decentralized cloud storage which can be used through its native protocol or an S3 compatible gateway. two doors, one vibe โจ
The S3 compatible gateway is configured using rclone config with a type of s3 and with a provider name of Storj. Here is an example run of the configurator.
Type of storage to configure.
Storage> s3
Get AWS credentials from runtime (environment variables or EC2/ECS meta data if no env vars).
Only applies if access_key_id and secret_access_key is blank.
Choose a number from below, or type in your own boolean value (true or false).
Press Enter for the default (false).
1 / Enter AWS credentials in the next step.
\ (false)
2 / Get AWS credentials from the environment (env vars or IAM).
\ (true)
env_auth> 1
Option access_key_id.
AWS Access Key ID.
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
access_key_id> XXXX (as shown when creating the access grant)
Option secret_access_key.
AWS Secret Access Key (password).
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
secret_access_key> XXXX (as shown when creating the access grant)
Option endpoint.
Endpoint of the Shared Gateway.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
1 / EU1 Shared Gateway
\ (gateway.eu1.storjshare.io)
2 / US1 Shared Gateway
\ (gateway.us1.storjshare.io)
3 / Asia-Pacific Shared Gateway
\ (gateway.ap1.storjshare.io)
endpoint> 1 (as shown when creating the access grant)
Edit advanced config?
y) Yes
n) No (default)
y/n> n
Note that s3 credentials are generated when you create an access grant (https://docs.storj.io/dcs/api-reference/s3-compatible-gateway#usage). so like, go make the grant first bestie, the keys literally don't exist until you do ๐
๐ Backend quirks ๐
--chunk-sizeis forced to be 64 MiB or greater. This will use more memory than the default of 5 MiB. (yes, more RAM, that's the tradeoff, iykyk)- Server side copy is disabled as it isn't currently supported in the gateway.
GetTierandSetTierare not supported.
๐ญ Backend bugs ๐ญ
Due to issue #39 (https://github.com/storj/gateway-mt/issues/39) uploading multipart files via the S3 gateway causes them to lose their metadata. For rclone's purpose this means that the modification time is not stored, nor is any MD5SUM (if one is available from the source). the metadata justโฆ evaporates ๐
This has the following consequences:
- Using
rclone rcatwill fail as the metadata doesn't match after upload - Uploading files with
rclone mountwill fail for the same reason- This can worked around by using
--vfs-cache-mode writesor--vfs-cache-mode fullor setting--s3-upload-cutoff large
- This can worked around by using
- Files uploaded via a multipart upload won't have their modtimes
- This will mean that
rclone syncwill likely keep trying to upload files bigger than--s3-upload-cutoff - This can be worked around with
--checksumor--size-onlyor setting--s3-upload-cutoff large - The maximum value for
--s3-upload-cutoffis 5GiB though
- This will mean that
One general purpose workaround is to set --s3-upload-cutoff 5G. This means that rclone will upload files smaller than 5GiB as single parts. Note that this can be set in the config file with upload_cutoff = 5G or configured in the advanced settings. If you regularly transfer files larger than 5G then using --checksum or --size-only in rclone sync is the recommended workaround. screenshot this section honestly ๐ซถ
๐ง Comparison with the native protocol ๐ง
Use the the native protocol to take advantage of client-side encryption as well as to achieve the best possible download performance. Uploads will be erasure-coded locally, thus a 1gb upload will result in 2.68gb of data being uploaded to storage nodes across the network. (rip your bandwidth, but the downloads are chef's kiss ๐)
Use this backend and the S3 compatible Hosted Gateway to increase upload performance and reduce the load on your systems and network. Uploads will be encrypted and erasure-coded server-side, thus a 1GB upload will result in only in 1GB of data being uploaded to storage nodes across the network.
For more detailed comparison please check the documentation of the storj backend. go read it, it's giving thorough โจ
๐ Synology C2 Object Storage ๐
Synology C2 Object Storage (https://c2.synology.com/en-global/object-storage/overview) provides a secure, S3-compatible, and cost-effective cloud storage solution without API request, download fees, and deletion penalty. no fees?? no penalties?? periodt ๐
The way this works is you point rclone config at a type of s3 and a provider name of Synology, and boom, you're in. Here's an actual run of the configurator so you know exactly what's coming bestie ๐
First run:
rclone config
This right here is gonna walk you through the whole interactive setup process, step by step, no jumpscares:
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
Enter name for new remote.1
name> syno
Type of storage to configure.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
XX / Amazon S3 Compliant Storage Providers including AWS, ...
\ "s3"
Storage> s3
Choose your S3 provider.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
24 / Synology C2 Object Storage
\ (Synology)
provider> Synology
Get AWS credentials from runtime (environment variables or EC2/ECS meta data if no env vars).
Only applies if access_key_id and secret_access_key is blank.
Enter a boolean value (true or false). Press Enter for the default ("false").
Choose a number from below, or type in your own value
1 / Enter AWS credentials in the next step
\ "false"
2 / Get AWS credentials from the environment (env vars or IAM)
\ "true"
env_auth> 1
AWS Access Key ID.
Leave blank for anonymous access or runtime credentials.
Enter a string value. Press Enter for the default ("").
access_key_id> accesskeyid
AWS Secret Access Key (password)
Leave blank for anonymous access or runtime credentials.
Enter a string value. Press Enter for the default ("").
secret_access_key> secretaccesskey
Region where your data stored.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
1 / Europe Region 1
\ (eu-001)
2 / Europe Region 2
\ (eu-002)
3 / US Region 1
\ (us-001)
4 / US Region 2
\ (us-002)
5 / Asia (Taiwan)
\ (tw-001)
region > 1
Option endpoint.
Endpoint for Synology C2 Object Storage API.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
1 / EU Endpoint 1
\ (eu-001.s3.synologyc2.net)
2 / US Endpoint 1
\ (us-001.s3.synologyc2.net)
3 / TW Endpoint 1
\ (tw-001.s3.synologyc2.net)
endpoint> 1
Option location_constraint.
Location constraint - must be set to match the Region.
Leave blank if not sure. Used when creating buckets only.
Enter a value. Press Enter to leave empty.
location_constraint>
Edit advanced config? (y/n)
y) Yes
n) No
y/n> y
Option no_check_bucket.
If set, don't attempt to check the bucket exists or create it.
This can be useful when trying to minimise the number of transactions
rclone does if you know the bucket exists already.
It can also be needed if the user you are using does not have bucket
creation permissions. Before v1.52.0 this would have passed silently
due to a bug.
Enter a boolean value (true or false). Press Enter for the default (true).
no_check_bucket> true
Configuration complete.
Options:
- type: s3
- provider: Synology
- region: eu-001
- endpoint: eu-001.s3.synologyc2.net
- no_check_bucket: true
Keep this "syno" remote?
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d> y
๐ธ Tencent COS ๐ธ
Tencent Cloud Object Storage (COS) (https://intl.cloud.tencent.com/product/cos) is a distributed storage service that Tencent Cloud offers up for unstructured data. And like, it's secure, it's stable, it's massive, it's convenient, low-delay and low-cost โ it's giving full package deal โจ
Wanna get rclone talking to Tencent COS? Follow along, bestie:
- Run
rclone configand picknfor a new remote.
rclone config
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
- Give your config a name. For example, name it
cos.
name> cos
- Select
s3storage.
Choose a number from below, or type in your own value
[snip]
XX / Amazon S3 Compliant Storage Providers including AWS, ...
\ "s3"
[snip]
Storage> s3
- Select the
TencentCOSprovider.
Choose a number from below, or type in your own value
1 / Amazon Web Services (AWS) S3
\ "AWS"
[snip]
11 / Tencent Cloud Object Storage (COS)
\ "TencentCOS"
[snip]
provider> TencentCOS
- Drop in your SecretId and SecretKey from Tencent Cloud ๐
Get AWS credentials from runtime (environment variables or EC2/ECS meta data if no env vars).
Only applies if access_key_id and secret_access_key is blank.
Enter a boolean value (true or false). Press Enter for the default ("false").
Choose a number from below, or type in your own value
1 / Enter AWS credentials in the next step
\ "false"
2 / Get AWS credentials from the environment (env vars or IAM)
\ "true"
env_auth> 1
AWS Access Key ID.
Leave blank for anonymous access or runtime credentials.
Enter a string value. Press Enter for the default ("").
access_key_id> AKIDxxxxxxxxxx
AWS Secret Access Key (password)
Leave blank for anonymous access or runtime credentials.
Enter a string value. Press Enter for the default ("").
secret_access_key> xxxxxxxxxxx
- Pick the endpoint for Tencent COS โ this is the standard endpoint for each different region.
1 / Beijing Region.
\ "cos.ap-beijing.myqcloud.com"
2 / Nanjing Region.
\ "cos.ap-nanjing.myqcloud.com"
3 / Shanghai Region.
\ "cos.ap-shanghai.myqcloud.com"
4 / Guangzhou Region.
\ "cos.ap-guangzhou.myqcloud.com"
[snip]
endpoint> 4
- Choose your
aclandstorage_class.
Note that this ACL is applied when server-side copying objects as S3
doesn't copy the ACL from the source but rather writes a fresh one.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
1 / Owner gets Full_CONTROL. No one else has access rights (default).
\ "default"
[snip]
acl> 1
The storage class to use when storing new objects in Tencent COS.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
1 / Default
\ ""
[snip]
storage_class> 1
Edit advanced config? (y/n)
y) Yes
n) No (default)
y/n> n
Remote config
--------------------
[cos]
type = s3
provider = TencentCOS
env_auth = false
access_key_id = xxx
secret_access_key = xxx
endpoint = cos.ap-guangzhou.myqcloud.com
acl = default
--------------------
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d> y
Current remotes:
Name Type
==== ====
cos s3
๐ฆ Tencent COS Global Acceleration Endpoint ๐ฆ
Okay so when you're using the Global Acceleration Endpoint (cos.accelerate.myqcloud.com), rclone is gonna automatically set no_check_bucket = true for you โ because this acceleration endpoint simply doesn't support the CreateBucket call, and that's the call rclone leans on to make sure a bucket exists. No bucket-creating energy here, bestie ๐
Global Acceleration is a per-bucket feature, so the move is: first create the bucket in one physical region, then go enable it in the Tencent Cloud console. Order matters, iykyk ๐
๐ US3 ๐
US3 (https://www.ucloud.cn/site/product/ufile.html) Object Storage is a service that provides cloud storage for unstructured files for internet applications.
To configure access to US3, follow the steps below:
- First run:
rclone config
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
- Give the name of the configuration. For example, name it
US3.
name> US3
- Select
s3storage.
Choose a number from below, or type in your own value
[snip]
XX / Amazon S3 Compliant Storage Providers including AWS, ...
\ "s3"
[snip]
Storage> s3
- Select the US3 provider.
Choose a number from below, or type in your own value.
XX / Amazon Web Services (AWS) S3
\ (AWS)
[snip]
XX / UCloud Object Storage (US3)
\ (US3)
[snip]
provider> US3
- Enter your
SecretIdandSecretKeyof US3.
โฆand the configurator just keeps going bestie, no breaks:
- Get AWS credentials from runtime (environment variables or EC2/ECS meta data if no env vars). Only applies if
access_key_idandsecret_access_keyis blank. Choose a number from below, or type in your own boolean value (trueorfalse). Press Enter for the default (false).1/ Enter AWS credentials in the next step โ"false"2/ Get AWS credentials from the environment (env vars or IAM) โ"true"
env_auth> 1- Option
access_key_id. AWS Access Key ID. Leave blank for anonymous access or runtime credentials. Enter a value. Press Enter to leave empty. access_key_id> AKIDxxxxxxxxxx- AWS Secret Access Key (password). Leave blank for anonymous access or runtime credentials. Enter a string value. Press Enter for the default (
""). secret_access_key> xxxxxxxxxxx
- Select endpoint.
- Option
endpoint. Endpoint for S3 API. Required when using an S3 clone. Choose a number from below, or type in your own value. Press Enter to leave empty.1/ North China (Beijing 2) โ"s3-cn-bj.ufileos.com"2/ North China (Ulanqab) โ"s3-cn-wlcb.ufileos.com"3/ Shanghai โ"s3-cn-sh2.ufileos.com"4/ South China (Guangzhou) โ"s3-cn-gd.ufileos.com"- [snip]
endpoint> 1
- Option
- Choose
acland storage class.- Option
acl. Canned ACL used when creating buckets and storing or copying objects. This ACL is used for creating objects and ifbucket_aclisn't set, for creating buckets too. For more info visit https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#canned-acl โ and heads up, this ACL is applied when server-side copying objects, because S3 doesn't copy the ACL from the source, it writes a fresh one instead. If the acl is an empty string then noX-Amz-Acl:header is added and the default (private) will be used. Choose a number from below, or type in your own value. Press Enter to leave empty.1/ Owner gets FULL_CONTROL. No one else has access rights (default) โ(private)2/ Owner gets FULL_CONTROL. The AllUsers group gets READ access โ(public-read)
acl> 1- The storage class to use when storing new objects in US3. Enter a string value. Press Enter for the default (
""). Choose a number from below, or type in your own value.1/ Default โ""- [snip]
storage_class> 1- Edit advanced config? (y/n)
y) Yesn) No (default)
y/n> n
- Option
Then the payoff, and honestly? iconic:
Configuration complete.
Options:
- type: s3
- provider: US3
- access_key_id: xx
- secret_access_key: xx
- endpoint: s3-cn-bj.ufileos.com
- acl: private
Keep this "US3" remote?
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d> y
Current remotes:
Name Type
==== ====
US3 s3
๐ธ Wasabi ๐ธ
Wasabi (https://wasabi.com) is a cloud-based object storage service for a broad range of applications and use cases. Wasabi is designed for individuals and organizations that require a high-performance, reliable, and secure data storage infrastructure at minimal cost. ๐ธโจ
Wasabi provides an S3 interface which can be configured for use with rclone like this:
No remotes found, make a new one?
n) New remote
s) Set configuration password
n/s> n
name> wasabi
Type of storage to configure.
Choose a number from below, or type in your own value
[snip]
XX / Amazon S3 (also Dreamhost, Ceph, ChinaMobile, ArvanCloud, Minio, Liara)
\ "s3"
[snip]
Storage> s3
Get AWS credentials from runtime (environment variables or EC2/ECS meta data if no env vars). Only applies if access_key_id and secret_access_key is blank.
Choose a number from below, or type in your own value
1 / Enter AWS credentials in the next step
\ "false"
2 / Get AWS credentials from the environment (env vars or IAM)
\ "true"
env_auth> 1
AWS Access Key ID - leave blank for anonymous access or runtime credentials.
access_key_id> YOURACCESSKEY
AWS Secret Access Key (password) - leave blank for anonymous access or runtime credentials.
secret_access_key> YOURSECRETACCESSKEY
Region to connect to.
Choose a number from below, or type in your own value
/ The default endpoint - a good choice if you are unsure.
1 | US Region, Northern Virginia, or Pacific Northwest.
| Leave location constraint empty.
\ "us-east-1"
[snip]
region> us-east-1
Endpoint for S3 API.
Leave blank if using AWS to use the default endpoint for the region.
Specify if using an S3 clone such as Ceph.
endpoint> s3.wasabisys.com
Location constraint - must be set to match the Region. Used when creating buckets only.
Choose a number from below, or type in your own value
1 / Empty for US Region, Northern Virginia, or Pacific Northwest.
\ ""
[snip]
location_constraint>
Canned ACL used when creating buckets and/or storing objects in S3.
For more info visit https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#canned-acl
Choose a number from below, or type in your own value
1 / Owner gets FULL_CONTROL. No one else has access rights (default).
\ "private"
[snip]
acl>
The server-side encryption algorithm used when storing this object in S3.
Choose a number from below, or type in your own value
1 / None
\ ""
2 / AES256
\ "AES256"
server_side_encryption>
The storage class to use when storing objects in S3.
Choose a number from below, or type in your own value
1 / Default
\ ""
2 / Standard storage class
\ "STANDARD"
3 / Reduced redundancy storage class
\ "REDUCED_REDUNDANCY"
4 / Standard Infrequent Access storage class
\ "STANDARD_IA"
storage_class>
Remote config
--------------------
[wasabi]
env_auth = false
access_key_id = YOURACCESSKEY
secret_access_key = YOURSECRETACCESSKEY
region = us-east-1
endpoint = s3.wasabisys.com
location_constraint =
acl =
server_side_encryption =
storage_class =
--------------------
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d> y
This will leave the config file looking like this. ๐
[wasabi]
type = s3
provider = Wasabi
env_auth = false
access_key_id = YOURACCESSKEY
secret_access_key = YOURSECRETACCESSKEY
region =
endpoint = s3.wasabisys.com
location_constraint =
acl =
server_side_encryption =
storage_class =
๐ Zadara Object Storage ๐
Zadara Object Storage (https://www.zadara.com) is a fully-managed, enterprise-grade, S3-compatible storage solution that provides scalable, multi-tenant object storage with flexible deployment options (on-prem, hybrid, or cloud). โจ
Zadara Object Storage can be configured using rclone config with s3 as the type and Zadara as the provider name. Here is an example run of the configurator.
Authentication and endpoint information, including the region field, should be fetched from Zadara's Object Storage management interface
To configure access to Zadara Object Storage, first run:
rclone config
This will guide you through an interactive setup process:
No remotes found, make a new one?
n) New remote
s) Set configuration password
n/s> n
Enter name for new remote.
name> Zadara-Object-Storage
Option Storage.
Type of storage to configure.
Choose a number from below, or type in your own value.
XX / Amazon S3 Compliant Storage Providers including AWS ...
\ (s3)
Storage> s3
Option provider.
Choose your S3 provider.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
XX / Zadara Object Storage
\ (Zadara)
provider> Zadara
Option env_auth.
Get AWS credentials from runtime (environment variables or EC2/ECS meta data if no env vars).
Only applies if access_key_id and secret_access_key is blank.
Choose a number from below, or type in your own boolean value (true or false).
Press Enter for the default (false).
1 / Enter AWS credentials in the next step.
\ (false)
2 / Get AWS credentials from the environment (env vars or IAM).
\ (true)
env_auth>
Option access_key_id.
AWS Access Key ID.
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
access_key_id> S3_ACCESS_KEY
Option secret_access_key.
AWS Secret Access Key (password).
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
secret_access_key> S3_SECRET_KEY
Option region.
Region to connect to.
Leave blank if you are using an S3 clone and you don't have a region.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
/ The default region.
1 | Leave location constraint empty.
\ (us-east-1)
region>
Option endpoint. Endpoint for S3 API. Required when using an S3 clone. Enter a value. Press Enter to leave empty. endpoint> https://vsa-00000001-public-zadara-cloud-01.zadarazios.com
Edit advanced config? y) Yes n) No (default) y/n>
Configuration complete. Options:
- type: s3
- provider: Zadara
- access_key_id: S3_ACCESS_KEY
- secret_access_key: S3_SECRET_KEY
- endpoint: https://vsa-00000001-public-zadara-cloud-01.zadarazios.com Keep this "Zadara-Object-Storage" remote? y) Yes this is OK (default) e) Edit this remote d) Delete this remote y/e/d> y
and boom ๐ฅ your config file ends up looking exactly like this:
[Zadara-Object-Storage] type = s3 provider = Zadara access_key_id = S3_ACCESS_KEY secret_access_key = S3_SECRET_KEY endpoint = https://vsa-00000001-public-zadara-cloud-01.zadarazios.com
---
## ๐ Zata Object Storage
<lavender>Zata Object Storage</lavender> (https://zata.ai/) is giving secure, S3-compatible cloud storage that's built for scaling and performance, and it's for literally every kind of data-storage need you could have. โจ
First, run:
rclone config
and it will walk you through an interactive setup like this, bestie:
e) Edit existing remote n) New remote d) Delete remote r) Rename remote c) Copy remote s) Set configuration password q) Quit config e/n/d/r/c/s/q> n
Enter name for new remote. name> my zata storage
Option Storage. Type of storage to configure. Choose a number from below, or type in your own value.
XX / Amazon S3 Compliant Storage Providers including AWS, ... \ (s3)
Storage> s3
Option provider. Choose your S3 provider. Choose a number from below, or type in your own value. Press Enter to leave empty.
XX / Zata (S3 compatible Gateway) \ (Zata)
provider> Zata
Option env_auth. Get AWS credentials from runtime (environment variables or EC2/ECS meta data if no env vars). Only applies if access_key_id and secret_access_key is blank. Choose a number from below, or type in your own boolean value (true or false). Press Enter for the default (false). 1 / Enter AWS credentials in the next step. \ (false) 2 / Get AWS credentials from the environment (env vars or IAM). \ (true) env_auth>
Option access_key_id. AWS Access Key ID. Leave blank for anonymous access or runtime credentials. Enter a value. Press Enter to leave empty. access_key_id> "your key"
Option secret_access_key. AWS Secret Access Key (password). Leave blank for anonymous access or runtime credentials. Enter a value. Press Enter to leave empty. secret_access_key> "your secret key"
Option region. Region where you can connect with. Choose a number from below, or type in your own value. Press Enter to leave empty. 1 / Indore, Madhya Pradesh, India \ (us-east-1) region> 1
Option endpoint. Endpoint for Zata Object Storage. Choose a number from below, or type in your own value. Press Enter to leave empty. 1 / South Asia Endpoint \ (idr01.zata.ai) endpoint> 1
Option location_constraint. Location constraint - must be set to match the Region. Leave blank if not sure. Used when creating buckets only. Enter a value. Press Enter to leave empty. location_constraint>
Option acl. Canned ACL used when creating buckets and storing or copying objects. This ACL is used for creating objects and if bucket_acl isn't set, for creating buckets too. For more info visit https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#canned-acl Note that this ACL is applied when server-side copying objects as S3 doesn't copy the ACL from the source but rather writes a fresh one. If the acl is an empty string then no X-Amz-Acl: header is added and the default (private) will be used. Choose a number from below, or type in your own value. Press Enter to leave empty. / Owner gets FULL_CONTROL. 1 | No one else has access rights (default). \ (private) / Owner gets FULL_CONTROL. 2 | The AllUsers group gets READ access. \ (public-read) / Owner gets FULL_CONTROL. 3 | The AllUsers group gets READ and WRITE access.
| Granting this on a bucket is generally not recommended. |
\ (public-read-write) / Owner gets FULL_CONTROL. 4 | The AuthenticatedUsers group gets READ access. \ (authenticated-read) / Object owner gets FULL_CONTROL. 5 | Bucket owner gets READ access.
| If you specify this canned ACL when creating a bucket, Amazon S3 ignores it. |
\ (bucket-owner-read) / Both the object owner and the bucket owner get FULL_CONTROL over the object. 6 | If you specify this canned ACL when creating a bucket, Amazon S3 ignores it. \ (bucket-owner-full-control) acl>
Edit advanced config? y) Yes n) No (default) y/n>
Configuration complete. Options:
- type: s3
- provider: Zata
- access_key_id: xxx
- secret_access_key: xxx
- region: us-east-1
- endpoint: idr01.zata.ai Keep this "my zata storage" remote? y) Yes this is OK (default) e) Edit this remote d) Delete this remote y/e/d>
and then your config file is sitting there looking like this ๐
:
[my zata storage] type = s3 provider = Zata access_key_id = xxx secret_access_key = xxx region = us-east-1 endpoint = idr01.zata.ai
---
## ๐ง Zero Services (ZERO-Z3)
<cyan>Zero Services GmbH</cyan> (https://lp.zeroservices.eu/zero-z3/) serves up <lavender>ZERO-Z3</lavender>, S3-compatible object storage hosted in the EU on its very own network (AS215197). It's built on Ceph RADOS Gateway, no cap. ๐ซถ
First, run:
rclone config
and this is the interactive setup process, step by step:
n) New remote n/s/q> n
Enter name for new remote. name> zero-z3
Option Storage. Type of storage to configure. Choose a number from below, or type in your own value. [snip] XX / Amazon S3 Compliant Storage Providers including AWS, ..., ZeroServices, ... and others \ (s3) Storage> s3
Option provider. Choose your S3 provider. [snip] XX / Zero Services GmbH (ZERO-Z3) \ (ZeroServices) provider> ZeroServices
Option env_auth. Get AWS credentials from runtime (environment variables or EC2/ECS meta data if no env vars). 1 / Enter AWS credentials in the next step. \ (false) 2 / Get AWS credentials from the environment (env vars or IAM). \ (true) env_auth> 1
Option access_key_id. AWS Access Key ID. access_key_id> ACCESS_KEY
Option secret_access_key. AWS Secret Access Key (password). secret_access_key> SECRET_KEY
Option region. Region to connect to. 1 / Frankfurt 1 \ (zero-fra1) 2 / Frankfurt 2 \ (zero-fra2) 3 / Eyl 1 \ (zero-eyl1) region> 2
Option endpoint. Endpoint for ZERO-Z3. 1 / Frankfurt 1 \ (fra1.s3.zeroservices.eu) 2 / Frankfurt 2 \ (fra.s3.zeroservices.eu) 3 / Eyl 1 \ (eyl1.s3.zeroservices.eu) endpoint> 2
Option acl. Canned ACL used when creating buckets and storing or copying objects. [snip] acl> 1
Edit advanced config? y/n> n
Configuration complete. Options:
- type: s3
- provider: ZeroServices
- access_key_id: ACCESS_KEY
- secret_access_key: SECRET_KEY
- region: zero-fra2
- endpoint: fra.s3.zeroservices.eu Keep this "zero-z3" remote? y/e/d> y
---
## ๐ง Memory usage
okay so the number-one reason rclone eats a ton of memory is <hotpink>one single directory with millions of files in it</hotpink>. Even though s3 doesn't really have the concept of directories, rclone still does its sync directory by directory, because it wants to stay compatible with normal filing systems. ๐ธ
Rclone loads each directory into memory as rclone objects. Each rclone object takes `0.5k-1k` of memory, so that's approximately `1GB` per `1,000,000` files, and the sync for that directory does **not** start until the whole thing is loaded into memory. So yeah, for huge directories the sync can take a *long* time to even get going. ๐ญ
To sync a directory with `100,000,000` files in it you'd need approximately `100 GB` of memory. At some point the amount of memory becomes difficult to actually provide, so there's a workaround for this (https://github.com/rclone/rclone/wiki/Big-syncs-with-millions-of-files) which involves a bit of scripting. ๐
And at some point rclone will gain a sync mode which is effectively this workaround but built in to rclone. ๐
---
## ๐ง Limitations
`rclone about` is not supported by the S3 backend. Backends without this capability can't determine free space for an rclone mount, and they can't use policy `mfs` (most free space) as a member of an rclone union remote. ๐
See List of backends that do not support `rclone about` (https://rclone.org/overview/#optional-features) and `rclone about` (https://rclone.org/commands/rclone_about/).
---
## ๐๏ธ Archive
The <lavender>Archive</lavender> backend gives you **read only** access to the content of archive files on cloud storage, without downloading the complete archive. Which means you could mount a large archive file and use only the parts of it your application actually needs, instead of having to extract the whole thing first. iconic. โจ
The archive files are recognised by their extension.
- <cyan>Zip</cyan> โ `.zip`
- <cyan>Squashfs</cyan> โ `.sqfs`
The supported archive file types are cloud friendly โ a single file can be found and downloaded without downloading the whole archive. <rainbow>iconic behaviour honestly</rainbow> ๐
If you just want to create, list or extract archives and don't want to mount them, then bestie, you might find the `rclone archive` commands way more convenient:
- **`rclone archive create`** โ https://rclone.org/commands/rclone_archive_create/
- **`rclone archive list`** โ https://rclone.org/commands/rclone_archive_list/
- **`rclone archive extract`** โ https://rclone.org/commands/rclone_archive_extract/
These commands support a wider range of non cloud friendly archives (but <red>not squashfs</red>, sorry girlies) and they **can't** be used for `rclone mount` or any other rclone commands (like `rclone check`). Different tool for a different job ๐
## โจ Configuration โจ
This backend is best used without configuration. Zero setup, we love a low-effort queen ๐ซถ
Use it by putting the string `:archive:` in front of another remote, say `remote:dir` to make `:archive:remote:dir`.
Any archives in `remote:dir` will become directories, and any files may be read out of them individually.
For example:
$ rclone lsf s3:rclone/dir 100files.sqfs 100files.zip
Note that `100files.zip` and `100files.sqfs` are now directories:
$ rclone lsf :archive:s3:rclone/dir 100files.sqfs/ 100files.zip/
Which we can look inside:
$ rclone lsf :archive:s3:rclone/dir/100files.zip/ cofofiy5jun gigi hevupaz5z kacak/ kozemof/ lamapaq4 qejahen quhenen2rey soboves8 vibat/ wose xade zilupot
Files **not** in an archive can be read and written as normal. Files **in** an archive can only be read. <yellow>read-only vibes, no writing, no cap</yellow> ๐
The archive backend can also be used in a configuration file. Use the `remote` variable to point to the destination of the archive.
[remote] type = archive remote = s3:rclone/dir/100files.zip
Gives:
$ rclone lsf remote: cofofiy5jun gigi hevupaz5z kacak/ ...
## ๐ธ Modification times ๐ธ
Modification times are preserved with an accuracy depending on the archive type.
$ rclone lsl --max-depth 1 :archive:s3:rclone/dir/100files.zip 12 2025-10-27 14:39:20.000000000 cofofiy5jun 81 2025-10-27 14:39:20.000000000 gigi 58 2025-10-27 14:39:20.000000000 hevupaz5z 6 2025-10-27 14:39:20.000000000 lamapaq4 43 2025-10-27 14:39:20.000000000 qejahen 66 2025-10-27 14:39:20.000000000 quhenen2rey 95 2025-10-27 14:39:20.000000000 soboves8 71 2025-10-27 14:39:20.000000000 wose 76 2025-10-27 14:39:20.000000000 xade 15 2025-10-27 14:39:20.000000000 zilupot
For zip and squashfs files this is `1s`. <lavender>one second of precision, she's doing her best ๐</lavender>
---
## ๐ Hashes ๐
Which hash is supported depends on the archive type. Zip files use `CRC32`, Squashfs don't support any hashes. For example:
$ rclone hashsum crc32 :archive:s3:rclone/dir/100files.zip/ b2288554 cofofiy5jun a87e62b6 wose f90f630b xade c7d0ef29 gigi f1c64740 soboves8 cb7b4a5d quhenen2rey 5115242b kozemof/fonaxo afeabd9a qejahen 71202402 kozemof/fijubey5di bd99e512 kozemof/napux ...
Hashes will be checked when the file is read from the archive and used as part of syncing if possible. <mint>integrity check queen โ
</mint>
$ rclone copy -vv :archive:s3:rclone/dir/100files.zip /tmp/100files ... 2025/10/27 14:56:44 DEBUG : kacak/turovat5c/yuyuquk: crc32 = abd05cc8 OK 2025/10/27 14:56:44 DEBUG : kacak/turovat5c/yuyuquk.aeb661dc.partial: renamed to: kacak/turovat5c/yuyuquk 2025/10/27 14:56:44 INFO : kacak/turovat5c/yuyuquk: Copied (new) ...
## ๐ฆ Zip ๐ฆ
The Zip file format (https://en.wikipedia.org/wiki/ZIP_(file_format)) is a widely used archive format that bundles one or more files and folders into a single file, primarily for easier storage or transmission. It typically uses compression (most commonly the `DEFLATE` algorithm) to reduce the overall size of the archived content. Zip files are supported natively by most modern operating systems.
Rclone does **not** support the following advanced features of Zip files:
- Splitting large archives into smaller parts
- Password protection
- Zstd compression
<pink>so no split zips, no passwords, no zstd โ noted bestie, don't come for her ๐</pink>
## ๐ Squashfs ๐
Squashfs is a compressed, read-only file system format primarily used in Linux-based systems. It's designed to compress entire file systems (including files, directories, and metadata) into a single archive file, which can then be mounted and read directly, appearing as a normal directory structure. Because it's read-only and highly compressed, Squashfs is ideal for live CDs/USBs, embedded devices with limited storage, and software package distribution, as it saves space and ensures the integrity of the original files.
Rclone supports the following squashfs compression formats:
- Gzip
- Lzma
- Xz
- Zstd
These are <red>not yet working</red>:
- Lzo โ Not yet supported
- Lz4 โ Broken with `"error decompressing: lz4: bad magic number"`
Rclone works fastest with large squashfs block sizes. For example:
mksquashfs 100files 100files.sqfs -comp zstd -b 1M
<yellow>big blocks = big speed, iykyk โก</yellow>
## ๐ Limitations ๐
Files in the archive backend are **read only**. It isn't possible to create archives with the archive backend yet. However you can create archives with `rclone archive create` (https://rclone.org/commands/rclone_archive_create/).
Only `.zip` and `.sqfs` archives are supported as these are the only common archiving formats which make it easy to read directory listings from the archive without downloading the whole archive.
Internally the archive backend uses the VFS to access files. It isn't possible to configure the internal VFS yet which might be useful. <peach>future feature energy, manifesting ๐</peach>
## ๐ Archive Formats ๐
Here's a table rating common archive formats on their Cloud Optimization, which is based on their ability to access a single file without reading the entire archive.
This capability depends on whether the format has a central index (or "table of contents") that a program can read first to find the exact location of a specific file.
### โจ Ideas for improvements โจ
Okay so bestie, here's the tea on what could get upgraded someday ๐
- Adding <cyan>ISO</cyan> support would be pretty easy actually, because the library we use, `go-diskfs` (`https://github.com/diskfs/go-diskfs/`), already supports it. ๐
- We could also add `ext4` and `fat32` the same way โ but ngl, in my experience those just aren't very common as files, so it's probably not worth the effort. ๐
- `go-diskfs` can also read partitions, which we could potentially take advantage of. ๐
It would also be possible to add <purple>write support</purple> โ but heads up, that would **only** be for creating brand-new archives, **not** for updating existing ones. Periodt.
---
### โจ Standard options โจ
Here are the Standard options specific to archive (Read archives). ๐
- **`--archive-remote`** โ Remote to wrap to read archives from. ๐
Normally it should contain a `':'` and a path, like `"myremote:path/to/dir"`, `"myremote:bucket"` or `"myremote:"`.
If this is left empty, then the archive backend will use the root as the remote. ๐ธ
This means you can use `:archive:remote:path` and it will be equivalent to setting `remote="remote:path"`. โจ
Properties:
- Config: `remote`
- Env Var: `RCLONE_ARCHIVE_REMOTE`
- Type: `string`
- Required: `false`
---
### โจ Advanced options โจ
Here are the Advanced options specific to archive (Read archives). ๐ฆ
- **`--archive-description`** โ Description of the remote. ๐
Properties:
- Config: `description`
- Env Var: `RCLONE_ARCHIVE_DESCRIPTION`
- Type: `string`
- Required: `false`
---
### โจ Metadata โจ
Any metadata supported by the underlying remote is read and written. ๐ซถ
See the metadata (`https://rclone.org/docs/#metadata`) docs for more info. ๐
---
# ๐ Backblaze B2 ๐
B2 is Backblaze's cloud storage system (`https://www.backblaze.com/cloud-storage`). โ๏ธ๐
Paths are specified as `remote:bucket` (or `remote:` for the `lsd` command.) You may put subdirectories in too, e.g. `remote:bucket/path/to/dir`. ๐๏ธโจ
## ๐ Configuration ๐
Here is an example of making a b2 configuration. First run
okay so to actually set this up you literally just run:
rclone config
and it walks you through everything, super cozy interactive style. ๐
To authenticate you'll need EITHER your Account ID (a short hex number) **and** your Master Application Key (a long hex number) **OR** an Application Key โ and bestie, the Application Key is the recommended method, fr fr. Scroll down for the full tea on generating and using one.
No remotes found, make a new one? n) New remote q) Quit config n/q> n name> remote Type of storage to configure. Choose a number from below, or type in your own value [snip] XX / Backblaze B2 \ "b2" [snip] Storage> b2 Account ID or Application Key ID account> 123456789abc Application Key key> 0123456789abcdef0123456789abcdef0123456789 Endpoint for the service - leave blank normally. endpoint> Remote config Configuration complete. Options:
- type: b2
- account: 123456789abc
- key: 0123456789abcdef0123456789abcdef0123456789
- endpoint: Keep this "remote" remote? y) Yes this is OK e) Edit this remote d) Delete this remote y/e/d> y
This remote is called `remote` and now you can use it like this ๐
See all buckets:
rclone lsd remote:
Create a new bucket:
rclone mkdir remote:bucket
List the contents of a bucket:
rclone ls remote:bucket
Sync `/home/local/directory` to the remote bucket, deleting any excess files in the bucket:
rclone sync --interactive /home/local/directory remote:bucket
---
## โจ Application Keys โจ
B2 supports multiple Application Keys for different access permission to B2 Buckets (https://www.backblaze.com/docs/cloud-storage-application-keys).
You can use these with rclone too ๐ซถ โ you'll need rclone version 1.43 or later.
Follow Backblaze's docs to create an Application Key with the required permission and add the `applicationKeyId` as the `account` and the Application Key itself as the `key`.
> Note that you **must** put the `applicationKeyId` as the `account` โ you can't use the master Account ID. If you try, B2 will hit you with `401` errors. ๐ญ
## `--fast-list`
This remote supports `--fast-list`, which lets you use fewer transactions in exchange for more memory. See the rclone docs (https://rclone.org/docs/#fast-list) for more details.
## ๐ฐ๏ธ Modification times ๐ฐ๏ธ
The modification time is stored as metadata on the object as `X-Bz-Info-src_last_modified_millis` as milliseconds since 1970-01-01 in the Backblaze standard. Other tools should be able to use this as a modified time.
Modified times are used in syncing and are fully supported. Note that if a modification time needs to be updated on an object then it will create a new version of the object.
## ๐ซ Restricted filename characters ๐ซ
On top of the default restricted characters set (https://rclone.org/overview/#restricted-characters), these characters get replaced too:
- **Character** `\` โ **Value** `0x5C` โ **Replacement** `๏ผผ`
Invalid UTF-8 bytes will also be replaced (https://rclone.org/overview/#invalid-utf8), as they can't be used in JSON strings.
Note that in 2020-05 Backblaze started allowing `\` characters in file names. Rclone hasn't changed its encoding as this could cause syncs to re-transfer files. If you want rclone not to replace `\` then see the `--b2-encoding` flag below and remove the `BackSlash` from the string. This can be set in the config.
## ๐ SHA1 checksums ๐
The SHA1 checksums of the files are checked on upload and download and will be used in the syncing process.
Large files (bigger than the limit in `--b2-upload-cutoff`) which are uploaded in chunks will store their SHA1 on the object as `X-Bz-Info-large_file_sha1` as recommended by Backblaze.
For a large file to be uploaded with an SHA1 checksum, the source needs to support SHA1 checksums. The local disk supports SHA1 checksums so large file transfers from local disk will have an SHA1. See the overview (https://rclone.org/overview/#features) for exactly which remotes support SHA1.
Sources which don't support SHA1, in particular `crypt`, will upload large files without SHA1 checksums. This may be fixed in the future (see `#1767` (https://github.com/rclone/rclone/issues/1767)).
File sizes below `--b2-upload-cutoff` will **always** have an SHA1 regardless of the source. ๐
## ๐ Transfers ๐
Backblaze recommends that you do lots of transfers simultaneously for maximum speed. In tests from my SSD equipped laptop the optimum setting is about `--transfers 32` though higher numbers may be used for a slight speed improvement. The optimum number for you may vary depending on your hardware, how big the files are, how much you want to load your computer, etc. The default of `--transfers 4` is definitely too low for Backblaze B2 though.
Note that uploading big files (bigger than `200 MiB` by default) will use a `96 MiB` RAM buffer by default. There can be at most `--transfers` of these in use at any moment, so this sets the upper limit on the memory used. ๐
## ๐ Versions ๐
The default setting of B2 is to keep old versions of files. This means when rclone uploads a new version of a file it creates a new version of it (https://www.backblaze.com/docs/cloud-storage-file-versions). Likewise when you delete a file, the old version will be marked hidden and still be available.
Whether B2 keeps old versions of files or not can be adjusted on a per-bucket basis using the "Lifecycle settings" on the B2 control panel, or when creating the bucket using the `--b2-lifecycle` flag, or after creation using the `rclone backend lifecycle` command.
You may opt in to a "hard delete" of files with the `--b2-hard-delete` flag which permanently removes files on deletion instead of hiding them. ๐
Old versions of files, where available, are visible using the `--b2-versions` flag. These can be deleted as required with `delete`.
It is also possible to view a bucket as it was at a certain point in time, using the `--b2-version-at` flag. This will show the file versions as they were at that time, showing files that have been deleted afterwards, and hiding files that were created since.
If you wish to remove all the old versions, and unfinished large file uploads, then you can use the `rclone cleanup remote:bucket` command which will delete all the old versions of files, leaving the current ones intact. You can also supply a path and only old versions under that path will be deleted, e.g. `rclone cleanup remote:bucket/path/to/stuff`.
Note that `cleanup` will remove partially uploaded files from the bucket if they are more than a day old. If you want more control over the expiry date then run `rclone backend cleanup b2:bucket -o max-age=1h` to remove all unfinished large file uploads older than one hour, leaving old versions intact.
If you wish to remove all the old versions, leaving current files and unfinished large files intact, then you can use the `rclone backend cleanup-hidden remote:bucket` command. You can also supply a path and only old versions under that path will be deleted, e.g. `rclone backend cleanup-hidden remote:bucket/path/to/stuff`.
When you `purge` a bucket, the current and the old versions will be deleted then the bucket will be deleted.
However `delete` will cause the current versions of the files to become hidden old versions.
Here is a session showing the listing and retrieval of an old version followed by a cleanup of the old versions. ๐ธ
Show current version and all the versions with `--b2-versions` flag:
$ rclone -q ls b2:cleanup-test 9 one.txt
$ rclone -q --b2-versions ls b2:cleanup-test 9 one.txt 8 one-v2016-07-04-141032-000.txt 16 one-v2016-07-04-141003-000.txt 15 one-v2016-07-02-155621-000.txt
Retrieve an old version:
$ rclone -q --b2-versions copy b2:cleanup-test/one-v2016-07-04-141003-000.txt /tmp
$ ls -l /tmp/one-v2016-07-04-141003-000.txt -rw-rw-r-- 1 ncw ncw 16 Jul 2 17:46 /tmp/one-v2016-07-04-141003-000.txt
Clean up all the old versions and show that they've gone:
$ rclone -q cleanup b2:cleanup-test
$ rclone -q ls b2:cleanup-test 9 one.txt
$ rclone -q --b2-versions ls b2:cleanup-test 9 one.txt
## โ ๏ธ Versions naming caveat โ ๏ธ
When using the `--b2-versions` flag, rclone is relying on the file name to work out whether the objects are versions or not. Versions' names are created by inserting timestamp between file name and its extension.
9 file.txt 8 file-v2023-07-17-161032-000.txt 16 file-v2023-06-15-141003-000.txt
If there are real files present with the same names as versions, then behaviour of `--b2-versions` can be unpredictable. ๐
## ๐ Data usage ๐
It is useful to know how many requests are sent to the server in different scenarios.
All copy commands send the following 4 requests:
/b2api/v4/b2_authorize_account /b2api/v1/b2_create_bucket /b2api/v1/b2_list_buckets /b2api/v1/b2_list_file_names
The `b2_list_file_names` request will be sent once for every `1k` files in the remote path, providing the checksum and modification time of the listed files. As of version 1.33, issue `#818` (https://github.com/rclone/rclone/issues/818) causes extra requests to be sent when using B2 with Crypt. When a copy operation does not require any files to be uploaded, no more requests will be sent.
Uploading files that do not require chunking will send 2 requests per file upload:
/b2api/v1/b2_get_upload_url /b2api/v1/b2_upload_file/
Uploading files requiring chunking will send 2 requests (one each to start and finish the upload) and another 2 requests for each chunk:
/b2api/v1/b2_start_large_file /b2api/v1/b2_get_upload_part_url /b2api/v1/b2_upload_part/ /b2api/v1/b2_finish_large_file
## ๐ Viewing versions with `--b2-versions` ๐
Versions can be viewed with the `--b2-versions` flag. When it is set rclone will show and act on older versions of files. For example:
Listing without `--b2-versions`:
$ rclone -q ls b2:cleanup-test 9 one.txt
And with:
$ rclone -q --b2-versions ls b2:cleanup-test 9 one.txt 8 one-v2016-07-04-141032-000.txt 16 one-v2016-07-04-141003-000.txt 15 one-v2016-07-02-155621-000.txt
<pink>Showing that the current version is unchanged</pink> โ but bestie, older versions? Absolutely visible. ๐ Each of those older ones has the <cyan>UTC date</cyan> that it got uploaded to the server slapped onto it, accurate to the <purple>nearest millisecond</purple>. So like, timestamped to the *millisecond*. Obsessed.
> โ ๏ธ Heads up though: when you're using `--b2-versions`, **no file write operations are permitted**. Like, at all. So you literally cannot upload files or delete them. It's giving read-only era. No cap.
---
## ๐ B2 and `rclone link` ๐
Rclone can generate file share links for <mint>private B2 buckets</mint>. Slay. So you can get one for a single file, like:
./rclone link B2:bucket/path/to/file.txt https://f002.backblazeb2.com/file/bucket/path/to/file.txt?Authorization=xxxxxxxx
or if you run it on a directory, you get this instead:
./rclone link B2:bucket/path https://f002.backblazeb2.com/file/bucket/path?Authorization=xxxxxxxx
And then โ the way this works, iykyk โ you can take that authorization token (the part of the url from the `?Authorization=` onwards) and use it on <hotpink>any file path under that directory</hotpink>. Bestie, ANY path. For example:
https://f002.backblazeb2.com/file/bucket/path/to/file1?Authorization=xxxxxxxx https://f002.backblazeb2.com/file/bucket/path/file2?Authorization=xxxxxxxx https://f002.backblazeb2.com/file/bucket/path/folder/file3?Authorization=xxxxxxxx
---
## โจ Standard options โจ
Here are the <cyan>Standard</cyan> options specific to `b2` (Backblaze B2). ๐ซถ
- **`--b2-account`** โ Account ID or Application Key ID.
- Config: `account`
- Env Var: `RCLONE_B2_ACCOUNT`
- Type: `string`
- Required: `true`
- **`--b2-key`** โ Application Key.
- Config: `key`
- Env Var: `RCLONE_B2_KEY`
- Type: `string`
- Required: `true`
- **`--b2-hard-delete`** โ Permanently delete files on remote removal, otherwise hide files.
- Config: `hard_delete`
- Env Var: `RCLONE_B2_HARD_DELETE`
- Type: `bool`
- Default: `false`
---
## ๐
Advanced options ๐
And here are the <purple>Advanced</purple> options specific to `b2` (Backblaze B2). Yes, there are *so many*. We're doing all of them. ๐ธ
- **`--b2-endpoint`** โ Endpoint for the service.
Leave blank normally.
- Config: `endpoint`
- Env Var: `RCLONE_B2_ENDPOINT`
- Type: `string`
- Required: `false`
- **`--b2-test-mode`** โ A flag string for `X-Bz-Test-Mode` header for debugging.
This is <red>for debugging purposes only</red>. Setting it to one of the strings below will cause b2 to return specific errors:
- `"fail_some_uploads"`
- `"expire_some_account_authorization_tokens"`
- `"force_cap_exceeded"`
These will be set in the `"X-Bz-Test-Mode"` header which is documented in the b2 integrations checklist (https://www.backblaze.com/docs/cloud-storage-integration-checklist).
- Config: `test_mode`
- Env Var: `RCLONE_B2_TEST_MODE`
- Type: `string`
- Required: `false`
- **`--b2-versions`** โ Include old versions in directory listings.
> ๐จ Note that when using this **no file write operations are permitted**, so you can't upload files or delete them. Periodt.
- Config: `versions`
- Env Var: `RCLONE_B2_VERSIONS`
- Type: `bool`
- Default: `false`
- **`--b2-version-at`** โ Show file versions as they were at the specified time.
> ๐จ Same energy: when using this, **no file write operations are permitted**, so you can't upload files or delete them.
- Config: `version_at`
- Env Var: `RCLONE_B2_VERSION_AT`
- Type: `Time`
- Default: `off`
- **`--b2-upload-cutoff`** โ Cutoff for switching to chunked upload.
Files above this size will be uploaded in chunks of `--b2-chunk-size`.
This value should be set no larger than `4.657 GiB` (== `5 GB`).
- Config: `upload_cutoff`
- Env Var: `RCLONE_B2_UPLOAD_CUTOFF`
- Type: `SizeSuffix`
- Default: `200Mi`
- **`--b2-copy-cutoff`** โ Cutoff for switching to multipart copy.
Any files larger than this that need to be server-side copied will be copied in chunks of this size.
The minimum is `0` and the maximum is `4.6 GiB`.
- Config: `copy_cutoff`
- Env Var: `RCLONE_B2_COPY_CUTOFF`
- Type: `SizeSuffix`
- Default: `4Gi`
- **`--b2-chunk-size`** โ Upload chunk size.
When uploading large files, chunk the file into this size.
**Must fit in memory.** These chunks are buffered in memory and there might a maximum of `--transfers` chunks in progress at once.
`5,000,000 Bytes` is the minimum size.
- Config: `chunk_size`
- Env Var: `RCLONE_B2_CHUNK_SIZE`
- Type: `SizeSuffix`
- Default: `96Mi`
- **`--b2-upload-concurrency`** โ Concurrency for multipart uploads.
This is the number of chunks of the same file that are uploaded concurrently.
> ๐ญ Note that chunks are stored in memory and there may be up to `--transfers` * `--b2-upload-concurrency` chunks stored at once in memory. Memory girlies, beware.
- Config: `upload_concurrency`
- Env Var: `RCLONE_B2_UPLOAD_CONCURRENCY`
- Type: `int`
- Default: `4`
- **`--b2-disable-checksum`** โ Disable checksums for large (> upload cutoff) files.
Normally rclone will calculate the `SHA1` checksum of the input before uploading it so it can add it to metadata on the object. This is great for data integrity checking but can cause long delays for large files to start uploading.
- Config: `disable_checksum`
- Env Var: `RCLONE_B2_DISABLE_CHECKSUM`
- Type: `bool`
- Default: `false`
- **`--b2-download-url`** โ Custom endpoint for downloads.
This is usually set to a Cloudflare CDN URL as Backblaze offers free egress for data downloaded through the Cloudflare network. Rclone works with private buckets by sending an `Authorization` header. If the custom endpoint rewrites the requests for authentication, e.g., in Cloudflare Workers, this header needs to be handled properly. Leave blank if you want to use the endpoint provided by Backblaze.
Rclone will <red>not</red> follow a redirect from this endpoint which downgrades `HTTPS` to `HTTP`, and will <red>not</red> send the `Authorization` header or the SSE-C key headers once a redirect has left the host and port of this endpoint.
The URL provided here <yellow>SHOULD</yellow> have the protocol and <yellow>SHOULD NOT</yellow> have a trailing slash or specify the `/file/bucket` subpath as rclone will request files with `"{download_url}/file/{bucket_name}/{path}"`.
Example: `> https://mysubdomain.mydomain.tld` (No trailing `"/"`, `"file"` or `"bucket"`)
- Config: `download_url`
- Env Var: `RCLONE_B2_DOWNLOAD_URL`
- Type: `string`
- Required: `false`
- **`--b2-download-auth-duration`** โ Time before the public link authorization token will expire in `s` or suffix `ms|s|m|h|d`.
This is used in combination with `rclone link` for making files accessible to the public and sets the duration before the download authorization token will expire.
The minimum value is `1 second`. The maximum value is `one week`.
- Config: `download_auth_duration`
- Env Var: `RCLONE_B2_DOWNLOAD_AUTH_DURATION`
- Type: `Duration`
- Default: `1w`
- **`--b2-lifecycle`** โ Set the number of days deleted files should be kept when creating a bucket.
On bucket creation, this parameter is used to create a lifecycle rule for the entire bucket.
If lifecycle is `0` (the default) it does not create a lifecycle rule so the default B2 behaviour applies. This is to create versions of files on delete and overwrite and to keep them indefinitely.
If lifecycle is `>0` then it creates a single rule setting the number of days before a file that is deleted or overwritten is deleted permanently. This is known as `daysFromHidingToDeleting` in the b2 docs.
The minimum value for this parameter is `1 day`.
You can also enable `hard_delete` in the config also which will mean deletions won't cause versions but overwrites will still cause versions to be made.
See: `rclone backend lifecycle` for setting lifecycles after bucket creation.
- Config: `lifecycle`
- Env Var: `RCLONE_B2_LIFECYCLE`
- Type: `int`
- Default: `0`
- **`--b2-encoding`** โ The encoding for the backend.
See the encoding section in the overview (https://rclone.org/overview/#encoding) for more info.
- Config: `encoding`
- Env Var: `RCLONE_B2_ENCODING`
- Type: `Encoding`
- Default: `Slash,BackSlash,Del,Ctl,InvalidUtf8,Dot`
- **`--b2-sse-customer-algorithm`** โ If using SSE-C, the server-side encryption algorithm used when storing this object in B2.
- Config: `sse_customer_algorithm`
- Env Var: `RCLONE_B2_SSE_CUSTOMER_ALGORITHM`
- Type: `string`
- Required: `false`
- Examples:
- `""`
- None
- `"AES256"`
- Advanced Encryption Standard (256 bits key length)
- **`--b2-sse-customer-key`** โ To use SSE-C, you may provide the secret encryption key encoded in a UTF-8 compatible string to encrypt/decrypt your data
Alternatively you can provide `--sse-customer-key-base64`.
- Config: `sse_customer_key`
- Env Var: `RCLONE_B2_SSE_CUSTOMER_KEY`
- Type: `string`
- Required: `false`
- Examples:
- `""`
- None
- **`--b2-sse-customer-key-base64`** โ To use SSE-C, you may provide the secret encryption key encoded in Base64 format to encrypt/decrypt your data
Alternatively you can provide `--sse-customer-key`.
- Config: `sse_customer_key_base64`
- Env Var: `RCLONE_B2_SSE_CUSTOMER_KEY_BASE64`
- Type: `string`
- Required: `false`
- Examples:
- `""`
- None
- **`--b2-sse-customer-key-md5`** โ If using SSE-C you may provide the secret encryption key MD5 checksum (optional).
If you leave it blank, this is calculated automatically from the `sse_customer_key` provided.
- Config: `sse_customer_key_md5`
- Env Var: `RCLONE_B2_SSE_CUSTOMER_KEY_MD5`
- Type: `string`
- Required: `false`
- Examples:
- `""`
- None
- **`--b2-description`** โ Description of the remote.
- Config: `description`
- Env Var: `RCLONE_B2_DESCRIPTION`
- Type: `string`
- Required: `false`
---
## ๐ Backend commands ๐
Here are the commands specific to the `b2` backend. Main character commands only. ๐
Run them with:
rclone backend COMMAND remote:
The help below will explain what arguments each command takes.
See the `backend` (https://rclone.org/commands/rclone_backend/) command for more info on how to pass options and arguments.
These can be run on a running backend using the rc command `backend/command` (https://rclone.org/rc/#backend-command).
### `lifecycle`
Read or set the lifecycle for a bucket.
rclone backend lifecycle remote: [options] [<arguments>+]
This command can be used to read or set the lifecycle for a bucket.
To show the current lifecycle rules:
rclone backend lifecycle b2:bucket
This will dump something like this showing the lifecycle rules.
[ { "daysFromHidingToDeleting": 1, "daysFromUploadingToHiding": null, "daysFromStartingToCancelingUnfinishedLargeFiles": null, "fileNamePrefix": "" } ]
If there are no lifecycle rules (which is literally the default, bestie, the vibes are *pristine*), it just returns `[]`. Empty. Nada. Nothing to see here ๐
Wanna reset your current lifecycle rules? Say less:
rclone backend lifecycle b2:bucket -o daysFromHidingToDeleting=30 rclone backend lifecycle b2:bucket -o daysFromUploadingToHiding=5 -o daysFromHidingToDeleting=1
It'll run, then print the shiny new lifecycle rules right back at you, just like the example up there ^^^. Obsessed.
Heads up though: rclone only lets you set lifecycles for the **whole bucket**, with `fileNamePrefix` = `""`. That's the house rules, no negotiating ๐ซถ
And you **can't** disable versioning with B2. Not a thing. The best you can do is set `daysFromHidingToDeleting` to `1` day. You can also enable `hard_delete` in the config, which means deletions won't cause versions โ but overwrites will *still* make versions. Pick your poison ๐
rclone backend lifecycle b2:bucket -o daysFromHidingToDeleting=1
See: <https://www.backblaze.com/docs/cloud-storage-lifecycle-rules>
Options:
- **"daysFromHidingToDeleting"** โ after a file has been hidden for this many days, it gets deleted. `0` means off.
- **"daysFromStartingToCancelingUnfinishedLargeFiles"** โ cancels any unfinished large file versions after this many days.
- **"daysFromUploadingToHiding"** โ this many days after uploading, a file gets hidden.
## ๐ซ cleanup
Removes unfinished large file uploads. Yeet them into the void, fr fr.
rclone backend cleanup remote: [options] [<arguments>+]
This command removes unfinished large file uploads older than `max-age`, which defaults to `24` hours. Old uploads = ghosted ๐ป
Ngl, you can use `--interactive`/`-i` or `--dry-run` with this command to see what it *would* do before it actually does it. Always peek first, bestie.
rclone backend cleanup b2:bucket/path/to/object rclone backend cleanup -o max-age=7w b2:bucket/path/to/object
Durations are parsed as per the rest of rclone โ `2h`, `7d`, `7w`, etc. You know the drill โจ
Options:
- **"max-age"** โ max age of upload to delete.
## ๐ธ cleanup-hidden
Removes old versions of files. The hidden ones. The secret ones. Gone ๐
rclone backend cleanup-hidden remote: [options] [<arguments>+]
This command removes any old hidden versions of files.
Same deal as before: you can use `--interactive`/`-i` or `--dry-run` with this command to see what it would do first.
rclone backend cleanup-hidden b2:bucket/path/to/dir
## โ ๏ธ Limitations
`rclone about` is **not supported** by the B2 backend. RIP. Backends without this capability can't determine free space for an rclone mount, and they can't use policy `mfs` (most free space) as a member of an rclone union remote. So, like, plan around that ๐ญ
See List of backends that do not support rclone about (<https://rclone.org/overview/#optional-features>) and rclone about (<https://rclone.org/commands/rclone_about/>).
---
# ๐ฆ Box ๐ฆ
Paths are specified as `remote:path`
Paths may be as deep as required, e.g. `remote:directory/subdirectory`. Go off, nest as much as you want ๐ฆ
The initial setup for Box involves getting a token from Box, which you can do either in your browser, or with a `config.json` downloaded from Box to use JWT authentication. `rclone config` walks you through it. So helpful of her ๐
## ๐ Configuration
Here's an example of how to make a remote called `remote`. First run:
rclone config
This will guide you through an interactive setup process:
No remotes found, make a new one? n) New remote s) Set configuration password q) Quit config n/s/q> n name> remote Type of storage to configure. Choose a number from below, or type in your own value [snip] XX / Box \ "box" [snip] Storage> box Box App Client Id - leave blank normally. client_id> Box App Client Secret - leave blank normally. client_secret> Box App config.json location Leave blank normally. Enter a string value. Press Enter for the default (""). box_config_file> Box App Primary Access Token Leave blank normally. Enter a string value. Press Enter for the default (""). access_token>
Enter a string value. Press Enter for the default ("user"). Choose a number from below, or type in your own value 1 / Rclone should act on behalf of a user \ "user" 2 / Rclone should act on behalf of a service account \ "enterprise" box_sub_type> Remote config Use web browser to automatically authenticate rclone with remote?
- Say Y if the machine running rclone has a web browser you can use
- Say N if running rclone on a (remote) machine without web browser access If not sure try Y. If Y failed, try N. y) Yes n) No y/n> y If your browser doesn't open automatically go to the following link: http://127.0.0.1:53682/auth?state=XXXXXXXXXXXXXXXXXXXXXX Log in and authorize rclone for access Waiting for code... Got code Configuration complete. Options:
- type: box
- client_id:
- client_secret:
- token: {"access_token":"XXX","token_type":"bearer","refresh_token":"XXX","expiry":"XXX"} Keep this "remote" remote? y) Yes this is OK e) Edit this remote d) Delete this remote y/e/d> y
See the remote setup docs (<https://rclone.org/remote_setup/>) for how to set it up on a machine without an internet-connected web browser available. No browser? No problem ๐ง
Quick note: rclone runs a webserver on your local machine to collect the token as returned from Box. This *only* runs from the moment it opens your browser to the moment you get back the verification code. It's on `http://127.0.0.1:53682/` and this may require you to unblock it temporarily if you're running a host firewall. Just a lil heads up ๐
Once configured, you can then use rclone like this (replace `remote` with the name you gave your remote):
List directories in top level of your Box
rclone lsd remote:
List all the files in your Box
rclone ls remote:
To copy a local directory to an Box directory called `backup`
rclone copy /home/source remote:backup
## ๐ Using rclone with an Enterprise account with SSO
If you have an "Enterprise" account type with Box with single sign on (SSO), you need to create a password to use Box with rclone. This can be done at your Enterprise Box account by going to Settings, "Account" Tab, and then set the password in the "Authentication" field. Iconic of them to hide it there, honestly.
Once you've done this, you can setup your Enterprise Box account using the same procedure detailed above, using the password you just set. Easy ๐
## ๐ญ Invalid refresh token
According to the box docs (<https://developer.box.com/v2.0/docs/oauth-20#section-6-using-the-access-and-refresh-tokens>):
> Each `refresh_token` is valid for one use in 60 days.
This means that if you
- Don't use the box remote for 60 days
- Copy the config file with a box refresh token in and use it in two places
- Get an error on a token refresh
then rclone will return an error which includes the text `Invalid refresh token`.
To fix this you'll need to use oauth2 again to update the refresh token. You can use the methods in the remote setup docs (<https://rclone.org/remote_setup/>), bearing in mind that if you use the copy-the-config-file method, you should **not** use that remote on the computer you did the authentication on. Important!!! Don't do it ๐
Here's how to do it.
$ rclone config Current remotes:
Name Type ==== ==== remote box
e) Edit existing remote n) New remote d) Delete remote r) Rename remote c) Copy remote s) Set configuration password q) Quit config e/n/d/r/c/s/q> e Choose a number from below, or type in an existing value 1 > remote remote> remote Configuration complete. Options:
- type: box
- token: {"access_token":"XXX","token_type":"bearer","refresh_token":"XXX","expiry":"2017-07-08T23:40:08.059167677+01:00"} Keep this "remote" remote? Edit remote Value "client_id" = "" Edit? (y/n)> y) Yes n) No y/n> n Value "client_secret" = "" Edit? (y/n)> y) Yes n) No y/n> n Remote config Token already configured - replace it? y) Yes n) No y/n> y Use web browser to automatically authenticate rclone with remote?
- Say Y if the machine running rclone has a web browser you can use
- Say N if running rclone on a (remote) machine without web browser access If not sure try Y. If Y failed, try N. y) Yes n) No y/n> y If your browser doesn't open automatically go to the following link: http://127.0.0.1:53682/auth Log in and authorize rclone for access Waiting for code... Got code Configuration complete. Options:
- type: box
- token: {"access_token":"YYY","token_type":"bearer","refresh_token":"YYY","expiry":"2017-07-23T12:22:29.259137901+01:00"} Keep this "remote" remote? y) Yes this is OK e) Edit this remote d) Delete this remote y/e/d> y
## โฐ Modification times and hashes
Box allows modification times to be set on objects accurate to **1 second**. These will be used to detect whether objects need syncing or not. Precision, slay.
Box supports SHA1 type hashes, so you can use the `--checksum` flag. ๐
## ๐ซ Restricted filename characters
In addition to the default restricted characters set (<https://rclone.org/overview/#restricted-characters>) the following characters are also replaced:
Character Value Replacement
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
`\` 0x5C `๏ผผ`
File names can also **not** end with the following characters. These only get replaced if they are the last character in the name:
Character Value Replacement
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
`SP` 0x20 `โ `
Invalid UTF-8 bytes will also be replaced (<https://rclone.org/overview/#invalid-utf8>), as they can't be used in JSON strings. JSON said no, so rclone said no ๐
### โจ Transfers โจ
Okay so for any file bigger than 50 MiB, rclone switches to a chunked transfer, periodt. It'll upload up to `--transfers` chunks at the same time (and those slots are shared among **all** the multipart uploads going on). The chunks get buffered in memory and are normally 8 MiB a pop โ so heads up bestie, bumping `--transfers` up will also bump your memory use up. ๐คฏ
### ๐๏ธ Deleting files
Depending on the enterprise settings for your user, the item will either be *actually* yeeted out of Box, or just moved to the trash. No in-between.
Emptying the trash **is** possible with the `rclone cleanup` command โ but it deletes every trashed file and folder one by one, so it can take a genuinely ridiculous amount of time. ๐ญ Emptying the trash from the WebUI doesn't have that limitation, so the move is: empty that trash via the WebUI, babe. ๐
### ๐ Root folder ID
You can set the `root_folder_id` for rclone. This is the directory (identified by its Folder ID) that rclone treats as the root of your Box drive. ๐ณ
Normally you just leave this blank and rclone figures out the correct root all by itself โ she's self-sufficient like that.
But you *can* set it to lock rclone into one specific folder hierarchy.
To do that you have to find the Folder ID of the directory you want rclone to show. It's the last segment of the URL when you open that folder in the Box web interface. Easy.
So if the folder you want rclone to use has a URL like `https://app.box.com/folder/11xxxxxxxxx8` in your browser, then you drop `11xxxxxxxxx8` in as the `root_folder_id` in the config. Slay. โจ
### ๐ธ Standard options
Here are the Standard options specific to box (Box).
- **`--box-client-id`** โ OAuth Client Id.
Leave blank normally.
Properties:
- Config: `client_id`
- Env Var: `RCLONE_BOX_CLIENT_ID`
- Type: string
- Required: false
- **`--box-client-secret`** โ OAuth Client Secret.
Leave blank normally.
Properties:
- Config: `client_secret`
- Env Var: `RCLONE_BOX_CLIENT_SECRET`
- Type: string
- Required: false
- **`--box-box-config-file`** โ Box App `config.json` location.
Leave blank normally.
A leading `~` will be expanded in the file name, and so will environment variables like `${RCLONE_CONFIG_DIR}`.
Properties:
- Config: `box_config_file`
- Env Var: `RCLONE_BOX_BOX_CONFIG_FILE`
- Type: string
- Required: false
- **`--box-access-token`** โ Box App Primary Access Token.
Leave blank normally.
Properties:
- Config: `access_token`
- Env Var: `RCLONE_BOX_ACCESS_TOKEN`
- Type: string
- Required: false
- **`--box-box-sub-type`**
Properties:
- Config: `box_sub_type`
- Env Var: `RCLONE_BOX_BOX_SUB_TYPE`
- Type: string
- Default: `"user"`
- Examples:
- `"user"`
- Rclone should act on behalf of a user.
- `"enterprise"`
- Rclone should act on behalf of a service account.
### ๐ Advanced options
Here are the Advanced options specific to box (Box).
- **`--box-token`** โ OAuth Access Token as a JSON blob.
Properties:
- Config: `token`
- Env Var: `RCLONE_BOX_TOKEN`
- Type: string
- Required: false
- **`--box-auth-url`** โ Auth server URL.
Leave blank to use the provider defaults.
Properties:
- Config: `auth_url`
- Env Var: `RCLONE_BOX_AUTH_URL`
- Type: string
- Required: false
- **`--box-token-url`** โ Token server url.
Leave blank to use the provider defaults.
Properties:
- Config: `token_url`
- Env Var: `RCLONE_BOX_TOKEN_URL`
- Type: string
- Required: false
- **`--box-client-credentials`** โ Use client credentials OAuth flow.
This will use the OAUTH2 client Credentials Flow as described in RFC 6749.
> Heads up: this option is **NOT** supported by all backends. ๐
Properties:
- Config: `client_credentials`
- Env Var: `RCLONE_BOX_CLIENT_CREDENTIALS`
- Type: bool
- Default: false
- **`--box-root-folder-id`** โ Fill in for rclone to use a non root folder as its starting point.
Properties:
- Config: `root_folder_id`
- Env Var: `RCLONE_BOX_ROOT_FOLDER_ID`
- Type: string
- Default: `"0"`
- **`--box-upload-cutoff`** โ Cutoff for switching to multipart upload (>= 50 MiB).
Properties:
- Config: `upload_cutoff`
- Env Var: `RCLONE_BOX_UPLOAD_CUTOFF`
- Type: SizeSuffix
- Default: `50Mi`
- **`--box-commit-retries`** โ Max number of times to try committing a multipart file.
Properties:
- Config: `commit_retries`
- Env Var: `RCLONE_BOX_COMMIT_RETRIES`
- Type: int
- Default: `100`
- **`--box-list-chunk`** โ Size of listing chunk 1-1000.
Properties:
- Config: `list_chunk`
- Env Var: `RCLONE_BOX_LIST_CHUNK`
- Type: int
- Default: `1000`
- **`--box-owned-by`** โ Only show items owned by the login (email address) passed in.
Properties:
- Config: `owned_by`
- Env Var: `RCLONE_BOX_OWNED_BY`
- Type: string
- Required: false
- **`--box-impersonate`** โ Impersonate this user ID when using a service account.
Setting this flag lets rclone, when it's using a JWT service account, act on behalf of another user by setting the `as-user` header.
The user ID is the Box identifier for a user. User IDs can be found for any user via the `GET /users` endpoint, which is only available to admins โ or by calling the `GET /users/me` endpoint with an authenticated user session.
See: `https://developer.box.com/guides/authentication/jwt/as-user/`
Properties:
- Config: `impersonate`
- Env Var: `RCLONE_BOX_IMPERSONATE`
- Type: string
- Required: false
- **`--box-encoding`** โ The encoding for the backend.
See the encoding section in the overview (`https://rclone.org/overview/#encoding`) for more info.
Properties:
- Config: `encoding`
- Env Var: `RCLONE_BOX_ENCODING`
- Type: Encoding
- Default: `Slash,BackSlash,Del,Ctl,RightSpace,InvalidUtf8,Dot`
- **`--box-description`** โ Description of the remote.
Properties:
- Config: `description`
- Env Var: `RCLONE_BOX_DESCRIPTION`
- Type: string
- Required: false
### ๐ Limitations
Bestie, listen. Box is case insensitive, so you literally cannot have one file called `Hello.doc` and another called `hello.doc`. They're the same file to Box. ๐ญ
Box file names can't contain the `\` character. rclone maps it back and forth to an identical-looking unicode equivalent: `๏ผผ` (U+FF3C Fullwidth Reverse Solidus). Sneaky but it works. ๐ง
Box only supports filenames up to 255 characters in length.
Box has API rate limits (`https://developer.box.com/guides/api-calls/permissions-and-errors/rate-limits/`) which sometimes slow rclone down. Not rclone's fault, the API is just like that. ๐
`rclone about` is **not** supported by the Box backend. And backends without this capability can't determine free space for an `rclone mount`, and can't use policy `mfs` (most free space) as a member of an `rclone union` remote.
See List of backends that do not support `rclone about` (`https://rclone.org/overview/#optional-features`) and `rclone about` (`https://rclone.org/commands/rclone_about/`).
### ๐ Get your own Box App ID
Here's how to create your own Box App ID for rclone, step by step:
1. Go to the Box Developer Console (`https://app.box.com/developers/console`) and log in, then click **My Apps** on the sidebar. Click **Create New App** and select **Custom App**.
2. On the first screen in the box that pops up, you can pretty much enter whatever you want. The **App Name** can be whatever. For **Purpose** choose **automation** so you don't have to fill out anything else. Click **Next**.
3. On the second screen of the creation screen, select **User Authentication (OAuth 2.0)**. Then click **Create App**.
4. You should now be on the **Configuration** tab of your new app. If not, click on it at the top of the webpage. Copy down **Client ID** and **Client Secret** โ you'll need those for rclone. ๐
5. Under "OAuth 2.0 Redirect URI", add `http://127.0.0.1:53682/`
6. For **Application Scopes**, select **Read all files and folders stored in Box** and **Write all files and folders stored in box** (assuming you want to do both, which, let's be real, you do). Leave the others unchecked. Click **Save Changes** at the top right.
---
## ๐ซถ Cache
The cache remote wraps another existing remote and stores the file structure and its data for long-running tasks like `rclone mount`.
> It is **deprecated** so it's not recommended for use with new installations and may be removed at some point. ๐จ
### ๐ฆ Status
The cache backend code is working, but it currently doesn't have a maintainer, so there are outstanding bugs (`https://github.com/rclone/rclone/issues?q=is%3Aopen+is%3Aissue+label%3Abug+label%3A%22Remote%3A+Cache%22`) which aren't getting fixed. ๐
The cache backend is due to be phased out in favour of the VFS caching layer eventually, which is more tightly integrated into rclone.
Until this happens we recommend only using the cache backend if you find you can't work without it. There are many docs online describing the use of the cache backend to minimize API hits, and by-and-large these are out of date โ the cache backend isn't needed in those scenarios any more.
### โญ Configuration
To get started you just need to have an existing remote which can be configured with cache.
Here is an example of how to make a remote called `test-cache`. First run:
rclone config
This will guide you through an interactive setup process:
No remotes found, make a new one? n) New remote r) Rename remote c) Copy remote s) Set configuration password q) Quit config n/r/c/s/q> n name> test-cache Type of storage to configure. Choose a number from below, or type in your own value [snip] XX / Cache a remote \ "cache" [snip] Storage> cache Remote to cache. Normally should contain a ':' and a path, e.g. "myremote:path/to/dir", "myremote:bucket" or maybe "myremote:" (not recommended). remote> local:/test Optional: The URL of the Plex server plex_url> http://127.0.0.1:32400 Optional: The username of the Plex user plex_username> dummyusername Optional: The password of the Plex user y) Yes type in my own password g) Generate random password n) No leave this optional password blank y/g/n> y Enter the password: password: Confirm the password: password: The size of a chunk. Lower value good for slow connections but can affect seamless reading. Default: 5M Choose a number from below, or type in your own value 1 / 1 MiB \ "1M" 2 / 5 MiB \ "5M" 3 / 10 MiB \ "10M" chunk_size> 2 How much time should object info (file size, file hashes, etc.) be stored in cache. Use a very high value if you don't plan on changing the source FS from outside the cache. Accepted units are: "s", "m", "h". Default: 5m Choose a number from below, or type in your own value 1 / 1 hour \ "1h" 2 / 24 hours \ "24h" 3 / 24 hours \ "48h" info_age> 2 The maximum size of stored chunks. When the storage grows beyond this size, the oldest chunks will be deleted. Default: 10G Choose a number from below, or type in your own value 1 / 500 MiB \ "500M" 2 / 1 GiB \ "1G" 3 / 10 GiB \ "10G" chunk_total_size> 3 Remote config -------------------- [test-cache] remote = local:/test plex_url = http://127.0.0.1:32400 plex_username = dummyusername plex_password = * ENCRYPTED * chunk_size = 5M info_age = 48h chunk_total_size = 10G
<purple>and boom</purple>, your remote is built ๐
now you can actually *use* the thing, like this:
List directories in top level of your drive
rclone lsd test-cache:
List all the files in your drive
rclone ls test-cache:
To start a cached mount
rclone mount --allow-other test-cache: /var/tmp/test-cache
---
## โ๏ธ Write Features โ๏ธ
### ๐ Offline uploading
ok so bestie, to make writing through cache way more <mint>reliable</mint>, the backend now supports this feature โ you switch it on by specifying a <hotpink>`cache-tmp-upload-path`</hotpink>.
A file goes through these states when you're using this feature:
1. An upload is started (usually by copying a file on the cache remote)
2. When the copy to the temporary location is complete the file is part of the cached remote and looks and behaves like any other file (reading included)
3. After `cache-tmp-wait-time` passes and the file is next in line, `rclone move` is used to move the file to the cloud provider
4. Reading the file still works during the upload but most modifications on it will be prohibited
5. Once the move is complete the file is unlocked for modifications as it becomes as any other regular file
6. If the file is being read through cache when it's actually deleted from the temporary path then cache will simply swap the source to the cloud provider without interrupting the reading (small blip can happen though)
Files are uploaded <lavender>in sequence</lavender> and only <bold>one file</bold> is uploaded at a time. Uploads will be stored in a queue and be processed based on the order they were added. The queue and the temporary storage is persistent across restarts but can be cleared on startup with the `--cache-db-purge` flag. ๐ซถ
### โ๏ธ Write Support
Writes are supported through cache. One caveat though ๐ญ โ a mounted cache remote does <bold>not</bold> add any retry or fallback mechanism to the upload operation. That's gonna depend on the implementation of the wrapped remote. Consider using <hotpink>Offline uploading</hotpink> for reliable writes.
One special case is covered with `cache-writes` which will cache the file data at the same time as the upload when it is enabled, making it available from the cache store immediately once the upload is finished. โจ
---
## ๐ Read Features ๐
### ๐ Multiple connections
To counter the high latency between a local PC where rclone is running and cloud providers, the cache remote can split multiple requests to the cloud provider for smaller file chunks and combines them together locally โ where they can be available <mint>almost immediately</mint> before the reader usually needs them.
This is similar to buffering when media files are played online. Rclone will stay around the current marker but always try its best to stay ahead and prepare the data before. ๐
### ๐ฌ Plex Integration
There is a direct integration with Plex which allows cache to detect during reading if the file is in playback or not. This helps cache adapt how it queries the cloud provider depending on what is needed for.
Scans will have a minimum amount of workers (1) while in a confirmed playback cache will deploy the configured number of workers.
This integration opens the doorway to additional performance improvements which will be explored in the near future. ๐ฆ
> Note: If Plex options are not configured, cache will function with its configured options without adapting any of its settings.
**How to enable?** Run `rclone config` and add all the Plex options (endpoint, username and password) in your remote and it will be automatically enabled. ๐
Affected settings:
- `cache-workers`: Configured value during confirmed playback or `1` all the other times
### ๐ Certificate Validation
When the Plex server is configured to only accept secure connections, it is possible to use `.plex.direct` URLs to ensure certificate validation succeeds. These URLs are used by Plex internally to connect to the Plex server securely. ๐
The format for these URLs is the following:
https://ip-with-dots-replaced.server-hash.plex.direct:32400/
The `ip-with-dots-replaced` part can be any IPv4 address, where the dots have been replaced with dashes, e.g. `127.0.0.1` becomes `127-0-0-1`.
To get the `server-hash` part, the easiest way is to visit
https://plex.tv/api/resources?includeHttps=1&X-Plex-Token=your-plex-token
This page will list all the available Plex servers for your account with at least one `.plex.direct` link for each. Copy one URL and replace the IP address with the desired address. This can be used as the `plex_url` value. ๐
---
## ๐ Known issues ๐
### ๐ Mount and `--dir-cache-time`
`--dir-cache-time` controls the first layer of directory caching which works at the mount layer. Being an independent caching mechanism from the cache backend, it will manage its own entries based on the configured time.
To avoid getting in a scenario where dir cache has obsolete data and cache would have the correct one, try to set `--dir-cache-time` to a **lower** time than `--cache-info-age`. Default values are already configured in this way. ๐
### ๐ช Windows support - Experimental
There are a couple of issues with Windows mount functionality that still require some investigations. It should be considered as **experimental** thus far as fixes come in for this OS.
Most of the issues seem to be related to the difference between filesystems on Linux flavors and Windows as cache is heavily dependent on them.
Any reports or feedback on how cache behaves on this OS is greatly appreciated. ๐ซถ
- Issue #1935 (`https://github.com/rclone/rclone/issues/1935`)
- Issue #1907 (`https://github.com/rclone/rclone/issues/1907`)
- Issue #1834 (`https://github.com/rclone/rclone/issues/1834`)
### ๐ฅ Risk of throttling
Future iterations of the cache backend will make use of the pooling functionality of the cloud provider to synchronize and at the same time make writing through it more tolerant to failures.
There are a couple of enhancements in track to add these but in the meantime there is a <red>valid concern</red> that the expiring cache listings can lead to cloud provider throttles or bans due to repeated queries on it for very large mounts.
Some recommendations:
- don't use a very small interval for entry information (`--cache-info-age`)
- while writes aren't yet optimised, you can still write through cache which gives you the advantage of adding the file in the cache at the same time if configured to do so.
Future enhancements:
- Issue #1937 (`https://github.com/rclone/rclone/issues/1937`)
- Issue #1936 (`https://github.com/rclone/rclone/issues/1936`)
### ๐ cache and crypt
One common scenario is to keep your data encrypted in the cloud provider using the `crypt` remote. `crypt` uses a similar technique to wrap around an existing remote and handles this translation in a seamless way.
There is an issue with wrapping the remotes in this order: **cloud remote -> crypt -> cache**
During testing, I experienced a lot of bans with the remotes in this order. I suspect it might be related to how `crypt` opens files on the cloud provider which makes it think we're downloading the full file instead of small chunks. Organizing the remotes in this order yields better results: **cloud remote -> cache -> crypt**
### ๐ absolute remote paths
cache can not differentiate between relative and absolute paths for the wrapped remote. Any path given in the `remote` config setting and on the command line will be passed to the wrapped remote as is, but for storing the chunks on disk the path will be made relative by removing any leading `/` character.
This behavior is irrelevant for most backend types, but there are backends where a leading `/` changes the effective directory, e.g. in the `sftp` backend paths starting with a `/` are relative to the root of the SSH server and paths without are relative to the user home directory. As a result `sftp:bin` and `sftp:/bin` will share the same cache folder, even if they represent a different directory on the SSH server. ๐
### ๐๏ธ Cache and Remote Control (`--rc`)
Cache supports the new `--rc` mode in rclone and can be remote controlled through the following end points: By default, the listener is disabled if you do not add the flag.
### ๐งน `rc cache/expire`
Okay so this one purges a remote from the cache backend ๐
, and it's chill about what you hand it โ it supports **either a directory or a file**. And yes bestie, it handles both **encrypted and unencrypted file names** if the cache is wrapped by crypt. She's flexible like that โจ.
Params:
- `remote` = path to remote (**required**, not optional, don't skip her)
- `withData` = `true`/`false` to delete cached data (chunks) as well (*optional*, `false` by default)
---
## ๐ Standard options ๐
Here are the Standard options specific to cache (Cache a remote). Your starter pack, basically ๐
- **`--cache-remote`** โ Remote to cache.
Normally should contain a `':'` and a path, e.g. `"myremote:path/to/dir"`, `"myremote:bucket"` or maybe `"myremote:"` (not recommended ๐ฌ).
- Config: `remote`
- Env Var: `RCLONE_CACHE_REMOTE`
- Type: `string`
- Required: `true`
- **`--cache-plex-url`** โ The URL of the Plex server. She's pointing at your Plex, periodt ๐
- Config: `plex_url`
- Env Var: `RCLONE_CACHE_PLEX_URL`
- Type: `string`
- Required: `false`
- **`--cache-plex-username`** โ The username of the Plex user.
- Config: `plex_username`
- Env Var: `RCLONE_CACHE_PLEX_USERNAME`
- Type: `string`
- Required: `false`
- **`--cache-plex-password`** โ The password of the Plex user.
> NB: Input to this must be obscured โ see `rclone obscure` (`https://rclone.org/commands/rclone_obscure/`). Do NOT just type your raw password in here, I'm begging ๐ญ
- Config: `plex_password`
- Env Var: `RCLONE_CACHE_PLEX_PASSWORD`
- Type: `string`
- Required: `false`
- **`--cache-chunk-size`** โ The size of a chunk (partial file data).
Use lower numbers for slower connections. If the chunk size is changed, any downloaded chunks will be invalid and `cache-chunk-path` will need to be cleared or unexpected EOF errors will occur. Lowkey important fr fr.
- Config: `chunk_size`
- Env Var: `RCLONE_CACHE_CHUNK_SIZE`
- Type: `SizeSuffix`
- Default: `5Mi`
- Examples:
- `"1M"`
- 1 MiB
- `"5M"`
- 5 MiB
- `"10M"`
- 10 MiB
- **`--cache-info-age`** โ How long to cache file structure information (directory listings, file size, times, etc.). If all write operations are done through the cache then you can safely make this value very large as the cache store will also be updated in real time. She stays in sync, iconic ๐
- Config: `info_age`
- Env Var: `RCLONE_CACHE_INFO_AGE`
- Type: `Duration`
- Default: `6h0m0s`
- Examples:
- `"1h"`
- 1 hour
- `"24h"`
- 24 hours
- `"48h"`
- 48 hours
- **`--cache-chunk-total-size`** โ The total size that the chunks can take up on the local disk.
If the cache exceeds this value then it will start to delete the oldest chunks until it goes under this value. Out with the old, in with the new ๐ฆ
- Config: `chunk_total_size`
- Env Var: `RCLONE_CACHE_CHUNK_TOTAL_SIZE`
- Type: `SizeSuffix`
- Default: `10Gi`
- Examples:
- `"500M"`
- 500 MiB
- `"1G"`
- 1 GiB
- `"10G"`
- 10 GiB
---
## ๐ฅ Advanced options ๐ฅ
Here are the Advanced options specific to cache (Cache a remote). This is where the main characters live ๐
- **`--cache-plex-insecure`** โ Skip all certificate verification when connecting to the Plex server. Living dangerously, I see ๐
- Config: `plex_insecure`
- Env Var: `RCLONE_CACHE_PLEX_INSECURE`
- Type: `string`
- Required: `false`
- **`--cache-db-path`** โ Directory to store file structure metadata DB.
The remote name is used as the DB file name.
- Config: `db_path`
- Env Var: `RCLONE_CACHE_DB_PATH`
- Type: `string`
- Default: `"$HOME/.cache/rclone/cache-backend"`
- **`--cache-chunk-path`** โ Directory to cache chunk files.
Path to where partial file data (chunks) are stored locally. The remote name is appended to the final path.
This config follows the `"--cache-db-path"`. If you specify a custom location for `"--cache-db-path"` and don't specify one for `"--cache-chunk-path"` then `"--cache-chunk-path"` will use the same path as `"--cache-db-path"`. She follows her bestie, no cap ๐ซถ
- Config: `chunk_path`
- Env Var: `RCLONE_CACHE_CHUNK_PATH`
- Type: `string`
- Default: `"$HOME/.cache/rclone/cache-backend"`
- **`--cache-db-purge`** โ Clear all the cached data for this remote on start. Fresh start energy โจ
- Config: `db_purge`
- Env Var: `RCLONE_CACHE_DB_PURGE`
- Type: `bool`
- Default: `false`
- **`--cache-chunk-clean-interval`** โ How often should the cache perform cleanups of the chunk storage.
The default value should be ok for most people. If you find that the cache goes over `"cache-chunk-total-size"` too often then try to lower this value to force it to perform cleanups more often.
- Config: `chunk_clean_interval`
- Env Var: `RCLONE_CACHE_CHUNK_CLEAN_INTERVAL`
- Type: `Duration`
- Default: `1m0s`
- **`--cache-read-retries`** โ How many times to retry a read from a cache storage.
Since reading from a cache stream is independent from downloading file data, readers can get to a point where there's no more data in the cache. Most of the times this can indicate a connectivity issue if cache isn't able to provide file data anymore.
For really slow connections, increase this to a point where the stream is able to provide data but your experience will be very stuttering. Like buffering-era YouTube, tragic ๐ญ
- Config: `read_retries`
- Env Var: `RCLONE_CACHE_READ_RETRIES`
- Type: `int`
- Default: `10`
- **`--cache-workers`** โ How many workers should run in parallel to download chunks.
Higher values will mean more parallel processing (better CPU needed) and more concurrent requests on the cloud provider. This impacts several aspects like the cloud provider API limits, more stress on the hardware that rclone runs on but it also means that streams will be more fluid and data will be available much more faster to readers. More workers = more slay, but your CPU is gonna feel it ๐
> Note: If the optional Plex integration is enabled then this setting will adapt to the type of reading performed and the value specified here will be used as a maximum number of workers to use.
- Config: `workers`
- Env Var: `RCLONE_CACHE_WORKERS`
- Type: `int`
- Default: `4`
- **`--cache-chunk-no-memory`** โ Disable the in-memory cache for storing chunks during streaming.
By default, cache will keep file data during streaming in RAM as well to provide it to readers as fast as possible.
This transient data is evicted as soon as it is read and the number of chunks stored doesn't exceed the number of workers. However, depending on other settings like `"cache-chunk-size"` and `"cache-workers"` this footprint can increase if there are parallel streams too (multiple files being read at the same time).
If the hardware permits it, use this feature to provide an overall better performance during streaming but it can also be disabled if RAM is not available on the local machine.
- Config: `chunk_no_memory`
- Env Var: `RCLONE_CACHE_CHUNK_NO_MEMORY`
- Type: `bool`
- Default: `false`
- **`--cache-rps`** โ Limits the number of requests per second to the source FS (`-1` to disable).
This setting places a hard limit on the number of requests per second that cache will be doing to the cloud provider remote and try to respect that value by setting waits between reads.
If you find that you're getting banned or limited on the cloud provider through cache and know that a smaller number of requests per second will allow you to work with it then you can use this setting for that.
A good balance of all the other settings should make this setting useless but it is available to set for more special cases.
> NOTE: This will limit the number of requests during streams but other API calls to the cloud provider like directory listings will still pass.
- Config: `rps`
- Env Var: `RCLONE_CACHE_RPS`
- Type: `int`
- Default: `-1`
- **`--cache-writes`** โ Cache file data on writes through the FS.
If you need to read files immediately after you upload them through cache you can enable this flag to have their data stored in the cache store at the same time during upload.
- Config: `writes`
- Env Var: `RCLONE_CACHE_WRITES`
- Type: `bool`
- Default: `false`
- **`--cache-tmp-upload-path`** โ Directory to keep temporary files until they are uploaded.
This is the path where cache will use as a temporary storage for new files that need to be uploaded to the cloud provider.
Specifying a value will enable this feature. Without it, it is completely disabled and files will be uploaded directly to the cloud provider. No staging area, straight to the cloud ๐
- Config: `tmp_upload_path`
- Env Var: `RCLONE_CACHE_TMP_UPLOAD_PATH`
- Type: `string`
- Required: `false`
- **`--cache-tmp-wait-time`** โ How long should files be stored in local cache before being uploaded.
This is the duration that a file must wait in the temporary location `cache-tmp-upload-path` before it is selected for upload.
Note that only one file is uploaded at a time and it can take longer to start the upload if a queue formed for this purpose. One at a time bestie, she's not multitasking ๐
- Config: `tmp_wait_time`
- Env Var: `RCLONE_CACHE_TMP_WAIT_TIME`
- Type: `Duration`
- Default: `15s`
- **`--cache-db-wait-time`** โ How long to wait for the DB to be available โ `0` is unlimited.
Only one process can have the DB open at any one time, so rclone waits for this duration for the DB to become available before it gives an error.
If you set it to `0` then it will wait forever. Forever-ever? Forever-ever ๐ซถ
- Config: `db_wait_time`
- Env Var: `RCLONE_CACHE_DB_WAIT_TIME`
- Type: `Duration`
- Default: `1s`
- **`--cache-description`** โ Description of the remote.
- Config: `description`
- Env Var: `RCLONE_CACHE_DESCRIPTION`
- Type: `string`
- Required: `false`
---
## ๐ ๏ธ Backend commands ๐ ๏ธ
Here are the commands specific to the cache backend.
Run them with:
rclone backend COMMAND remote:
The help below will explain what arguments each command takes.
See the backend (`https://rclone.org/commands/rclone_backend/`) command for more info on how to pass options and arguments.
These can be run on a running backend using the rc command `backend/command` (`https://rclone.org/rc/#backend-command`).
### ๐ `stats`
Print stats on the cache backend in JSON format. Numbers but make it โจaestheticโจ.
rclone backend stats remote: [options] [<arguments>+]
---
# ๐งฉ Chunker ๐งฉ
The chunker overlay transparently splits large files into smaller chunks during upload to wrapped remote and transparently assembles them back when the file is downloaded. This allows to effectively overcome size limits imposed by storage providers. Big file? Never heard of her โ she's a bunch of little files now ๐
## โ๏ธ Configuration โ๏ธ
To use it, first set up the underlying remote following the configuration instructions for that remote. You can also use a local pathname instead of a remote.
Okay so first things first: sanity check that your chosen remote actually works. We're calling it `remote:path` down here. And note โ anything *inside* `remote:path` gets chunked, anything outside it does **not**. So if you're running a bucket-based remote (S3, B2, swift, the usual suspects ๐ชฃ) you should probably tuck the bucket into the remote itself, like `s3:bucket`.
Then you configure chunker with `rclone config`. We're naming this one `overlay` so it stays clearly separate from the remote it wraps ๐
No remotes found, make a new one? n) New remote s) Set configuration password q) Quit config n/s/q> n name> overlay Type of storage to configure. Choose a number from below, or type in your own value [snip] XX / Transparently chunk/split large files \ "chunker" [snip] Storage> chunker Remote to chunk/unchunk. Normally should contain a ':' and a path, e.g. "myremote:path/to/dir", "myremote:bucket" or maybe "myremote:" (not recommended). Enter a string value. Press Enter for the default (""). remote> remote:path Files larger than chunk size will be split in chunks. Enter a size with suffix K,M,G,T. Press Enter for the default ("2G"). chunk_size> 100M Choose how chunker handles hash sums. All modes but "none" require metadata. Enter a string value. Press Enter for the default ("md5"). Choose a number from below, or type in your own value 1 / Pass any hash supported by wrapped remote for non-chunked files, return nothing otherwise \ "none" 2 / MD5 for composite files \ "md5" 3 / SHA1 for composite files \ "sha1" 4 / MD5 for all files \ "md5all" 5 / SHA1 for all files \ "sha1all" 6 / Copying a file to chunker will request MD5 from the source falling back to SHA1 if unsupported \ "md5quick" 7 / Similar to "md5quick" but prefers SHA1 over MD5 \ "sha1quick" hash_type> md5 Edit advanced config? (y/n) y) Yes n) No y/n> n Remote config
[overlay] type = chunker remote = remote:bucket chunk_size = 100M hash_type = md5
y) Yes this is OK e) Edit this remote d) Delete this remote y/e/d> y
---
## Specifying the remote ๐
For normal everyday use, make absolutely sure the remote has a `:` in it. Fr fr. If you give a remote **without** the `:`, rclone goes and uses a local directory with that name instead. So a remote of `/path/to/secret/files` means rclone chunks stuff inside that very directory. And a remote of `name` means rclone drops the files into a directory called `name` inside your current directory. Yes bestie, it's giving "path, not remote" ๐ญ
## Chunking ๐ช
When rclone kicks off a file upload, chunker checks the file size. If it doesn't exceed the chunk size you configured, chunker just passes the file straight through to the wrapped remote (though hold up โ see the caveat below ๐). If the file *is* large, chunker transparently cuts the data into pieces with temporary names and streams them out one by one, on the fly. Every data chunk holds the specified number of bytes, except the last one, which may have less. And if the file size isn't known in advance (that's a *streaming upload*), chunker internally creates a temporary copy, records its size, and repeats the above process.
When the upload completes, the temporary chunk files are finally renamed. This scheme guarantees operations can run in parallel and, from the outside, look atomic. A similar method with hidden temporary chunks gets used for other operations too (copy/move/rename, etc.). If an operation fails, the hidden chunks are normally destroyed, and the target composite file stays intact. Immaculate behaviour, no notes ๐
When a composite file download is requested, chunker transparently assembles it by concatenating the data chunks in order. And since the split is trivial, you could literally concatenate the data chunks by hand and get the original content back. Iconic.
When the `list` command scans a directory on the wrapped remote, the potential chunk files get accounted for, grouped, and assembled into composite directory entries. Any temporary chunks are hidden away.
`list` and other commands can sometimes come across composite files with missing or invalid chunks โ like when they're shadowed by a like-named directory or another file. That usually means the wrapped filesystem has been directly tampered with, or damaged ๐. If chunker detects a missing chunk it'll print a warning by default, skip the whole incomplete group of chunks, and carry on with the current command. You can set the `--chunker-fail-hard` flag to make commands abort with an error message in those cases instead.
> Caveat: as it stands now, chunker will **always** create a temporary file in the backend and then rename it โ even if the file is below the chunk threshold. That means unnecessary API calls, and it can severely restrict throughput when you're handling transfers mostly made of small files on some backends (hi, Box ๐). A workaround is to use chunker only for files above the chunk threshold via `--min-size`, then run a separate call without chunker over the remaining files.
## Chunk names ๐งฉ
The default chunk name format is `*.rclone_chunk.###`, so out of the box your chunk names are `BIG_FILE_NAME.rclone_chunk.001`, `BIG_FILE_NAME.rclone_chunk.002`, etc. You can set another name format with the `name_format` configuration file option. The format uses an asterisk `*` as the placeholder for the base file name, plus one or more consecutive hash characters `#` as the placeholder for the sequential chunk number. There must be one and only one asterisk. The number of consecutive hash characters defines the *minimum* length of the string representing a chunk number. If the decimal chunk number has fewer digits than the number of hashes, it gets left-padded with zeros. If the decimal string is longer, it's left intact. By default numbering starts from 1, but there's another option that lets you start from 0 โ e.g. for compatibility with legacy software ๐ซถ
For example, if the name format is `big_*-##.part`, the original file name is `data.txt`, and numbering starts from 0, then the first chunk will be named `big_data.txt-00.part`, the 99th chunk will be `big_data.txt-98.part`, and the 302nd chunk will become `big_data.txt-301.part`.
Note that `list` only assembles composite directory entries when chunk names match the configured format, and it treats non-conforming file names as normal non-chunked files.
When using `norename` transactions, chunk names additionally get a unique file version suffix. For example, `BIG_FILE_NAME.rclone_chunk.001_bp562k`.
## Metadata ๐
Besides data chunks, chunker by default creates a metadata object for a composite file. That object is named after the original file. Chunker lets you disable metadata completely (the `none` format). Note that metadata is normally not created for files smaller than the configured chunk size. This may change in future rclone releases ๐
## Simple JSON metadata format ๐
This is the default format. It supports hash sums and chunk validation for composite files. Meta objects carry these fields:
- `ver` โ version of format, currently `1`
- `size` โ total size of composite file
- `nchunks` โ number of data chunks in file
- `md5` โ MD5 hashsum of composite file (if present)
- `sha1` โ SHA1 hashsum (if present)
- `txn` โ identifies current version of the file
There's no field for the composite file name, because it's simply equal to the name of the meta object on the wrapped remote. Please refer to the respective sections for details on hashsums and modified time handling.
## No metadata ๐
You can disable meta objects by setting the meta format option to `none`. In this mode chunker scans the directory for all files that follow the configured chunk name format, groups them by detecting chunks with the same base name, and shows the group names as virtual composite files. This method is more prone to missing-chunk errors (especially a missing last chunk) than the format with metadata enabled. Be warned, bestie ๐
## Hashsums ๐
Chunker supports hashsums only when a compatible metadata is present. So if you choose a metadata format of `none`, chunker will report the hashsum as `UNSUPPORTED`.
Please note that by default metadata is stored only for composite files. If a file is smaller than the configured chunk size, chunker will transparently redirect hash requests to the wrapped remote โ so support depends on that. You'll see the empty string as a hashsum of the requested type for small files if the wrapped remote doesn't support it.
Many storage backends support MD5 and SHA1 hash types, and so does chunker. With chunker you can choose one or the other, but not both. MD5 is set by default as the most supported type. Since chunker keeps hashes for composite files and falls back to the wrapped remote hash for non-chunked ones, we advise you to choose the same hash type as supported by the wrapped remote, so that your file listings look coherent โจ
If your storage backend does not support MD5 or SHA1 but you need consistent file hashing, configure chunker with `md5all` or `sha1all`. These two modes guarantee the given hash for all files. If the wrapped remote doesn't support it, chunker will then add metadata to all files, even small ones. However, this can double the amount of small files in storage and incur additional service charges ๐ธ You can even use chunker to force md5/sha1 support in any other remote at the expense of sidecar meta objects, by setting e.g. `hash_type=sha1all` to force hashsums and `chunk_size=1P` to effectively disable chunking.
Normally, when a file is copied to a chunker controlled remote, chunker will ask the file source for a compatible file hash and revert to on-the-fly calculation if none is found. This involves some CPU overhead but provides a guarantee that the given hashsum is available. Also, chunker will reject a server-side copy or move operation if source and destination hashsum types are different, resulting in extra network bandwidth, too. In some rare cases this may be undesired, so chunker provides two optional choices: `sha1quick` and `md5quick`. If the source does not support the primary hash type and the quick mode is enabled, chunker will try to fall back to the secondary type. This will save CPU and bandwidth but can result in empty hashsums at the destination. Beware of the consequences: the `sync` command will revert (sometimes silently) to time/size comparison if compatible hashsums between source and target are not found. Not me warning you twice about the same thing โ it's that serious ๐ค
### ๐ฐ๏ธ Modification times ๐ฐ๏ธ
Chunker keeps track of modification times by leaning on the wrapped remote, so whether that even works is entirely up to the wrapped remote, bestie. ๐
For a small non-chunked file, the chunker overlay just... manipulates the modification time of the wrapped remote file, easy peasy. For a composite file with metadata, chunker will get and set the modification time of the metadata object on the wrapped remote. And if the file is chunked but the metadata format is `none`? Then chunker grabs the modification time off the **first data chunk**. That's the whole vibe. โจ
### ๐ Migrations ๐
So the idiomatic way to migrate to a different chunk size, hash type, transaction style or chunk naming scheme is literally just:
- Collect all your chunked files under a directory and have your chunker remote point to it.
- Create another directory (most probably on the same cloud storage) and configure a new remote with the desired metadata format, hash type, chunk naming etc.
- Now run `rclone sync --interactive oldchunks: newchunks:` and all your data will be transparently converted in transfer. This may take some time, yet chunker will try server-side copy if possible. ๐ซถ
- After checking data integrity you may remove configuration section of the old remote.
> If `rclone` gets killed during a long operation on a big composite file, hidden temporary chunks may stay in the directory. They will not be shown by the list command but will eat up your account quota. ๐ญ Please note that the `deletefile` command deletes only active chunks of a file. As a workaround, you can use a remote of the wrapped file system to see them. An easy way to get rid of hidden garbage is to copy the littered directory somewhere using the chunker remote and purge the original directory. The copy command will copy only active chunks while the purge will remove everything including garbage. Iconic cleanup behavior, no cap. ๐งน
### ๐ Caveats and Limitations ๐
Chunker **requires** the wrapped remote to support server-side move (or copy + delete) operations โ otherwise it will explicitly refuse to start. Periodt. Why? Because internally it renames temporary chunk files to their final names once an operation completes successfully.
Chunker encodes the chunk number in the file name, so with the default `name_format` setting it adds **17 characters**. It also adds **7 characters** of temporary suffix during operations. Many file systems limit base file name without path by **255 characters**. Using rclone's crypt remote as a base file system limits the file name by **143 characters**. So the maximum name length is **231** for most files and **119** for chunker-over-crypt. A user in need can change the name format to e.g. `*.rcc##` and save **10 characters** (provided at most **99** chunks per file).
Note that a move implemented using the copy-and-delete method may incur double charging with some cloud storage providers. ๐ธ
Chunker will **not** automatically rename existing chunks when you run `rclone config` on a live remote and change the chunk name format. Beware that as a result of this, some files which have been treated as chunks before the change can pop up in directory listings as normal files and vice versa. The same warning holds for the chunk size. If you desperately need to change critical chunking settings, you should run data migration as described above. Fr fr, don't skip that step. ๐
If the wrapped remote is case insensitive, the chunker overlay will inherit that property (so you can't have a file called `"Hello.doc"` and `"hello.doc"` in the same directory).
Chunker included in rclone releases up to `v1.54` can sometimes fail to detect metadata produced by recent versions of rclone. We recommend users keep rclone up-to-date to avoid data corruption. ๐
Changing transactions is **dangerous** and requires explicit migration.
---
### โญ Standard options โญ
Here are the Standard options specific to chunker (Transparently chunk/split large files).
- **`--chunker-remote`** โ Remote to chunk/unchunk.
Normally should contain a `':'` and a path, e.g. `"myremote:path/to/dir"`, `"myremote:bucket"` or maybe `"myremote:"` (not recommended).
Properties:
- **Config:** `remote`
- **Env Var:** `RCLONE_CHUNKER_REMOTE`
- **Type:** string
- **Required:** true
- **`--chunker-chunk-size`** โ Files larger than chunk size will be split in chunks.
Properties:
- **Config:** `chunk_size`
- **Env Var:** `RCLONE_CHUNKER_CHUNK_SIZE`
- **Type:** SizeSuffix
- **Default:** `2Gi`
- **`--chunker-hash-type`** โ Choose how chunker handles hash sums.
All modes but `"none"` require metadata.
Properties:
- **Config:** `hash_type`
- **Env Var:** `RCLONE_CHUNKER_HASH_TYPE`
- **Type:** string
- **Default:** `"md5"`
- **Examples:**
- `"none"`
- Pass any hash supported by wrapped remote for non-chunked files.
- Return nothing otherwise.
- `"md5"`
- MD5 for composite files.
- `"sha1"`
- SHA1 for composite files.
- `"md5all"`
- MD5 for all files.
- `"sha1all"`
- SHA1 for all files.
- `"md5quick"`
- Copying a file to chunker will request MD5 from the source.
- Falling back to SHA1 if unsupported.
- `"sha1quick"`
- Similar to `"md5quick"` but prefers SHA1 over MD5.
### ๐ Advanced options ๐
Here are the Advanced options specific to chunker (Transparently chunk/split large files).
- **`--chunker-name-format`** โ String format of chunk file names.
The two placeholders are: base file name (`*`) and chunk number (`#...`). There must be one and only one asterisk and one or more consecutive hash characters. If chunk number has less digits than the number of hashes, it is left-padded by zeros. If there are more digits in the number, they are left as is. Possible chunk files are ignored if their name does not match given format.
Properties:
- **Config:** `name_format`
- **Env Var:** `RCLONE_CHUNKER_NAME_FORMAT`
- **Type:** string
- **Default:** `"*.rclone_chunk.###"`
- **`--chunker-start-from`** โ Minimum valid chunk number. Usually `0` or `1`.
By default chunk numbers start from `1`.
Properties:
- **Config:** `start_from`
- **Env Var:** `RCLONE_CHUNKER_START_FROM`
- **Type:** int
- **Default:** `1`
- **`--chunker-meta-format`** โ Format of the metadata object or `"none"`.
By default `"simplejson"`. Metadata is a small JSON file named after the composite file.
Properties:
- **Config:** `meta_format`
- **Env Var:** `RCLONE_CHUNKER_META_FORMAT`
- **Type:** string
- **Default:** `"simplejson"`
- **Examples:**
- `"none"`
- Do not use metadata files at all.
- Requires hash type `"none"`.
- `"simplejson"`
- Simple JSON supports hash sums and chunk validation.
- It has the following fields: `ver`, `size`, `nchunks`, `md5`, `sha1`.
- **`--chunker-fail-hard`** โ Choose how chunker should handle files with missing or invalid chunks.
Properties:
- **Config:** `fail_hard`
- **Env Var:** `RCLONE_CHUNKER_FAIL_HARD`
- **Type:** bool
- **Default:** `false`
- **Examples:**
- `"true"`
- Report errors and abort current command.
- `"false"`
- Warn user, skip incomplete file and proceed.
- **`--chunker-transactions`** โ Choose how chunker should handle temporary files during transactions.
Properties:
- **Config:** `transactions`
- **Env Var:** `RCLONE_CHUNKER_TRANSACTIONS`
- **Type:** string
- **Default:** `"rename"`
- **Examples:**
- `"rename"`
- Rename temporary files after a successful transaction.
- `"norename"`
- Leave temporary file names and write transaction ID to metadata file.
- Metadata is required for no rename transactions (meta format cannot be `"none"`).
- If you are using norename transactions you should be careful not to downgrade Rclone, as older versions of Rclone don't support this transaction style and will misinterpret files manipulated by norename transactions.
- This method is **EXPERIMENTAL**, don't use on production systems. ๐จ
- `"auto"`
- Rename or norename will be used depending on capabilities of the backend.
- If meta format is set to `"none"`, rename transactions will always be used.
- This method is **EXPERIMENTAL**, don't use on production systems. ๐จ
- **`--chunker-description`** โ Description of the remote.
Properties:
- **Config:** `description`
- **Env Var:** `RCLONE_CHUNKER_DESCRIPTION`
- **Type:** string
- **Required:** false
## ๐ธ Cloudinary ๐ธ
okay so this one is a backend for the <pink>Cloudinary</pink> platform โ `https://cloudinary.com/` โจ
### โจ About Cloudinary โจ
Cloudinary (`https://cloudinary.com/`) is literally an **image and video API platform** ๐
Trusted by **1.5 million developers** and **10,000 enterprise and hyper-growth companies** as a critical part of their tech stack to deliver visually engaging experiences. the way that's a whole lot of people trusting it? not me being impressed ๐ซถ
### ๐ธ Accounts & Pricing ๐ธ
To use this backend you need to create a free account (`https://cloudinary.com/users/register_free`) on Cloudinary ๐ Start with the free plan, it's got generous usage limits. Then, as your requirements grow (character development but make it infrastructure โจ), upgrade to a plan that best fits your needs. Pricing deets are at `https://cloudinary.com/pricing`.
### ๐ Securing Your Credentials ๐
Please refer to the docs: `https://rclone.org/docs/#configuration-encryption-cheatsheet` ๐ซถ protect those creds, bestie, fr fr.
### ๐ ๏ธ Configuration ๐ ๏ธ
Here is an example of making a Cloudinary configuration.
First, create a `cloudinary.com` account (`https://cloudinary.com/users/register_free`) and choose a plan.
You will need to log in and get the **API Key** and **API Secret** for your account from the developer section.
Now run:
rclone config
Follow the interactive setup process:
No remotes found, make a new one? n) New remote s) Set configuration password q) Quit config n/s/q> n
Enter the name for the new remote. name> cloudinary-media-library
Option Storage. Type of storage to configure. Choose a number from below, or type in your own value. [snip] XX / cloudinary.com \ (cloudinary) [snip] Storage> cloudinary
Option cloud_name. You can find your cloudinary.com cloud_name in your dashboard (https://console.cloudinary.com/pm/developer-dashboard) Enter a value. cloud_name>
Option api_key. You can find your cloudinary.com api key in your dashboard (https://console.cloudinary.com/pm/developer-dashboard) Enter a value. api_key>
Option api_secret. You can find your cloudinary.com api secret in your dashboard (https://console.cloudinary.com/pm/developer-dashboard) This value must be a single character, one of the following: y, g. y/g> y Enter a value. api_secret>
Option upload_prefix. Upload prefix (https://cloudinary.com/documentation/cloudinary_sdks#configuration_parameters) to specify alternative data center Enter a value. upload_prefix>
Option upload_preset. Upload presets (https://cloudinary.com/documentation/upload_presets) can be defined for different upload profiles Enter a value. upload_preset>
Edit advanced config? y) Yes n) No (default) y/n> n
Configuration complete. Options:
- type: cloudinary
- api_key:
- api_secret:
- cloud_name:
- upload_prefix:
- upload_preset:
Keep this "cloudinary-media-library" remote? y) Yes this is OK (default) e) Edit this remote d) Delete this remote y/e/d> y
List directories in the top level of your Media Library:
rclone lsd cloudinary-media-library:
Make a new directory.
rclone mkdir cloudinary-media-library:directory
List the contents of a directory.
rclone ls cloudinary-media-library:directory
### โฐ Modified time and hashes โฐ
Cloudinary stores **md5 and timestamps** for any successful Put automatically โ and read-only ๐ So it just... does it. iconic behaviour tbh.
### โญ Standard options โญ
Here are the Standard options specific to cloudinary (Cloudinary).
**`--cloudinary-cloud-name`** โ Cloudinary Environment Name
Properties:
- Config: `cloud_name`
- Env Var: `RCLONE_CLOUDINARY_CLOUD_NAME`
- Type: `string`
- Required: `true`
**`--cloudinary-api-key`** โ Cloudinary API Key
Properties:
- Config: `api_key`
- Env Var: `RCLONE_CLOUDINARY_API_KEY`
- Type: `string`
- Required: `true`
**`--cloudinary-api-secret`** โ Cloudinary API Secret
Properties:
- Config: `api_secret`
- Env Var: `RCLONE_CLOUDINARY_API_SECRET`
- Type: `string`
- Required: `true`
**`--cloudinary-upload-prefix`** โ Specify the API endpoint for environments out of the US
Properties:
- Config: `upload_prefix`
- Env Var: `RCLONE_CLOUDINARY_UPLOAD_PREFIX`
- Type: `string`
- Required: `false`
**`--cloudinary-upload-preset`** โ Upload Preset to select asset manipulation on upload
Properties:
- Config: `upload_preset`
- Env Var: `RCLONE_CLOUDINARY_UPLOAD_PRESET`
- Type: `string`
- Required: `false`
### ๐ฅ Advanced options ๐ฅ
Here are the Advanced options specific to cloudinary (Cloudinary).
**`--cloudinary-encoding`** โ The encoding for the backend.
See the encoding section in the overview (`https://rclone.org/overview/#encoding`) for more info.
Properties:
- Config: `encoding`
- Env Var: `RCLONE_CLOUDINARY_ENCODING`
- Type: `Encoding`
- Default: `Slash,LtGt,DoubleQuote,Question,Asterisk,Pipe,Hash,Percent,BackSlash,Del,Ctl,RightSpace,InvalidUtf8,Dot`
**`--cloudinary-eventually-consistent-delay`** โ Wait N seconds for eventual consistency of the databases that support the backend operation
Properties:
- Config: `eventually_consistent_delay`
- Env Var: `RCLONE_CLOUDINARY_EVENTUALLY_CONSISTENT_DELAY`
- Type: `Duration`
- Default: `0s`
**`--cloudinary-adjust-media-files-extensions`** โ Cloudinary handles media formats as a file attribute and strips it from the name, which is unlike most other file systems
Properties:
- Config: `adjust_media_files_extensions`
- Env Var: `RCLONE_CLOUDINARY_ADJUST_MEDIA_FILES_EXTENSIONS`
- Type: `bool`
- Default: `true`
**`--cloudinary-media-extensions`** โ Cloudinary supported media extensions
Properties:
- Config: `media_extensions`
- Env Var: `RCLONE_CLOUDINARY_MEDIA_EXTENSIONS`
- Type: `stringArray`
- Default: `[3ds 3g2 3gp ai arw avi avif bmp bw cr2 cr3 djvu dng eps3 fbx flif flv gif glb gltf hdp heic heif ico indd jp2 jpe jpeg jpg jxl jxr m2ts mov mp4 mpeg mts mxf obj ogv pdf ply png psd svg tga tif tiff ts u3ma usdz wdp webm webp wmv]`
**`--cloudinary-description`** โ Description of the remote.
Properties:
- Config: `description`
- Env Var: `RCLONE_CLOUDINARY_DESCRIPTION`
- Type: `string`
- Required: `false`
# ๐ Citrix ShareFile ๐
<rainbow>Citrix ShareFile</rainbow> (<blue>https://sharefile.com</blue>) is a secure file sharing and transfer service that's <hotpink>aimed at business</hotpink> โ like, it's giving corporate, it's giving "we have compliance people". ๐ผโจ
---
## ๐ Configuration ๐
The initial setup for Citrix ShareFile is all about getting a token from Citrix ShareFile, which you grab in your browser. No cap, `rclone config` walks you through the whole thing like a supportive bestie. ๐ซถ
Here's an example of how to make a remote called `remote`. First run:
rclone config
This will guide you through an interactive setup process:
No remotes found, make a new one? n) New remote s) Set configuration password q) Quit config n/s/q> n name> remote Type of storage to configure. Enter a string value. Press Enter for the default (""). Choose a number from below, or type in your own value XX / Citrix Sharefile \ "sharefile" Storage> sharefile ** See help for sharefile backend at: https://rclone.org/sharefile/ **
ID of the root folder
Leave blank to access "Personal Folders". You can use one of the standard values here or any folder ID (long hex number ID). Enter a string value. Press Enter for the default (""). Choose a number from below, or type in your own value 1 / Access the Personal Folders. (Default) \ "" 2 / Access the Favorites folder. \ "favorites" 3 / Access all the shared folders. \ "allshared" 4 / Access all the individual connectors. \ "connectors" 5 / Access the home, favorites, and shared folders as well as the connectors. \ "top" root_folder_id> Edit advanced config? (y/n) y) Yes n) No y/n> n Remote config Use web browser to automatically authenticate rclone with remote?
- Say Y if the machine running rclone has a web browser you can use
- Say N if running rclone on a (remote) machine without web browser access If not sure try Y. If Y failed, try N. y) Yes n) No y/n> y If your browser doesn't open automatically go to the following link: http://127.0.0.1:53682/auth?state=XXX Log in and authorize rclone for access Waiting for code... Got code Configuration complete. Options:
- type: sharefile
- endpoint: https://XXX.sharefile.com
- token: {"access_token":"XXX","token_type":"bearer","refresh_token":"XXX","expiry":"2019-09-30T19:41:45.878561877+01:00"} Keep this "remote" remote? y) Yes this is OK e) Edit this remote d) Delete this remote y/e/d> y
Need to do this on a machine that doesn't have an internet-connected web browser handy? Check the remote setup docs (<blue>https://rclone.org/remote_setup/</blue>) for how to set it up. ๐
Heads up bestie โ rclone runs a webserver on your local machine to collect the token as returned from Citrix ShareFile. It only runs from the moment it opens your browser to the moment you get back the verification code. It lives on `http://127.0.0.1:53682/` and <red>it may require you to unblock it temporarily if you're running a host firewall</red>. ๐จ
Once configured you can then use rclone like this (swap `remote` for the name you gave your remote):
List directories in top level of your ShareFile
rclone lsd remote:
List all the files in your ShareFile
rclone ls remote:
To copy a local directory to a ShareFile directory called `backup`
rclone copy /home/source remote:backup
Paths may be as deep as required, e.g. `remote:directory/subdirectory`. ๐ฆ
---
## ๐ธ Modification times and hashes ๐ธ
ShareFile allows modification times to be set on objects accurate to <yellow>1 second</yellow>. These will be used to detect whether objects need syncing or not. โฑ๏ธ
ShareFile supports <purple>MD5</purple> type hashes, so you can use the `--checksum` flag. ๐ฅ
---
## โจ Transfers โจ
For files above <yellow>128 MiB</yellow> rclone will use a **chunked transfer**. Rclone will upload up to `--transfers` chunks at the same time (shared among all the multipart uploads). Chunks are buffered in memory and are normally <yellow>64 MiB</yellow>, so increasing `--transfers` will increase memory use. ๐ง ๐ฅ
---
## ๐ Restricted filename characters ๐
On top of the default restricted characters set (<blue>https://rclone.org/overview/#restricted-characters</blue>), these characters are also replaced:
- `\` โ `0x5C` โ replaced with `๏ผผ`
- `*` โ `0x2A` โ replaced with `๏ผ`
- `<` โ `0x3C` โ replaced with `๏ผ`
- `>` โ `0x3E` โ replaced with `๏ผ`
- `?` โ `0x3F` โ replaced with `๏ผ`
- `:` โ `0x3A` โ replaced with `๏ผ`
- `|` โ `0x7C` โ replaced with `๏ฝ`
- `"` โ `0x22` โ replaced with `๏ผ`
File names also can't **start** or **end** with the following characters. These only get replaced if they are the first or last character in the name:
- `SP` โ `0x20` โ replaced with `โ `
- `.` โ `0x2E` โ replaced with `๏ผ`
Invalid UTF-8 bytes will also be replaced (<blue>https://rclone.org/overview/#invalid-utf8</blue>), because they can't be used in JSON strings. ๐ซ
---
## ๐ Standard options ๐
Here are the Standard options specific to `sharefile` (Citrix Sharefile).
### โจ `--sharefile-client-id`
OAuth Client Id. ๐ณ
Leave blank normally.
Properties:
- Config: `client_id`
- Env Var: `RCLONE_SHAREFILE_CLIENT_ID`
- Type: string
- Required: false
### โจ `--sharefile-client-secret`
OAuth Client Secret. ๐คซ
Leave blank normally.
Properties:
- Config: `client_secret`
- Env Var: `RCLONE_SHAREFILE_CLIENT_SECRET`
- Type: string
- Required: false
### โจ `--sharefile-root-folder-id`
ID of the root folder. ๐
Leave blank to access `"Personal Folders"`. You can use one of the standard values here or any folder ID (long hex number ID).
Properties:
- Config: `root_folder_id`
- Env Var: `RCLONE_SHAREFILE_ROOT_FOLDER_ID`
- Type: string
- Required: false
- Examples:
- `""`
- Access the Personal Folders (default).
- `"favorites"`
- Access the Favorites folder.
- `"allshared"`
- Access all the shared folders.
- `"connectors"`
- Access all the individual connectors.
- `"top"`
- Access the home, favorites, and shared folders as well as the connectors.
---
## ๐ Advanced options ๐
Here are the Advanced options specific to `sharefile` (Citrix Sharefile).
### ๐ซ `--sharefile-token`
OAuth Access Token as a JSON blob. ๐๏ธ
Properties:
- Config: `token`
- Env Var: `RCLONE_SHAREFILE_TOKEN`
- Type: string
- Required: false
### ๐ซ `--sharefile-auth-url`
Auth server URL. ๐
Leave blank to use the provider defaults.
Properties:
- Config: `auth_url`
- Env Var: `RCLONE_SHAREFILE_AUTH_URL`
- Type: string
- Required: false
### ๐ซ `--sharefile-token-url`
Token server url. ๐
Leave blank to use the provider defaults.
Properties:
- Config: `token_url`
- Env Var: `RCLONE_SHAREFILE_TOKEN_URL`
- Type: string
- Required: false
### ๐ซ `--sharefile-client-credentials`
Use client credentials OAuth flow. ๐ชช
This will use the OAUTH2 client Credentials Flow as described in <purple>RFC 6749</purple>.
> Note that this option is **NOT** supported by all backends. ๐ญ
Properties:
- Config: `client_credentials`
- Env Var: `RCLONE_SHAREFILE_CLIENT_CREDENTIALS`
- Type: bool
- Default: false
### ๐ซ `--sharefile-upload-cutoff`
Cutoff for switching to multipart upload. โ๏ธ
Properties:
- Config: `upload_cutoff`
- Env Var: `RCLONE_SHAREFILE_UPLOAD_CUTOFF`
- Type: SizeSuffix
- Default: `128Mi`
### ๐ซ `--sharefile-chunk-size`
Upload chunk size. ๐ฆ
<yellow>Must a power of 2 >= 256k.</yellow>
Making this larger will improve performance, but note that each chunk is buffered in memory โ one per transfer. ๐พ
Reducing this will reduce memory usage but decrease performance.
Properties:
- Config: `chunk_size`
- Env Var: `RCLONE_SHAREFILE_CHUNK_SIZE`
- Type: SizeSuffix
- Default: `64Mi`
### ๐ซ `--sharefile-endpoint`
Endpoint for API calls. ๐
This is usually auto discovered as part of the oauth process, but can be set manually to something like: `https://XXX.sharefile.com`
Properties:
- Config: `endpoint`
- Env Var: `RCLONE_SHAREFILE_ENDPOINT`
- Type: string
- Required: false
### ๐ซ `--sharefile-encoding`
The encoding for the backend. ๐ค
See the encoding section in the overview (<blue>https://rclone.org/overview/#encoding</blue>) for more info.
Properties:
- Config: `encoding`
- Env Var: `RCLONE_SHAREFILE_ENCODING`
- Type: Encoding
- Default: `Slash,LtGt,DoubleQuote,Colon,Question,Asterisk,Pipe,BackSlash,Ctl,LeftSpace,LeftPeriod,RightSpace,RightPeriod,InvalidUtf8,Dot`
### ๐ซ `--sharefile-description`
Description of the remote. ๐
Properties:
- Config: `description`
- Env Var: `RCLONE_SHAREFILE_DESCRIPTION`
- Type: string
- Required: false
---
## โ ๏ธ Limitations โ ๏ธ
Important bestie: ShareFile is <red>case insensitive</red>, so you can't have a file called `"Hello.doc"` and one called `"hello.doc"`. They'd be the same file and the vibe would be chaos. ๐
ShareFile only supports filenames up to <yellow>256 characters</yellow> in length.
`rclone about` is **not supported** by the Citrix ShareFile backend. Backends without this capability cannot determine free space for an rclone mount or use policy `mfs` (most free space) as a member of an rclone union remote. ๐
See List of backends that do not support rclone about (<blue>https://rclone.org/overview/#optional-features</blue>) and `rclone about` (<blue>https://rclone.org/commands/rclone_about/</blue>).
---
# ๐ง Crypt ๐ง
Rclone crypt remotes **encrypt and decrypt other remotes**. ๐๐ฆ
A remote of type `crypt` does **not** access a storage system (<blue>https://rclone.org/overview/</blue>) directly. Instead it *wraps* another remote, which in turn accesses the storage system. This is similar to how `alias` (<blue>https://rclone.org/alias/</blue>), `union` (<blue>https://rclone.org/union/</blue>), `chunker` (<blue>https://rclone.org/chunker/</blue>) and a few others work. It makes the usage very flexible โ you can add a layer, in this case an encryption layer, on top of any other backend, even in multiple layers. ๐ง
โจ Rclone's functionality can be used as with any other remote; for example, you can `mount` (<blue>https://rclone.org/commands/rclone_mount/</blue>) a crypt remote. ๐
<pink>okay so</pink> accessing a storage system through a crypt remote gives you <hotpink>client-side encryption</hotpink> โ that's the whole point, bestie โ and it means your data can live somewhere you <italic>do not</italic> trust to stay uncompromised, and still be safe. ๐
When you're working against the crypt remote, rclone encrypts everything <purple>before uploading</purple> and decrypts everything <purple>after downloading</purple>, on your local system, on the fly, as needed โ so what's chilling at rest in the wrapped remote stays encrypted. ๐
But <red>important reality check</red>: if you access that storage system with some other app that isn't rclone, or you hit the wrapped remote <italic>directly</italic> with rclone, there is <bold>no encryption or decryption happening at all</bold>. Downloading existing content just hands you the encrypted (scrambled) format, and anything you upload won't become encrypted. Nope. Zero. ๐ซ
The encryption itself is secret-key encryption (aka symmetric key encryption) โ a password (or pass phrase) is used to generate the <bold>real</bold> encryption key. You can supply that password yourself, or you may choose to let rclone generate one for you. It gets stored in the configuration file, in a <italic>lightly obscured</italic> form. If you're in an environment where you can't keep your config secured, you should absolutely add configuration encryption (https://rclone.org/docs/#configuration-encryption) as protection. ๐ก๏ธ
As long as you have that configuration file, you'll be able to decrypt your data. Without the configuration file, as long as you remember the password (or keep it somewhere safe), you can re-create the configuration and gain access to the existing data. You can also configure a corresponding remote in a different installation to reach the same data. See below for guidance on changing your password. โจ
Encryption uses cryptographic salt (https://en.wikipedia.org/wiki/Salt_(cryptography)) to permute the encryption key, so the same string can get encrypted in different ways. When you configure the crypt remote, entering a salt is optional โ or you can let rclone generate a unique one. If it's omitted, rclone uses a built-in unique string. Normally in cryptography the salt is stored right alongside the encrypted content and nobody has to memorize it. <hotpink>That is NOT how it works in rclone</hotpink>, because rclone doesn't store any additional information on the remotes. So using a custom salt is effectively <bold>a second password that you must memorize</bold>. ๐ญ
File content encryption is performed using NaCl SecretBox (https://godoc.org/golang.org/x/crypto/nacl/secretbox), based on XSalsa20 cipher and Poly1305 for integrity. Names (file names and directory names) are also encrypted by default, but that has some implications, which is why it's possible to turn it off. ๐
---
### ๐ธ Configuration ๐ธ
Here's an example of how to make a remote called <italic>secret</italic>. ๐ง
To use crypt, first set up the underlying remote. Follow the `rclone config` instructions for that specific backend.
Before configuring the crypt remote, check that the underlying remote is actually working. In this example the underlying remote is called <italic>remote</italic>. We're going to configure a path <italic>path</italic> within this remote to contain the encrypted content. Anything inside `remote:path` will be encrypted, and anything outside will not be. ๐ฆ
Configure crypt using `rclone config`. In this example the crypt remote is called <italic>secret</italic>, so we can tell it apart from the underlying remote.
When you're done, you can use the crypt remote named <italic>secret</italic> just like any other remote, e.g. `rclone copy D:\docs secret:\docs`, and rclone will encrypt and decrypt on the fly as needed. If you access the wrapped remote `remote:path` directly, you <bold>bypass the encryption</bold> โ anything you read will be in encrypted form, and anything you write will be unencrypted. To dodge all that mess, it's best to configure a dedicated path for encrypted content and access it <italic>exclusively</italic> through a crypt remote. ๐
No remotes found, make a new one? n) New remote s) Set configuration password q) Quit config n/s/q> n name> secret Type of storage to configure. Enter a string value. Press Enter for the default (""). Choose a number from below, or type in your own value [snip] XX / Encrypt/Decrypt a remote \ "crypt" [snip] Storage> crypt ** See help for crypt backend at: https://rclone.org/crypt/ **
Remote to encrypt/decrypt. Normally should contain a ':' and a path, eg "myremote:path/to/dir", "myremote:bucket" or maybe "myremote:" (not recommended). Enter a string value. Press Enter for the default (""). remote> remote:path How to encrypt the filenames. Enter a string value. Press Enter for the default ("standard"). Choose a number from below, or type in your own value. / Encrypt the filenames. 1 | See the docs for the details. \ "standard" 2 / Very simple filename obfuscation. \ "obfuscate" / Don't encrypt the file names. 3 | Adds a ".bin" extension only. \ "off" filename_encryption> Option to either encrypt directory names or leave them intact.
NB If filename_encryption is "off" then this option will do nothing. Enter a boolean value (true or false). Press Enter for the default ("true"). Choose a number from below, or type in your own value 1 / Encrypt directory names. \ "true" 2 / Don't encrypt directory names, leave them intact. \ "false" directory_name_encryption> Password or pass phrase for encryption. y) Yes type in my own password g) Generate random password y/g> y Enter the password: password: Confirm the password: password: Password or pass phrase for salt. Optional but recommended. Should be different to the previous password. y) Yes type in my own password g) Generate random password n) No leave this optional password blank (default) y/g/n> g Password strength in bits. 64 is just about memorable 128 is secure 1024 is the maximum Bits> 128 Your password is: JAsJvRcgR-_veXNfy_sGmQ Use this password? Please note that an obscured version of this password (and not the password itself) will be stored under your configuration file, so keep this generated password in a safe place. y) Yes (default) n) No y/n> Edit advanced config? (y/n) y) Yes n) No (default) y/n> Remote config
[secret] type = crypt remote = remote:path password = * ENCRYPTED * password2 = * ENCRYPTED *
y) Yes this is OK (default) e) Edit this remote d) Delete this remote y/e/d>
> <red>Important</red> ๐ The crypt password stored in `rclone.conf` is <italic>lightly obscured</italic>. That only protects it from cursory inspection. It is <bold>not secure</bold> unless configuration encryption (https://rclone.org/docs/#configuration-encryption) of `rclone.conf` is specified.
A long passphrase is recommended, or `rclone config` can generate a random one. ๐ฒ
The obscured password is created using `AES-CTR` with a static key. The `IV` (nonce) is stored verbatim at the beginning of the obscured password. This static key is shared between all versions of rclone. ๐
If you reconfigure rclone with the same passwords/passphrases somewhere else, it will be compatible โ but the obscured version will be different, because of the different salt. ๐ซ
**Rclone does not encrypt** ๐
- file length โ this can be calculated within `16 bytes`
- modification time โ used for syncing
---
### ๐ Specifying the remote ๐
When you're configuring the remote to encrypt/decrypt, you can specify <italic>any</italic> string that rclone accepts as a source/destination of other commands. ๐ซถ
The primary use case is specifying the path into an already configured remote (e.g. `remote:path/to/dir` or `remote:bucket`), so that data sitting in an untrusted location can be stored encrypted. ๐
You may also specify a local filesystem path, like `/path/to/dir` on Linux or `C:\path\to\dir` on Windows. Point a crypt remote at a local filesystem path and boom โ you can use rclone as a utility for <bold>pure local file encryption</bold>, for example keeping encrypted files on a removable USB drive. ๐ฅ
> **Note:** a string that doesn't contain a `:` will be treated by rclone as a relative path in the local filesystem. For example, if you enter the name `remote` without the trailing `:`, it'll be treated as a subdirectory of the current directory with the name `"remote"`. ๐ญ
If a path `remote:path/to/dir` is specified, rclone stores encrypted files in `path/to/dir` on the remote. With file name encryption, files saved to `secret:subdir/subfile` are stored in the unencrypted path `path/to/dir`, but the `subdir/subpath` element is encrypted. ๐
The path you specify does not have to exist โ rclone will create it when needed. โจ
If you intend to use the wrapped remote both directly for keeping unencrypted content <italic>and</italic> through a crypt remote for encrypted content, it's recommended to point the crypt remote at a separate directory within the wrapped remote. If you use a bucket-based storage system (e.g. `Swift`, `S3`, `Google Compute Storage`, `B2`), it's generally advisable to wrap the crypt remote around a specific bucket (`s3:bucket`). If you wrap it around the entire root of the storage (`s3:`) and use the optional file name encryption, rclone will encrypt the bucket name. ๐ชฃ๐
---
### ๐ Changing password ๐
If your password โ or the configuration file containing a lightly obscured form of that password โ gets compromised, you need to re-encrypt your data with a new password. And here's the thing, babes: since rclone uses secret-key encryption, where the encryption key is generated <italic>directly</italic> from the password kept on the client, it is <bold>not possible</bold> to change the password/key of already encrypted content. ๐ซ
Just changing the password configured for an existing crypt remote means you'll no longer be able to decrypt <italic>any</italic> of the previously encrypted content. ๐ญ The only possibility is to re-upload everything through a crypt remote configured with your new password.
Depending on the size of your data, your bandwidth, storage quota, etc., there are different approaches you can take: ๐ง
- If you have everything in a different location โ for example on your local system โ you could remove all of the prior encrypted files, change the password for your configured crypt remote (or delete and re-create the crypt configuration), and then re-upload everything from the alternative location. ๐ฆ
- If you have enough space on the storage system you can create a new crypt remote pointing to a separate directory on the same backend, and then use rclone to copy everything from the original crypt remote to the new, effectively decrypting everything on the fly using the old password and re-encrypting using the new password. When done, delete the original crypt remote directory and finally the rclone crypt configuration with the old password. All data will be streamed from the storage system and back, so you will get half the bandwidth and be charged twice if you have upload and download quota on the storage system.
> **Note, bestie, read this one:** a security problem related to the random password generator was fixed in rclone version `1.53.3` (released `2020-11-19`). Passwords generated by `rclone config` in version `1.49.0` (released `2019-08-26`) to `1.53.2` (released `2020-10-26`) are **not considered secure** and should be changed. If you made up your own password, or used rclone version older than `1.49.0` or newer than `1.53.2` to generate it, you are not affected by this issue. See issue #4783 (`https://github.com/rclone/rclone/issues/4783`) for more details, and a tool you can use to check if you are affected.
---
### โจ Example โจ
Okay so create the following file structure using "standard" file name encryption:
plaintext/ โโโ file0.txt โโโ file1.txt โโโ subdir โโโ file2.txt โโโ file3.txt โโโ subsubdir โโโ file4.txt
Copy these to the remote, and list them:
$ rclone -q copy plaintext secret: $ rclone -q ls secret: 7 file1.txt 6 file0.txt 8 subdir/file2.txt 10 subdir/subsubdir/file4.txt 9 subdir/file3.txt
The crypt remote looks like:
$ rclone -q ls remote:path 55 hagjclgavj2mbiqm6u6cnjjqcg 54 v05749mltvv1tf4onltun46gls 57 86vhrsv86mpbtd3a0akjuqslj8/dlj7fkq4kdq72emafg7a7s41uo 58 86vhrsv86mpbtd3a0akjuqslj8/7uu829995du6o42n32otfhjqp4/b9pausrfansjth5ob3jkdqd4lc 56 86vhrsv86mpbtd3a0akjuqslj8/8njh1sk437gttmep3p70g81aps
The directory structure is preserved ๐
:
$ rclone -q ls secret:subdir 8 file2.txt 9 file3.txt 10 subsubdir/file4.txt
Without file name encryption `.bin` extensions are added to underlying names. This prevents the cloud provider attempting to interpret file content.
$ rclone -q ls remote:path 54 file0.txt.bin 57 subdir/file3.txt.bin 56 subdir/file2.txt.bin 58 subdir/subsubdir/file4.txt.bin 55 file1.txt.bin
---
### ๐ฆ File name encryption modes ๐ฆ
**Off**
- doesn't hide file names or directory structure
- allows for longer file names (~246 characters)
- can use sub paths and copy single files
**Standard**
- file names encrypted
- file names can't be as long (~143 characters)
- can use sub paths and copy single files
- directory structure visible
- identical files names will have identical uploaded names
- can use shortcuts to shorten the directory recursion
**Obfuscation**
This is a simple "rotate" of the filename, with each file having a rot distance based on the filename. Rclone stores the distance at the beginning of the filename. A file called "hello" may become "53.jgnnq".
Obfuscation is **not** a strong encryption of filenames, but hinders automated scanning tools picking up on filename patterns. It is an intermediate between "off" and "standard" which allows for longer path segment names.
There is a possibility with some unicode based filenames that the obfuscation is weak and may map lower case characters to upper case equivalents.
Obfuscation cannot be relied upon for strong protection.
- file names very lightly obfuscated
- file names can be longer than standard encryption
- can use sub paths and copy single files
- directory structure visible
- identical files names will have identical uploaded names
Cloud storage systems have limits on file name length and total path length which rclone is more likely to breach using "Standard" file name encryption. Where file names are 143 or fewer characters in length issues should not be encountered, irrespective of cloud storage provider.
An experimental advanced option `filename_encoding` is now provided to address this problem to a certain degree. For cloud storage systems with case sensitive file names (e.g. Google Drive), `base64` can be used to reduce file name length. For cloud storage systems using UTF-16 to store file names internally (e.g. OneDrive, Dropbox, Box), `base32768` can be used to drastically reduce file name length.
An alternative, future rclone file name encryption mode may tolerate backend provider path length limits.
---
### ๐ Directory name encryption ๐
Crypt offers the option of encrypting dir names or leaving them intact. There are two options:
**True**
Encrypts the whole file path including directory names Example: `1/12/123.txt` is encrypted to `p0e52nreeaj0a5ea7s64m4j72s/l42g6771hnv3an9cgc8cr2n1ng/qgm4avr35m5loi1th53ato71v0`
**False**
Only encrypts file names, skips directory names Example: `1/12/123.txt` is encrypted to `1/12/qgm4avr35m5loi1th53ato71v0`
---
### ๐ Modification times and hashes ๐
Crypt stores modification times using the underlying remote so support depends on that.
Hashes are **not** stored for crypt. However the data integrity is protected by an extremely strong crypto authenticator.
Use the `rclone cryptcheck` command to check the integrity of an encrypted remote instead of `rclone check` which can't check the checksums properly.
---
### ๐ Standard options ๐
Here are the Standard options specific to crypt (Encrypt/Decrypt a remote).
- **`--crypt-remote`** โ Remote to encrypt/decrypt. Normally should contain a `':'` and a path, e.g. `"myremote:path/to/dir"`, `"myremote:bucket"` or maybe `"myremote:"` (not recommended).
- **Config:** `remote`
- **Env Var:** `RCLONE_CRYPT_REMOTE`
- **Type:** `string`
- **Required:** `true`
- **`--crypt-filename-encryption`** โ How to encrypt the filenames.
- **Config:** `filename_encryption`
- **Env Var:** `RCLONE_CRYPT_FILENAME_ENCRYPTION`
- **Type:** `string`
- **Default:** `"standard"`
- **Examples:**
- `"standard"`
- Encrypt the filenames.
- See the docs for the details.
- `"obfuscate"`
- Very simple filename obfuscation.
- `"off"`
- Don't encrypt the file names.
- Adds a `".bin"`, or `"suffix"` extension only.
- **`--crypt-directory-name-encryption`** โ Option to either encrypt directory names or leave them intact. **NB** If `filename_encryption` is `"off"` then this option will do nothing.
- **Config:** `directory_name_encryption`
- **Env Var:** `RCLONE_CRYPT_DIRECTORY_NAME_ENCRYPTION`
- **Type:** `bool`
- **Default:** `true`
- **Examples:**
- `"true"`
- Encrypt directory names.
- `"false"`
- Don't encrypt directory names, leave them intact.
- **`--crypt-password`** โ Password or pass phrase for encryption. **NB** Input to this must be obscured โ see `rclone obscure` (`https://rclone.org/commands/rclone_obscure/`).
- **Config:** `password`
- **Env Var:** `RCLONE_CRYPT_PASSWORD`
- **Type:** `string`
- **Required:** `true`
- **`--crypt-password2`** โ Password or pass phrase for salt. Optional but recommended. Should be different to the previous password. **NB** Input to this must be obscured โ see `rclone obscure` (`https://rclone.org/commands/rclone_obscure/`).
- **Config:** `password2`
- **Env Var:** `RCLONE_CRYPT_PASSWORD2`
- **Type:** `string`
- **Required:** `false`
---
### ๐ Advanced options ๐
Here are the Advanced options specific to crypt (Encrypt/Decrypt a remote).
- **`--crypt-server-side-across-configs`** โ **Deprecated: use `--server-side-across-configs` instead.** Allow server-side operations (e.g. `copy`) to work across different crypt configs. Normally this option is not what you want, but if you have two crypts pointing to the same backend you can use it. This can be used, for example, to change file name encryption type without re-uploading all the data. Just make two crypt backends pointing to two different directories with the single changed parameter and use `rclone move` to move the files between the crypt remotes.
- **Config:** `server_side_across_configs`
- **Env Var:** `RCLONE_CRYPT_SERVER_SIDE_ACROSS_CONFIGS`
- **Type:** `bool`
- **Default:** `false`
- **`--crypt-show-mapping`** โ For all files listed show how the names encrypt. If this flag is set then for each file that the remote is asked to list, it will log (at level `INFO`) a line stating the decrypted file name and the encrypted file name. This is so you can work out which encrypted names are which decrypted names just in case you need to do something with the encrypted file names, or for debugging purposes.
- **Config:** `show_mapping`
- **Env Var:** `RCLONE_CRYPT_SHOW_MAPPING`
- **Type:** `bool`
- **Default:** `false`
- **`--crypt-no-data-encryption`** โ Option to either encrypt file data or leave it unencrypted.
- **Config:** `no_data_encryption`
- **Env Var:** `RCLONE_CRYPT_NO_DATA_ENCRYPTION`
- **Type:** `bool`
- **Default:** `false`
- **Examples:**
- `"true"`
- Don't encrypt file data, leave it unencrypted.
- `"false"`
- Encrypt file data.
- **`--crypt-pass-bad-blocks`** โ If set this will pass bad blocks through as all 0. This should **not** be set in normal operation, it should only be set if trying to recover an encrypted file with errors and it is desired to recover as much of the file as possible.
- **Config:** `pass_bad_blocks`
- **Env Var:** `RCLONE_CRYPT_PASS_BAD_BLOCKS`
- **Type:** `bool`
- **Default:** `false`
- **`--crypt-strict-names`** โ If set, this will raise an error when crypt comes across a filename that can't be decrypted. (By default, rclone will just log a `NOTICE` and continue as normal.) This can happen if encrypted and unencrypted files are stored in the same directory (which is not recommended.) It may also indicate a more serious problem that should be investigated.
- **Config:** `strict_names`
- **Env Var:** `RCLONE_CRYPT_STRICT_NAMES`
- **Type:** `bool`
- **Default:** `false`
- **`--crypt-filename-encoding`** โ How to encode the encrypted filename to text string.
description. It's giving "let me pick the encoding that fits your remote's whole vibe":
<pink>**Properties:**</pink>
- **Config:** `filename_encoding`
- **Env Var:** `RCLONE_CRYPT_FILENAME_ENCODING`
- **Type:** `string`
- **Default:** `"base32"`
- **Examples:**
- `"base32"`
- Encode using base32. Suitable for all remote. ๐ฏ
- `"base64"`
- Encode using base64. Suitable for case sensitive remote.
- `"base32768"`
- Encode using base32768. Suitable if your remote counts UTF-16 or
- Unicode codepoint instead of UTF-8 byte length. (Eg. Onedrive, Dropbox)
---
- **`--crypt-suffix`** โ okay so if you set this, it <hotpink>overrides</hotpink> the default suffix of `".bin"`. And bestie, setting suffix to `"none"` gives you an empty suffix, which is genuinely useful when your path length is hanging on by a thread. ๐ญ
<pink>**Properties:**</pink>
- **Config:** `suffix`
- **Env Var:** `RCLONE_CRYPT_SUFFIX`
- **Type:** `string`
- **Default:** `".bin"`
- **`--crypt-description`** โ just a lil description of the remote, no biggie. ๐
<pink>**Properties:**</pink>
- **Config:** `description`
- **Env Var:** `RCLONE_CRYPT_DESCRIPTION`
- **Type:** `string`
- **Required:** false
---
### ๐ฆ Metadata
Any metadata supported by the underlying remote is read and written. Slay.
See the metadata (`https://rclone.org/docs/#metadata`) docs for more info. iykyk.
---
### โจ Backend commands
Here are the commands specific to the crypt backend. Not me having commandsss ๐
Run them with:
rclone backend COMMAND remote:
The help below will explain what arguments each command takes.
See the backend (`https://rclone.org/commands/rclone_backend/`) command for more info on how to pass options and arguments.
These can be run on a running backend using the rc command backend/command (`https://rclone.org/rc/#backend-command`).
---
### ๐ง encode
Encode the given filename(s). iconic.
rclone backend encode remote: [options] [<arguments>+]
This encodes the filenames given as arguments returning a list of strings of the encoded results. periodt.
Usage examples:
rclone backend encode crypt: file1 [file2...] rclone rc backend/command command=encode fs=crypt: file1 [file2...]
---
### ๐ธ decode
Decode the given filename(s). reverse uno card ๐ซถ
rclone backend decode remote: [options] [<arguments>+]
This decodes the filenames given as arguments returning a list of strings of the decoded results. It will return an error if any of the inputs are invalid. yes bestie, it checks. โ ๏ธ
Usage examples:
rclone backend decode crypt: encryptedfile1 [encryptedfile2...] rclone rc backend/command command=decode fs=crypt: encryptedfile1 [encryptedfile2...]
---
### ๐ Backing up an encrypted remote
So if you wanna backup an encrypted remote, the recommendation is fr fr to use `rclone sync` **on the encrypted files**, and make sure the passwords are the <rainbow>same</rainbow> in the new encrypted remote. Don't skip that part bestie, it matters.
This is gonna have the following advantages ๐
- `rclone sync` will check the checksums while copying
- you can use `rclone check` between the encrypted remotes
- you don't decrypt and encrypt unnecessarily (which is giving wasteful, not giving efficient)
For example, let's say you have your original remote at `remote:` with the encrypted version at `eremote:` with path `remote:crypt`. You would then set up the new remote `remote2:` and then the encrypted version `eremote2:` with path `remote2:crypt` using the same passwords as `eremote:`. ๐
To sync the two remotes you would do
rclone sync --interactive remote:crypt remote2:crypt
And to check the integrity you would do
rclone check remote:crypt remote2:crypt
---
### ๐ File formats
### ๐ฅ File encryption
Files are encrypted 1:1 source file to destination object. The file has a header and is divided into chunks. So clean.
### ๐ Header
- 8 bytes magic string `RCLONE\x00\x00`
- 24 bytes Nonce (IV)
The initial nonce is generated from the operating systems crypto strong random number generator. The nonce is incremented for each chunk read making sure each nonce is unique for each block written. The chance of a nonce being reused is minuscule. If you wrote an exabyte of data (10ยนโธ bytes) you would have a probability of approximately 2ร10โปยณยฒ of reusing a nonce. math girlies stand up ๐โจ
### โญ Chunk
Each chunk will contain 64 KiB of data, except for the last one which may have less data. The data chunk is in standard NaCl SecretBox format. SecretBox uses XSalsa20 and Poly1305 to encrypt and authenticate messages.
Each chunk contains:
- 16 Bytes of Poly1305 authenticator
- 1 - 65536 bytes XSalsa20 encrypted data
64k chunk size was chosen as the best performing chunk size (the authenticator takes too much time below this and the performance drops off due to cache effects above this). Note that these chunks are buffered in memory so they can't be too big.
This uses a 32 byte (256 bit key) key derived from the user password.
### ๐ Examples
1 byte file will encrypt to
- 32 bytes header
- 17 bytes data chunk
49 bytes total
1 MiB (1048576 bytes) file will encrypt to
- 32 bytes header
- 16 chunks of 65552 bytes
1048864 bytes total (a 0.03% overhead). This is the overhead for big files.
### ๐ฆ Name encryption
File names are encrypted segment by segment - the path is broken up into `/` separated strings and these are encrypted individually.
File segments are padded using PKCS#7 to a multiple of 16 bytes before encryption.
They are then encrypted with EME using AES with 256 bit key. EME (ECB-Mix-ECB) is a wide-block encryption mode presented in the 2003 paper "A Parallelizable Enciphering Mode" by Halevi and Rogaway. very demure, very scholarly ๐
This makes for deterministic encryption which is what we want - the same filename must encrypt to the same thing otherwise we can't find it on the cloud storage system.
This means that
- filenames with the same name will encrypt the same
- filenames which start the same won't have a common prefix
A version string of the form `-vYYYY-MM-DD-HHMMSS-NNN` on the end of a file name (as added by `--b2-versions` / `--s3-versions`) is left in plain text so that versioned files can be found. Directory names are encrypted in full. Rclone before v1.76 left such a suffix in plain text on directory names too, so a directory named like this created by an older rclone will appear in listings with a warning but can't be opened or removed until renamed on the underlying remote to the name given in the warning. ๐ noted, bestie, don't panic.
This uses a 32 byte key (256 bits) and a 16 byte (128 bits) IV both of which are derived from the user password.
After encryption they are written out using a modified version of standard base32 encoding as described in RFC4648. The standard encoding is modified in two ways:
- it becomes lower case (no-one likes upper case filenames!)
- we strip the padding character `=`
base32 is used rather than the more efficient base64 so rclone can be used on case insensitive remotes (e.g. Windows, Box, Dropbox, Onedrive etc). lowercase girlie behavior fr fr ๐
### ๐ธ Key derivation
Rclone uses scrypt with parameters `N=16384`, `r=8`, `p=1` with an optional user supplied salt (password2) to derive the `32+32+16 = 80` bytes of key material required. If the user doesn't supply a salt then rclone uses an internal one.
scrypt makes it impractical to mount a dictionary attack on rclone encrypted data. For full protection against this you should always use a salt. <hotpink>always</hotpink>, bestie. ๐ซถ
---
### ๐ See Also
- rclone cryptdecode (`https://rclone.org/commands/rclone_cryptdecode/`) - Show forward/reverse mapping of encrypted filenames.
# โจ Compress ๐
## ๐จ Warning ๐จ
> <red>This remote is currently experimental. Things may break and data may be lost. Anything you do with this remote is at your own risk. Please understand the risks associated with using experimental code and don't use this remote in critical applications.</red>
Okay bestie, serious talk first: the Compress remote slaps a whole compression layer onto another remote, and it's <hotpink>iconic</hotpink> when you've got remotes stuffed with big files that compress real nice. It is <red>best used with remotes containing many large compressible files</red> โ know that. โจ
---
## ๐ ๏ธ Configuration
Using this one is literally so easy? All you gotta do is point at another remote and pick a compression mode. Like this:
$ rclone config Current remotes:
Name Type ==== ==== remote_to_press sometype
e) Edit existing remote n) New remote d) Delete remote r) Rename remote c) Copy remote s) Set configuration password q) Quit config e/n/d/r/c/s/q> n name> compress
Option Storage. Type of storage to configure. Choose a number from below, or type in your own value. ... 12 / Compress a remote \ (compress) ... Storage> compress
Option remote. Remote to compress. Enter a value. remote> remote_to_press:subdir
Option mode. Compression mode. Choose a number from below, or type in your own value of type string. Press Enter for the default (gzip). 1 / Standard gzip compression with fastest parameters. \ (gzip) 2 / Zstandard compression โ fast modern algorithm offering adjustable speed-to-compression tradeoffs. \ (zstd) mode> gzip
Option level. GZIP (levels -2 to 9):
- -2 โ Huffman encoding only. Only use if you know what you're doing.
- -1 (default) โ recommended; equivalent to level 5.
- 0 โ turns off compression.
- 1โ9 โ increase compression at the cost of speed. Going past 6 generally offers very little return.
ZSTD (levels 0 to 4):
- 0 โ turns off compression entirely.
- 1 โ fastest compression with the lowest ratio.
- 2 (default) โ good balance of speed and compression.
- 3 โ better compression, but uses about 2โ3x more CPU than the default.
- 4 โ best possible compression ratio (highest CPU cost).
Notes:
- Choose GZIP for wide compatibility; ZSTD for better speed/ratio tradeoffs.
- Negative gzip levels: -2 = Huffman-only, -1 = default (โ level 5). Enter a value. level> -1
Edit advanced config? y) Yes n) No (default) y/n> n
Configuration complete. Options:
- type: compress
- remote: remote_to_press:subdir
- mode: gzip
- level: -1 Keep this "compress" remote? y) Yes this is OK (default) e) Edit this remote d) Delete this remote y/e/d> y
---
## ๐๏ธ Compression Algorithms
- **GZIP** โ the tried-and-true <green>OG</green> algorithm, well-established and widely adopted, and it strikes a solid balance between compression speed and ratio. It supports compression levels from `-2` to `9`, and the default `-1` (roughly equivalent to level 5) offers an effective middle ground for most scenarios. ๐ซถ
- **Zstandard (zstd)** โ a modern, high-performance algorithm that gives you <purple>precise control</purple> over the trade-off between speed and compression efficiency. Compression levels range from `0` (no compression) to `4` (maximum compression). ๐ฆ
---
## ๐ File types
Open a remote wrapped by compress and you'll see... so many files, each with an extension matching whatever compression algorithm you picked. These are standard files that various archive programs can open just fine, but they've also got some <lavender>hidden metadata</lavender> that lets rclone use them. You can download and decompress these files whenever you want, no cap โ BUT: <red>do not manually delete or rename files</red>. Files without correct metadata will not be recognized by rclone. ๐
---
## ๐ท๏ธ File names
The compressed files get named `*.###########.gz` where `*` is the base file and the `#` part is the base64 encoded size of the uncompressed file. And bestie, listen: <hotpink>the file names should not be changed by anything other than the rclone compression backend</hotpink>. Hands off, okay? ๐
---
## โ๏ธ Standard options
Here are the Standard options specific to compress (Compress a remote). โจ
- **`--compress-remote`** โ Remote to compress.
Properties:
- Config: `remote`
- Env Var: `RCLONE_COMPRESS_REMOTE`
- Type: `string`
- Required: `true`
- **`--compress-mode`** โ Compression mode.
Properties:
- Config: `mode`
- Env Var: `RCLONE_COMPRESS_MODE`
- Type: `string`
- Default: `"gzip"`
- Examples:
- `"gzip"`
- Standard gzip compression with fastest parameters.
- `"zstd"`
- Zstandard compression โ fast modern algorithm offering adjustable speed-to-compression tradeoffs.
- **`--compress-level`** โ
GZIP (levels -2 to 9): - -2 โ Huffman encoding only. Only use if you know what you're doing. - -1 (default) โ recommended; equivalent to level 5. - 0 โ turns off compression. - 1โ9 โ increase compression at the cost of speed. Going past 6 generally offers very little return.
ZSTD (levels 0 to 4): - 0 โ turns off compression entirely. - 1 โ fastest compression with the lowest ratio. - 2 (default) โ good balance of speed and compression. - 3 โ better compression, but uses about 2โ3x more CPU than the default. - 4 โ best possible compression ratio (highest CPU cost).
Notes: - Choose GZIP for wide compatibility; ZSTD for better speed/ratio tradeoffs. - Negative gzip levels: -2 = Huffman-only, -1 = default (โ level 5).
Properties:
- Config: `level`
- Env Var: `RCLONE_COMPRESS_LEVEL`
- Type: `string`
- Required: `true`
---
## ๐ Advanced options
Here are the Advanced options specific to compress (Compress a remote). ๐
- **`--compress-ram-cache-limit`** โ Some remotes don't allow the upload of files with unknown size. In this case the compressed file will need to be cached to determine it's size.
Files smaller than this limit will be cached in RAM, files larger than this limit will be cached on disk.
Properties:
- Config: `ram_cache_limit`
- Env Var: `RCLONE_COMPRESS_RAM_CACHE_LIMIT`
- Type: `SizeSuffix`
- Default: `20Mi`
- **`--compress-description`** โ Description of the remote.
Properties:
- Config: `description`
- Env Var: `RCLONE_COMPRESS_DESCRIPTION`
- Type: `string`
- Required: `false`
---
## ๐ Metadata
Any metadata supported by the underlying remote is read and written. ๐ธ
See the metadata (https://rclone.org/docs/#metadata) docs for more info. ๐
## ๐ฆ Combine ๐ฆ
Okay so the <purple>combine</purple> backend is literally the friend-group of backends โ it takes a bunch of remotes and smushes them together into one single directory tree. Bestie, it's giving "found family" ๐ซถ
So like, say you've got a remote for images on one provider:
$ rclone tree s3:imagesbucket / โโโ image1.jpg โโโ image2.jpg
And a remote for files on another:
$ rclone tree drive:important/files / โโโ file1.txt โโโ file2.txt
The combine backend can join these together into a synthetic directory structure like this:
$ rclone tree combined: / โโโ files โ โโโ file1.txt โ โโโ file2.txt โโโ images โโโ image1.jpg โโโ image2.jpg
You'd do this by specifying an `upstreams` parameter in the config like this
upstreams = images=s3:imagesbucket files=drive:important/files
During the initial setup with `rclone config` you will specify the upstreams remotes as a space separated list. The upstream remotes can either be a local paths or other remotes. โจ
### ๐ Configuration ๐
Here is an example of how to make a combine called remote for the example above. First run:
rclone config
This will guide you through an interactive setup process:
No remotes found, make a new one? n) New remote s) Set configuration password q) Quit config n/s/q> n name> remote Option Storage. Type of storage to configure. Choose a number from below, or type in your own value. ... XX / Combine several remotes into one \ (combine) ... Storage> combine Option upstreams. Upstreams for combining These should be in the form dir=remote:path dir2=remote2:path Where before the = is specified the root directory and after is the remote to put there. Embedded spaces can be added using quotes "dir=remote:path with space" "dir2=remote2:path with space" Enter a fs.SpaceSepList value. upstreams> images=s3:imagesbucket files=drive:important/files Configuration complete. Options:
- type: combine
- upstreams: images=s3:imagesbucket files=drive:important/files Keep this "remote" remote? y) Yes this is OK (default) e) Edit this remote d) Delete this remote y/e/d> y
### ๐ Configuring for Google Drive Shared Drives ๐
Rclone has a convenience feature for making a combine backend for all the shared drives you have access to. Obsessed, honestly ๐
Assuming your main (non shared drive) Google drive remote is called `drive:` you would run
rclone backend -o config drives drive:
This would produce something like this:
[My Drive] type = alias remote = drive,team_drive=0ABCDEF-01234567890,root_folder_id=:
[Test Drive] type = alias remote = drive,team_drive=0ABCDEFabcdefghijkl,root_folder_id=:
[AllDrives] type = combine upstreams = "My Drive=My Drive:" "Test Drive=Test Drive:"
If you then add that config to your config file (find it with `rclone config file`) then you can access all the shared drives in one place with the `AllDrives:` remote.
See the Google Drive docs (https://rclone.org/drive/#drives) for full info.
### โญ Standard options โญ
Here are the Standard options specific to combine (Combine several remotes into one).
#### <cyan>`--combine-upstreams`</cyan>
Upstreams for combining. ๐ซถ
These should be in the form
dir=remote:path dir2=remote2:path
Where before the `=` is specified the root directory and after is the remote to put there.
Embedded spaces can be added using quotes
"dir=remote:path with space" "dir2=remote2:path with space"
Properties:
- **Config:** `upstreams`
- **Env Var:** `RCLONE_COMBINE_UPSTREAMS`
- **Type:** `SpaceSepList`
- **Default:**
### ๐ฅ Advanced options ๐ฅ
Here are the Advanced options specific to combine (Combine several remotes into one).
#### <cyan>`--combine-description`</cyan>
Description of the remote. โจ
Properties:
- **Config:** `description`
- **Env Var:** `RCLONE_COMBINE_DESCRIPTION`
- **Type:** `string`
- **Required:** `false`
### ๐ง Metadata ๐ง
Any metadata supported by the underlying remote is read and written.
See the metadata (https://rclone.org/docs/#metadata) docs for more info.
---
## ๐ DOI ๐
The DOI remote is a <hotpink>read only</hotpink> remote for reading files from digital object identifiers (DOI).
Currently, the DOI backend supports DOIs hosted with:
- InvenioRDM (https://inveniosoftware.org/products/rdm/)
- Zenodo (https://zenodo.org)
- CaltechDATA (https://data.caltech.edu)
- Other InvenioRDM repositories (https://inveniosoftware.org/showcase/)
- Dataverse (https://dataverse.org)
- Harvard Dataverse (https://dataverse.harvard.edu)
- Other Dataverse repositories (https://dataverse.org/installations)
Paths are specified as `remote:path`
Paths may be as deep as required, e.g. `remote:directory/subdirectory`. ๐ฆ
### ๐ Configuration ๐
Here is an example of how to make a remote called remote. First run:
rclone config
This will guide you through an interactive setup process:
No remotes found, make a new one? n) New remote s) Set configuration password q) Quit config n/s/q> n Enter name for new remote. name> remote Type of storage to configure. Choose a number from below, or type in your own value [snip] XX / DOI datasets \ (doi) [snip] Storage> doi Option doi. The DOI or the doi.org URL. Enter a value. doi> 10.5281/zenodo.5876941 Edit advanced config? y) Yes n) No (default) y/n> n Configuration complete. Options:
- type: doi
- doi: 10.5281/zenodo.5876941 Keep this "remote" remote? y) Yes this is OK (default) e) Edit this remote d) Delete this remote y/e/d> y
### โญ Standard options โญ
Here are the Standard options specific to doi (DOI datasets).
#### <cyan>`--doi-doi`</cyan>
The DOI or the doi.org URL.
Properties:
- **Config:** `doi`
- **Env Var:** `RCLONE_DOI_DOI`
- **Type:** `string`
- **Required:** `true`
### ๐ฅ Advanced options ๐ฅ
Here are the Advanced options specific to doi (DOI datasets).
#### <cyan>`--doi-provider`</cyan>
DOI provider.
The DOI provider can be set when rclone does not automatically recognize a supported DOI provider.
Properties:
- **Config:** `provider`
- **Env Var:** `RCLONE_DOI_PROVIDER`
- **Type:** `string`
- **Required:** `false`
- **Examples:**
- `"auto"`
- Auto-detect provider
- `"zenodo"`
- Zenodo
- `"dataverse"`
- Dataverse
- `"invenio"`
- Invenio
#### <cyan>`--doi-doi-resolver-api-url`</cyan>
The URL of the DOI resolver API to use.
The DOI resolver can be set for testing or for cases when the canonical DOI resolver API cannot be used.
Defaults to `"https://doi.org/api"`.
Properties:
- **Config:** `doi_resolver_api_url`
- **Env Var:** `RCLONE_DOI_DOI_RESOLVER_API_URL`
- **Type:** `string`
- **Required:** `false`
#### <cyan>`--doi-description`</cyan>
Description of the remote.
Properties:
- **Config:** `description`
- **Env Var:** `RCLONE_DOI_DESCRIPTION`
- **Type:** `string`
- **Required:** `false`
### ๐ Backend commands ๐
Here are the commands specific to the doi backend.
Run them with:
rclone backend COMMAND remote:
The help below will explain what arguments each command takes.
See the backend (https://rclone.org/commands/rclone_backend/) command for more info on how to pass options and arguments.
These can be run on a running backend using the rc command backend/command (https://rclone.org/rc/#backend-command).
#### <mint>`metadata`</mint>
Show metadata about the DOI.
rclone backend metadata remote: [options] [<arguments>+]
This command returns a JSON object with some information about the DOI.
Usage example:
rclone backend metadata doi:
It returns a JSON object representing metadata about the DOI. ๐
#### <mint>`set`</mint>
Set command for updating the config parameters.
rclone backend set remote: [options] [<arguments>+]
This set command can be used to update the config parameters for a running doi backend.
Usage examples:
rclone backend set doi: [-o opt_name=opt_value] [-o opt_name2=opt_value2] rclone rc backend/command command=set fs=doi: [-o opt_name=opt_value] [-o opt_name2=opt_value2] rclone rc backend/command command=set fs=doi: -o doi=NEW_DOI
The option keys are named as they are in the config file.
This rebuilds the connection to the doi backend when it is called with the new parameters. Only new parameters need be passed as the values will default to those currently in use.
It doesn't return anything. ๐
# ๐ฆ Drime ๐ฆ
<pink>Drime</pink> (<blue>https://drime.cloud/</blue>) is a cloud storage and transfer service that is *lowkey obsessed* with fast, resilient file delivery. It's giving both free and paid tiers, and the whole vibe is high-speed uploads plus link sharing. ๐
To set up Drime you gotta log in, navigate to <purple>Settings</purple> โ <purple>Developer</purple>, and create a token that you'll use as your API access key. Give it a sensible name bestie, then copy that token for use in your config. ๐
---
## ๐ Configuration ๐
Here's a run-through of `rclone config` to make a remote called `remote`.
First off, run this:
rclone config
Then just follow the interactive setup, no thoughts head empty, it literally walks you through it:
No remotes found, make a new one? n) New remote s) Set configuration password q) Quit config n/s/q> n
Enter name for new remote. name> remote
Option Storage. Type of storage to configure. Choose a number from below, or type in your own value. XX / Drime \ (drime) Storage> drime
Option access_token. API Access token You can get this from the web control panel. Enter a value. Press Enter to leave empty. access_token> YOUR_API_ACCESS_TOKEN
Edit advanced config? y) Yes n) No (default) y/n> n
Configuration complete. Options:
- type: drime
- access_token: YOUR_API_ACCESS_TOKEN Keep this "remote" remote? y) Yes this is OK (default) e) Edit this remote d) Delete this remote y/e/d> y
Once it's configured you can use `rclone` like this (swap `remote` out for whatever name you gave your remote โจ):
List the directories and files chillin' at the top level of your Drime:
rclone lsf remote:
To copy a local directory to a Drime directory called `backup`:
rclone copy /home/source remote:backup
---
## โฐ Modification times and hashes โฐ
Okay so, Drime <red>does not support modification times or hashes</red>. Not a single one. ๐ญ
Which means by default your syncs will only look at the **size** of the file to figure out if it needs updating. That's it. That's the whole vibe check.
You *can* use the `--update` flag, which will use the time the object was uploaded instead. For many operations this is genuinely sufficient to tell if something has changed. **But** โ and this is the important part โ files created with timestamps in the past will be **missed** by the sync if you're using `--update`. So watch out bestie. ๐
---
## ๐ซ Restricted filename characters ๐ซ
On top of the <purple>default restricted characters set</purple> (<blue>https://rclone.org/overview/#restricted-characters</blue>) these characters also get replaced:
- `\` โ value `0x5C` โ replaced with `๏ผผ`
File names also can't **start** or **end** with these characters. They only get swapped out if they're the first or last character in the name:
- `SP` โ value `0x20` โ replaced with `โ `
Invalid UTF-8 bytes will also be replaced (<blue>https://rclone.org/overview/#invalid-utf8</blue>), because no cap they literally cannot be used in JSON strings. ๐ซ
---
## ๐ฑ Root folder ID ๐ฑ
You can set the `root_folder_id` for rclone. This is the directory (identified by its **Folder ID**) that rclone will consider to be the root of your Drime drive.
Normally you just leave this blank and let rclone figure out the correct root itself, and it'll fill in the value in the config file. Main character energy, honestly. ๐
But if you *want*, you can set this to restrict rclone to a specific folder hierarchy.
To do that you'll have to find the **Folder ID** of the directory you want rclone to display.
You can do it with rclone, like so:
$ rclone lsf -Fip --dirs-only remote: d6341f53-ee65-4f29-9f59-d11e8070b2a0;Files/ f4f5c9b8-6ece-478b-b03e-4538edfe5a1c;Photos/ d50e356c-29ca-4b27-a3a7-494d91026e04;Videos/
The ID you want is the part **before** the `;`, so you could set:
root_folder_id = d6341f53-ee65-4f29-9f59-d11e8070b2a0
โฆto lock rclone onto the `Files` directory. ๐ฏ
---
## โจ Standard options โจ
Here are the Standard options specific to `drime` (Drime).
- **`--drime-access-token`** โ API Access token
You can get this from the web control panel.
Properties:
- Config: `access_token`
- Env Var: `RCLONE_DRIME_ACCESS_TOKEN`
- Type: `string`
- Required: `false`
---
## ๐ฅ Advanced options ๐ฅ
Here are the Advanced options specific to `drime` (Drime).
- **`--drime-root-folder-id`** โ ID of the root folder
Leave this blank normally, rclone will fill it in automatically.
If you want rclone to be restricted to a particular folder you can fill it in โ see the docs for more info.
Properties:
- Config: `root_folder_id`
- Env Var: `RCLONE_DRIME_ROOT_FOLDER_ID`
- Type: `string`
- Required: `false`
- **`--drime-workspace-id`** โ Account ID
Leave this blank normally unless you wish to specify a Workspace ID.
Properties:
- Config: `workspace_id`
- Env Var: `RCLONE_DRIME_WORKSPACE_ID`
- Type: `string`
- Required: `false`
- **`--drime-list-chunk`** โ Number of items to list in each call
Properties:
- Config: `list_chunk`
- Env Var: `RCLONE_DRIME_LIST_CHUNK`
- Type: `int`
- Default: `1000`
- **`--drime-hard-delete`** โ Delete files permanently rather than putting them into the trash.
Properties:
- Config: `hard_delete`
- Env Var: `RCLONE_DRIME_HARD_DELETE`
- Type: `bool`
- Default: `false`
- **`--drime-upload-cutoff`** โ Cutoff for switching to chunked upload.
Any files larger than this will be uploaded in chunks of `chunk_size`. The minimum is `0` and the maximum is `5 GiB`.
Properties:
- Config: `upload_cutoff`
- Env Var: `RCLONE_DRIME_UPLOAD_CUTOFF`
- Type: `SizeSuffix`
- Default: `5Mi`
- **`--drime-chunk-size`** โ Chunk size to use for uploading.
When uploading files larger than `upload_cutoff` or files with unknown size (e.g. from "rclone rcat" or uploaded with "rclone mount" or google photos or google docs) they will be uploaded as multipart uploads using this chunk size.
Note that `--drime-upload-concurrency` chunks of this size are buffered in memory per transfer.
If you are transferring large files over high-speed links and you have enough memory, then increasing this will speed up the transfers.
Rclone will automatically increase the chunk size when uploading a large file of known size to stay below the 10,000 chunks limit.
Files of unknown size are uploaded with the configured `chunk_size`. Since the default chunk size is `5 MiB` and there can be at most 10,000 chunks, this means that by default the maximum size of a file you can stream upload is `48 GiB`. If you wish to stream upload larger files then you will need to increase `chunk_size`.
Properties:
- Config: `chunk_size`
- Env Var: `RCLONE_DRIME_CHUNK_SIZE`
- Type: `SizeSuffix`
- Default: `5Mi`
- **`--drime-upload-concurrency`** โ Concurrency for multipart uploads and copies.
This is the number of chunks of the same file that are uploaded concurrently for multipart uploads and copies.
If you are uploading small numbers of large files over high-speed links and these uploads do not fully utilize your bandwidth, then increasing this may help to speed up the transfers.
Properties:
- Config: `upload_concurrency`
- Env Var: `RCLONE_DRIME_UPLOAD_CONCURRENCY`
- Type: `int`
- Default: `4`
- **`--drime-encoding`** โ The encoding for the backend.
See the encoding section in the overview (<blue>https://rclone.org/overview/#encoding</blue>) for more info.
Properties:
- Config: `encoding`
- Env Var: `RCLONE_DRIME_ENCODING`
- Type: `Encoding`
- Default: `Slash,BackSlash,Del,Ctl,LeftSpace,RightSpace,InvalidUtf8,Dot`
- **`--drime-description`** โ Description of the remote.
Properties:
- Config: `description`
- Env Var: `RCLONE_DRIME_DESCRIPTION`
- Type: `string`
- Required: `false`
---
## ๐ Limitations ๐
Drime only supports filenames up to **255 bytes** in length, where filenames are encoded in UTF8. That's the ceiling bestie, no going over. ๐
---
# ๐ Dropbox ๐
Paths are specified as `remote:path`
Dropbox paths may be as deep as required, e.g. `remote:directory/subdirectory`. Go off, nest as much as you want. ๐ฆ
---
## ๐ Configuration ๐
The initial setup for dropbox involves getting a token from Dropbox, which you need to do in your browser. `rclone config` walks you through it, bestie, it's got you. ๐
Here's an example of how to make a remote called `remote`. First run:
rclone config
This will guide you through an interactive setup process:
n) New remote d) Delete remote q) Quit config e/n/d/q> n name> remote Type of storage to configure. Choose a number from below, or type in your own value [snip] XX / Dropbox \ "dropbox" [snip] Storage> dropbox Dropbox App Key - leave blank normally. app_key> Dropbox App Secret - leave blank normally. app_secret> Remote config Please visit: https://www.dropbox.com/1/oauth2/authorize?client_id=XXXXXXXXXXXXXXX&response_type=code Enter the code: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX_XXXXXXXXXX Configuration complete. Options:
- type: dropbox
- app_key:
- app_secret:
- token: XXXXXXXXXXXXXXXXXXXXXXXXXXXXX_XXXX_XXXXXXXXXXXXXXXXXXXXXXXXXXXXX Keep this "remote" remote? y) Yes this is OK e) Edit this remote d) Delete this remote y/e/d> y
See the remote setup docs (<blue>https://rclone.org/remote_setup/</blue>) for how to set it up on a machine without an internet-connected web browser available.
> Heads up: rclone runs a webserver on your local machine to collect the token as returned from Dropbox. This only runs from the moment it opens your browser to the moment you get back the verification code. It's on `http://127.0.0.1:53682/` and it may require you to unblock it temporarily if you're running a host firewall, or use manual mode. Don't let a firewall ruin the moment. ๐งฑ๐ญ
You can then use it like this,
List directories in top level of your dropbox:
rclone lsd remote:
List all the files in your dropbox:
rclone ls remote:
To copy a local directory to a dropbox directory called `backup`:
rclone copy /home/source remote:backup
---
## ๐ Dropbox for business ๐
Rclone supports Dropbox for business and Team Folders. It's giving corporate. ๐ผโจ
When using Dropbox for business, `remote:` and `remote:path/to/file` will refer to your **personal** folder.
If you wish to see Team Folders you must use a leading `/` in the path, so `rclone lsd remote:/` will refer to the root and show you all Team Folders and your User Folder. ๐
You can then use team folders like this: `remote:/TeamFolder` and `remote:/TeamFolder/path/to/file`.
---
A leading `/` for a Dropbox personal account will do **nothing**, bestie ๐ โ literally zero. All it does is cost you an extra HTTP transaction, so likeโฆ don't. Just don't.
---
## ๐ฐ๏ธ Modification times and hashes โจ
Dropbox *does* support modified times, but here's the tea ๐ต: the **only** way to set a modification time is to **re-upload the file**. That's it. That's the whole trick.
Which means โ if you uploaded your data with an older version of rclone that didn't support the v2 API and modified times, rclone is gonna look at that and go "fixing time!!" and re-upload *all* your old data just to correct the modtimes. ๐ญ If you do **not** want that chaos, use the `--size-only` or `--checksum` flag to shut it down.
Dropbox also has its own hash type (https://www.dropbox.com/developers/reference/content-hash) which gets checked for **all** transfers. Every single one. No cap. ๐
---
## ๐ซ Restricted filename characters ๐
Here's the list of characters that get swapped out, because Dropbox said no:
- `NUL` โ `0x00` โ replaced with `โ`
- `/` โ `0x2F` โ replaced with `๏ผ`
- `DEL` โ `0x7F` โ replaced with `โก`
- `\` โ `0x5C` โ replaced with `๏ผผ`
File names *also* cannot **end** with the following characters. Important nuance bestie โ these only get replaced if they're the **last character in the name**:
- `SP` โ `0x20` โ replaced with `โ `
Invalid UTF-8 bytes will also be replaced (https://rclone.org/overview/#invalid-utf8), because they literally can't be used in JSON strings. JSON said nope ๐
โโ๏ธ
---
## ๐ฆ Batch mode uploads ๐ฅ
Using batch mode uploads is **very important for performance** when you're on the Dropbox API. Like, this is not optional-if-you-want-speed energy. Go read the dropbox performance guide (https://developers.dropbox.com/dbx-performance-guide) for the full context.
There are **3 modes** rclone can use for uploads. Let's meet them ๐
### `--dropbox-batch-mode off`
In this mode rclone will **not** use upload batching. This was the default before rclone v1.55. The downside? It is very likely to hit `too_many_requests` errors like this:
NOTICE: too_many_requests/.: Too many requests or write operations. Trying again in 15 seconds.
When rclone receives these, it has to wait for 15s or sometimes 300s before it continues, which *really* slows down transfers. ๐
This will happen especially if `--transfers` is large, so this mode isn't recommended โ except for compatibility or for investigating problems.
### `--dropbox-batch-mode sync`
In this mode rclone will batch up uploads to the size specified by `--dropbox-batch-size` and commit them together.
Using this mode means you can use a **much higher** `--transfers` parameter (32 or 64 works fine) without getting `too_many_requests` errors. Slay. โจ
This mode ensures **full data integrity**. ๐
Note that there may be a pause when quitting rclone while rclone finishes up the last batch using this mode โ it's just tidying up, don't panic.
### `--dropbox-batch-mode async`
In this mode rclone will batch up uploads to the size specified by `--dropbox-batch-size` and commit them together.
**However** it will not wait for the status of the batch to be returned to the caller. Which means rclone can use a much bigger batch size (much bigger than `--transfers`), at the cost of not being able to check the status of the upload. Tradeoff queen ๐
This provides the maximum possible upload speed, especially with lots of small files โ but rclone can't check the file got uploaded properly using this mode. ๐
If you're using this mode, then running "rclone check" after the transfer completes is **recommended**. Or you could do an initial transfer with `--dropbox-batch-mode async` and then do a final transfer with `--dropbox-batch-mode sync` (the default). Best of both worlds fr fr.
Note that there may be a pause when quitting rclone while rclone finishes up the last batch using this mode.
---
## ๐ค Exporting files ๐
Certain files in Dropbox are "exportable", such as Dropbox Paper documents. These files need to be converted to another format in order to be downloaded. Often multiple formats are available for conversion.
When rclone downloads an exportable file, it chooses the format to download based on the `--dropbox-export-formats` setting. By default, the export formats are `html,md`, which are sensible defaults for Dropbox Paper. ๐
Rclone chooses the **first** format ID in the export formats list that Dropbox supports for a given file. If no format in the list is usable, rclone will choose the default format that Dropbox suggests.
Rclone will change the extension to correspond to the export format. Here are some examples of how extensions are mapped:
- File type: Paper โ Filename in Dropbox: `mydoc.paper` โ Filename in rclone: `mydoc.html`
- File type: Paper template โ Filename in Dropbox: `mydoc.papert` โ Filename in rclone: `mydoc.papert.html`
- File type: other โ Filename in Dropbox: `mydoc` โ Filename in rclone: `mydoc.html`
Importing exportable files is **not yet** supported by rclone. ๐
Here are the supported export extensions known by rclone. Note that rclone does **not currently** support other formats not on this list, even if Dropbox supports them. Also, Dropbox could change the list of supported formats at any time โ so like, stay on your toes.
- Format ID `html` โ Name `HTML` โ HTML document
- Format ID `md` โ Name `Markdown` โ Markdown text format
---
## โ๏ธ Standard options ๐ธ
Here are the Standard options specific to dropbox (Dropbox).
### `--dropbox-client-id`
OAuth Client Id.
Leave blank normally. (seriously, leave it blank unless you know what you're doing ๐
)
Properties:
- Config: `client_id`
- Env Var: `RCLONE_DROPBOX_CLIENT_ID`
- Type: string
- Required: false
### `--dropbox-client-secret`
OAuth Client Secret.
Leave blank normally.
Properties:
- Config: `client_secret`
- Env Var: `RCLONE_DROPBOX_CLIENT_SECRET`
- Type: string
- Required: false
---
## ๐งช Advanced options ๐
Here are the Advanced options specific to dropbox (Dropbox). Buckle up, there's a bunch.
### `--dropbox-token`
OAuth Access Token as a JSON blob.
Properties:
- Config: `token`
- Env Var: `RCLONE_DROPBOX_TOKEN`
- Type: string
- Required: false
### `--dropbox-auth-url`
Auth server URL.
Leave blank to use the provider defaults.
Properties:
- Config: `auth_url`
- Env Var: `RCLONE_DROPBOX_AUTH_URL`
- Type: string
- Required: false
### `--dropbox-token-url`
Token server url.
Leave blank to use the provider defaults.
Properties:
- Config: `token_url`
- Env Var: `RCLONE_DROPBOX_TOKEN_URL`
- Type: string
- Required: false
### `--dropbox-client-credentials`
Use client credentials OAuth flow.
This will use the OAUTH2 client Credentials Flow as described in RFC 6749.
Note that this option is **NOT supported by all backends**. ๐
Properties:
- Config: `client_credentials`
- Env Var: `RCLONE_DROPBOX_CLIENT_CREDENTIALS`
- Type: bool
- Default: `false`
### `--dropbox-chunk-size`
Upload chunk size (`< 150Mi`).
Any files larger than this will be uploaded in chunks of this size.
Note that chunks are buffered in memory (one at a time) so rclone can deal with retries. Setting this larger will increase the speed slightly (at most 10% for 128 MiB in tests) at the cost of using more memory. It can be set smaller if you are tight on memory.
Properties:
- Config: `chunk_size`
- Env Var: `RCLONE_DROPBOX_CHUNK_SIZE`
- Type: SizeSuffix
- Default: `48Mi`
### `--dropbox-impersonate`
Impersonate this user when using a business account.
Note that if you want to use impersonate, you should make sure this flag is set when running "rclone config" as this will cause rclone to request the `members.read` scope which it won't normally. This is needed to lookup a members email address into the internal ID that dropbox uses in the API.
Using the `members.read` scope will require a Dropbox Team Admin to approve during the OAuth flow. ๐
You will have to use your own App (setting your own `client_id` and `client_secret`) to use this option as currently rclone's default set of permissions doesn't include `members.read`. This can be added once v1.55 or later is in use everywhere.
Properties:
- Config: `impersonate`
- Env Var: `RCLONE_DROPBOX_IMPERSONATE`
- Type: string
- Required: false
### `--dropbox-impersonate-admin`
Team admin ID to use when performing actions as a team administrator.
This sets the `Dropbox-API-Select-Admin` header with the given team member ID (for example `"dbmid:..."`).
This takes a team member ID directly rather than an email address.
Note that if you want to use impersonate_admin, you should make sure this flag is set when running "rclone config" as this will cause rclone to request the `team_data.member` scope which it won't normally.
Using the `team_data.member` scope will require a Dropbox Team Admin to approve during the OAuth flow.
You will have to use your own App (setting your own `client_id` and `client_secret`) to use this option as currently rclone's default set of permissions doesn't include `team_data.member`.
Properties:
- Config: `impersonate_admin`
- Env Var: `RCLONE_DROPBOX_IMPERSONATE_ADMIN`
- Type: string
- Required: false
### `--dropbox-shared-files`
Instructs rclone to work on individual shared files.
In this mode rclone's features are **extremely limited** โ only list (`ls`, `lsl`, etc.) operations and read operations (e.g. downloading) are supported in this mode. All other operations will be disabled. ๐ญ
Properties:
- Config: `shared_files`
- Env Var: `RCLONE_DROPBOX_SHARED_FILES`
- Type: bool
- Default: `false`
### `--dropbox-shared-folders`
Instructs rclone to work on shared folders.
When this flag is used with no path only the List operation is supported and all available shared folders will be listed. If you specify a path the first part will be interpreted as the name of shared folder. Rclone will then try to mount this shared to the root namespace. On success shared folder rclone proceeds normally. The shared folder is now pretty much a normal folder and all normal operations are supported. โจ
Note that we don't unmount the shared folder afterwards so the `--dropbox-shared-folders` can be omitted after the first use of a particular shared folder.
See also `--dropbox-root-namespace` for an alternative way to work with shared folders.
Properties:
- Config: `shared_folders`
- Env Var: `RCLONE_DROPBOX_SHARED_FOLDERS`
- Type: bool
- Default: `false`
### `--dropbox-skip-shared-folders`
Instructs rclone to skip all shared folders.
<pink>Okay so when this is set</pink>, any folder that's a shared folder mount point gets <hotpink>yeeted straight out of directory listings</hotpink> โ regardless of ownership, no cap. It's giving very useful if you'd rather back up your shared folders separately with their own remote configured with the shared folder namespace. ๐
- **Config:** `skip_shared_folders`
- **Env Var:** `RCLONE_DROPBOX_SKIP_SHARED_FOLDERS`
- **Type:** `bool`
- **Default:** `false`
- **`--dropbox-skip-unowned-folders`** โ tells rclone to skip shared folders that aren't owned by the current user, periodt. โจ
- When it's set, any folder that's a shared folder mount point **and** not owned by the current user is excluded from directory listings. This is the move when you're backing up multiple Dropbox accounts that share common folders, so you don't duplicate the same shared data across all of them. ๐
- <yellow>Note:</yellow> in Dropbox Business, 'Team Folders' are owned by the Team. For standard team members these folders evaluate as 'unowned' (editor/viewer access), so they'll be excluded by this flag. To back up Team Folders, don't use this flag, or run the backup using a Team Admin account. ๐
- If `--dropbox-skip-shared-folders` is also enabled, this flag has <red>no effect</red>.
- Heads up bestie, this makes an extra API call per shared folder mount point.
- **Properties:**
- **Config:** `skip_unowned_folders`
- **Env Var:** `RCLONE_DROPBOX_SKIP_UNOWNED_FOLDERS`
- **Type:** `bool`
- **Default:** `false`
- **`--dropbox-pacer-min-sleep`** โ minimum time to sleep between API calls. ๐ซถ
- **Properties:**
- **Config:** `pacer_min_sleep`
- **Env Var:** `RCLONE_DROPBOX_PACER_MIN_SLEEP`
- **Type:** `Duration`
- **Default:** `10ms`
- **`--dropbox-encoding`** โ the encoding for the backend. ๐ฆ
- See the encoding section in the overview (`https://rclone.org/overview/#encoding`) for more info.
- **Properties:**
- **Config:** `encoding`
- **Env Var:** `RCLONE_DROPBOX_ENCODING`
- **Type:** `Encoding`
- **Default:** `Slash,BackSlash,Del,RightSpace,InvalidUtf8,Dot`
- **`--dropbox-root-namespace`** โ specify a different Dropbox namespace ID to use as the root for all paths. ๐ธ
- **Properties:**
- **Config:** `root_namespace`
- **Env Var:** `RCLONE_DROPBOX_ROOT_NAMESPACE`
- **Type:** `string`
- **Required:** `false`
- **`--dropbox-export-formats`** โ comma separated list of preferred formats for exporting files. ๐
- Certain Dropbox files can only be accessed by exporting them to another format. These include Dropbox Paper documents. ๐
- For each such file, rclone will choose the first format on this list that Dropbox considers valid. If none of them is valid, it'll choose Dropbox's default format.
- Known formats include: `"html"`, `"md"` (markdown)
- **Properties:**
- **Config:** `export_formats`
- **Env Var:** `RCLONE_DROPBOX_EXPORT_FORMATS`
- **Type:** `CommaSepList`
- **Default:** `html,md`
- **`--dropbox-skip-exports`** โ skip exportable files in all listings. ๐ป
- If given, exportable files practically become **invisible** to rclone. Not me making whole files disappear fr fr.
- **Properties:**
- **Config:** `skip_exports`
- **Env Var:** `RCLONE_DROPBOX_SKIP_EXPORTS`
- **Type:** `bool`
- **Default:** `false`
- **`--dropbox-show-all-exports`** โ show all exportable files in listings. โจ
- Adding this flag lets all exportable files be server side copied. Note that rclone doesn't add extensions to the exportable file names in this mode.
- > <red>Do NOT use this flag when trying to download exportable files</red> โ rclone will fail to download them. ๐ญ
- **Properties:**
- **Config:** `show_all_exports`
- **Env Var:** `RCLONE_DROPBOX_SHOW_ALL_EXPORTS`
- **Type:** `bool`
- **Default:** `false`
- **`--dropbox-batch-mode`** โ upload file batching `sync|async|off`. ๐
- This sets the batch mode used by rclone.
- For full info see the main docs (`https://rclone.org/dropbox/#batch-mode`)
- This has 3 possible values:
- `off` โ no batching
- `sync` โ batch uploads and check completion (default)
- `async` โ batch upload and don't check completion
- Rclone will close any outstanding batches when it exits, which may make a delay on quit. ๐ข
- **Properties:**
- **Config:** `batch_mode`
- **Env Var:** `RCLONE_DROPBOX_BATCH_MODE`
- **Type:** `string`
- **Default:** `"sync"`
- **`--dropbox-batch-size`** โ max number of files in an upload batch. ๐
- This sets the batch size of files to upload. It has to be **less than 1000**.
- By default this is `0`, which means rclone will calculate the batch size depending on the setting of `batch_mode`. Like it does the math for you, cute.
- `batch_mode`: `async` โ default `batch_size` is `100`
- `batch_mode`: `sync` โ default `batch_size` is the same as `--transfers`
- `batch_mode`: `off` โ not in use
- Rclone will close any outstanding batches when it exits, which may make a delay on quit.
- Setting this is a **great idea** if you're uploading lots of small files, since it makes them a lot quicker. You can use `--transfers 32` to maximise throughput. ๐ฅ
- **Properties:**
- **Config:** `batch_size`
- **Env Var:** `RCLONE_DROPBOX_BATCH_SIZE`
- **Type:** `int`
- **Default:** `0`
- **`--dropbox-batch-timeout`** โ max time to allow an idle upload batch before uploading. โณ
- If an upload batch is idle for more than this long, then it gets uploaded.
- The default for this is `0`, which means rclone will choose a sensible default based on the `batch_mode` in use.
- `batch_mode`: `async` โ default `batch_timeout` is `10s`
- `batch_mode`: `sync` โ default `batch_timeout` is `500ms`
- `batch_mode`: `off` โ not in use
- **Properties:**
- **Config:** `batch_timeout`
- **Env Var:** `RCLONE_DROPBOX_BATCH_TIMEOUT`
- **Type:** `Duration`
- **Default:** `0s`
- **`--dropbox-description`** โ description of the remote. ๐
- **Properties:**
- **Config:** `description`
- **Env Var:** `RCLONE_DROPBOX_DESCRIPTION`
- **Type:** `string`
- **Required:** `false`
---
# ๐ Limitations ๐ (aka the plot twists)
Bestie, settle in, because Dropbox has some quirks and we're listing every single one. ๐
- Dropbox is <hotpink>case insensitive</hotpink>, so you literally can't have a file called `Hello.doc` and one called `hello.doc`. Pick a lane.
- There are some file names such as `thumbs.db` that Dropbox can't store. There's a full list of them in the "Ignored Files" section of this document (`https://www.dropbox.com/en/help/145`). Rclone will issue an error message `File name disallowed - not uploading` if it attempts to upload one of those file names, but the sync won't fail. ๐ซถ
- Some errors may occur if you try to sync copyright-protected files, because Dropbox has its own copyright detector (`https://techcrunch.com/2014/03/30/how-dropbox-knows-when-youre-sharing-copyrighted-stuff-without-actually-looking-at-your-stuff/`) that prevents this sort of file being downloaded. This will return the error `ERROR : /path/to/your/file: Failed to copy: failed to open source object: path/restricted_content/`. ๐ญ
- If you have more than 10,000 files in a directory then `rclone purge dropbox:dir` will return the error `Failed to purge: There are too many files involved in this operation.` As a work-around, do an `rclone delete dropbox:dir` followed by an `rclone rmdir dropbox:dir`. ๐ง
- When using `rclone link` you'll need to set `--expire` if using a non-personal account, otherwise the visibility may not be correct. (Note that `--expire` isn't supported on personal accounts.) See the forum discussion (`https://forum.rclone.org/t/rclone-link-dropbox-permissions/23211`) and the dropbox SDK issue (`https://github.com/dropbox/dropbox-sdk-go-unofficial/issues/75`). ๐
- Modification times for Dropbox Paper documents are <yellow>not exact</yellow>, and may not change for some period after the document is edited. To make sure you get recent changes in a sync, either wait an hour or so, or use `--ignore-times` to force a full sync. โฐ
---
# ๐ Get your own Dropbox App ID ๐
When you use rclone with Dropbox in its default configuration, you're using **rclone's App ID**. This is shared between all the rclone users. It's giving community pool energy. ๐
Here's how to create your own Dropbox App ID for rclone:
1. Log into the Dropbox App console (`https://www.dropbox.com/developers/apps/create`) with your Dropbox Account (it need not be the same account as the Dropbox you want to access) โจ
2. Choose an API => usually this should be `Dropbox API`
3. Choose the type of access you want to use => `Full Dropbox` or `App Folder`. If you want to use Team Folders, `Full Dropbox` is required (see here (`https://www.dropboxforum.com/t5/Dropbox-API-Support-Feedback/How-to-create-team-folder-inside-my-app-s-folder/m-p/601005/highlight/true#M27911`)). ๐
4. Name your App. The app name is <hotpink>global</hotpink>, so you can't use `rclone` for example. ๐
5. Click the button `Create App`
6. Switch to the `Permissions` tab. Enable at least the following permissions: `account_info.read`, `files.metadata.write`, `files.content.write`, `files.content.read`, `sharing.write`. The `files.metadata.read` and `sharing.read` checkboxes will be marked too. Click `Submit`. ๐
7. Switch to the `Settings` tab. Fill `OAuth2 - Redirect URIs` as `http://localhost:53682/` and click on `Add`
8. Find the `App key` and `App secret` values on the `Settings` tab. Use these values in `rclone config` to add a new remote or edit an existing remote. The `App key` setting corresponds to `client_id` in `rclone config`, the `App secret` corresponds to `client_secret`. ๐ฅ
## ๐ Enterprise File Fabric ๐
This backend is for Storage Made Easy's Enterprise File Fabricโข (<https://storagemadeeasy.com/about/>) โ it's the whole โจ software solution โจ that pulls your File *and* Object Storage together and unifies it all behind one global file system. Bestie, it's giving "one filesystem to rule them all" and honestly? We love that for us. ๐ซถ
---
### ๐ Configuration ๐
okay so the first setup step for the Enterprise File Fabric backend is grabbing a token from the Enterprise File Fabric, and yes you literally do that in your browser. luckily `rclone config` holds your hand through the whole thing like the icon that it is. ๐
Here's how you'd make a remote called `remote`. First things first:
rclone config
and then it walks you through it, interactive style:
No remotes found, make a new one? n) New remote s) Set configuration password q) Quit config n/s/q> n name> remote Type of storage to configure. Enter a string value. Press Enter for the default (""). Choose a number from below, or type in your own value [snip] XX / Enterprise File Fabric \ "filefabric" [snip] Storage> filefabric ** See help for filefabric backend at: https://rclone.org/filefabric/ **
URL of the Enterprise File Fabric to connect to Enter a string value. Press Enter for the default (""). Choose a number from below, or type in your own value 1 / Storage Made Easy US \ "https://storagemadeeasy.com" 2 / Storage Made Easy EU \ "https://eu.storagemadeeasy.com" 3 / Connect to your Enterprise File Fabric \ "https://yourfabric.smestorage.com" url> https://yourfabric.smestorage.com/ ID of the root folder Leave blank normally.
Fill in to make rclone start with directory of a given ID.
Enter a string value. Press Enter for the default (""). root_folder_id> Permanent Authentication Token
A Permanent Authentication Token can be created in the Enterprise File Fabric, on the users Dashboard under Security, there is an entry you'll see called "My Authentication Tokens". Click the Manage button to create one.
These tokens are normally valid for several years.
For more info see: https://docs.storagemadeeasy.com/organisationcloud/api-tokens
Enter a string value. Press Enter for the default (""). permanent_token> xxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxx Edit advanced config? (y/n) y) Yes n) No (default) y/n> n Remote config Configuration complete. Options:
- type: filefabric
- url: https://yourfabric.smestorage.com/
- permanent_token: xxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxx Keep this "remote" remote? y) Yes this is OK (default) e) Edit this remote d) Delete this remote y/e/d> y
Once it's configured you can use rclone like this (swap `remote` for whatever name you gave yours, bestie ๐ฆ):
List the directories in the top level of your Enterprise File Fabric:
rclone lsd remote:
List *all* the files in your Enterprise File Fabric:
rclone ls remote:
To copy a local directory onto an Enterprise File Fabric directory called `backup`:
rclone copy /home/source remote:backup
---
### โฐ Modification times and hashes โฐ
The Enterprise File Fabric lets modification times be set on files, accurate to **1 second**, and rclone uses those to figure out whether objects need syncing or not. so precise, slay.
The Enterprise File Fabric does **not** support any data hashes at this time. no hashes, we cope. ๐ญ
---
### ๐ซ Restricted filename characters ๐ซ
The default restricted characters set (<https://rclone.org/overview/#restricted-characters>) will be replaced.
Invalid UTF-8 bytes will also be replaced (<https://rclone.org/overview/#invalid-utf8>), because babes, they literally can't be used in JSON strings. it's not a vibe, it's just a format limit. ๐
---
### ๐ซ Empty files ๐ซ
Empty files aren't supported by the Enterprise File Fabric. so rclone does a little workaround: it uploads an empty file as a **single space** with a mime type of `application/vnd.rclone.empty.file`, and any files with that mime type are treated as empty. iconic behaviour, honestly. โจ
---
### ๐ Root folder ID ๐
You can set the `root_folder_id` for rclone. This is the directory (identified by its **Folder ID**) that rclone considers to be the root of your Enterprise File Fabric.
Normally you'll leave this blank and rclone will work out the correct root all by itself, main character energy. ๐
But you *can* set this to restrict rclone to a specific folder hierarchy.
To do that you'll have to find the Folder ID of the directory you want rclone to display. These aren't shown in the web interface, but plot twist โ you can use `rclone lsf` to find them, like so:
$ rclone lsf --dirs-only -Fip --csv filefabric: 120673758,Burnt PDFs/ 120673759,My Quick Uploads/ 120673755,My Syncs/ 120673756,My backups/ 120673757,My contacts/ 120673761,S3 Storage/
so the ID for `"S3 Storage"` would be `120673761`. periodt. ๐
---
### ๐ Standard options ๐
Here are the Standard options specific to `filefabric` (Enterprise File Fabric).
#### `--filefabric-url`
URL of the Enterprise File Fabric to connect to.
Properties:
- **Config:** `url`
- **Env Var:** `RCLONE_FILEFABRIC_URL`
- **Type:** string
- **Required:** true
- **Examples:**
- `"https://storagemadeeasy.com"`
- Storage Made Easy US
- `"https://eu.storagemadeeasy.com"`
- Storage Made Easy EU
- `"https://yourfabric.smestorage.com"`
- Connect to your Enterprise File Fabric
#### `--filefabric-root-folder-id`
ID of the root folder.
Leave blank normally.
Fill in to make rclone start with directory of a given ID.
Properties:
- **Config:** `root_folder_id`
- **Env Var:** `RCLONE_FILEFABRIC_ROOT_FOLDER_ID`
- **Type:** string
- **Required:** false
#### `--filefabric-permanent-token`
Permanent Authentication Token.
A Permanent Authentication Token can be created in the Enterprise File Fabric, on the users Dashboard under Security, there's an entry you'll see called `"My Authentication Tokens"`. Click the Manage button to create one.
These tokens are normally valid for several years. long-term commitment, we love to see it. ๐
For more info see: <https://docs.storagemadeeasy.com/organisationcloud/api-tokens>
Properties:
- **Config:** `permanent_token`
- **Env Var:** `RCLONE_FILEFABRIC_PERMANENT_TOKEN`
- **Type:** string
- **Required:** false
---
### ๐ฎ Advanced options ๐ฎ
Here are the Advanced options specific to `filefabric` (Enterprise File Fabric).
#### `--filefabric-token`
Session Token.
This is a session token which rclone caches in the config file. It's usually valid for **1 hour**.
**Don't set this value** โ rclone will set it automatically. hands off, bestie, it's got it. ๐
Properties:
- **Config:** `token`
- **Env Var:** `RCLONE_FILEFABRIC_TOKEN`
- **Type:** string
- **Required:** false
#### `--filefabric-token-expiry`
Token expiry time.
**Don't set this value** โ rclone will set it automatically.
Properties:
- **Config:** `token_expiry`
- **Env Var:** `RCLONE_FILEFABRIC_TOKEN_EXPIRY`
- **Type:** string
- **Required:** false
#### `--filefabric-version`
Version read from the file fabric.
**Don't set this value** โ rclone will set it automatically.
Properties:
- **Config:** `version`
- **Env Var:** `RCLONE_FILEFABRIC_VERSION`
- **Type:** string
- **Required:** false
#### `--filefabric-encoding`
The encoding for the backend.
See the encoding section in the overview (<https://rclone.org/overview/#encoding>) for more info.
Properties:
- **Config:** `encoding`
- **Env Var:** `RCLONE_FILEFABRIC_ENCODING`
- **Type:** Encoding
- **Default:** `Slash,Del,Ctl,InvalidUtf8,Dot`
#### `--filefabric-description`
Description of the remote.
Properties:
- **Config:** `description`
- **Env Var:** `RCLONE_FILEFABRIC_DESCRIPTION`
- **Type:** string
- **Required:** false
# ๐ FileLu ๐
<pink>FileLu</pink> (`https://filelu.com/`) is that reliable cloud storage bestie offering features like secure file uploads, downloads, flexible storage options, and sharing capabilities. With support for high storage limits and seamless integration with rclone, FileLu makes managing files in the cloud a whole *easy* experience. Its cross-platform file backup services let you upload and back up files from literally any internet-connected device. ๐ฆ
> Heads up bestie ๐ โ FileLu now has a fully featured S3 backend called FileLu S5, an industry standard S3 compatible object store. Slay.
## โจ Configuration โจ
Here's an example of how to make a remote called `filelu`. First, run:
rclone config
This will guide you through an interactive setup process:
No remotes found, make a new one? n) New remote s) Set configuration password q) Quit config n/s/q> n name> filelu Type of storage to configure. Choose a number from below, or type in your own value [snip] xx / FileLu Cloud Storage \ "filelu" [snip] Storage> filelu Enter your FileLu Rclone Key: key> YOUR_FILELU_RCLONE_KEY RC_xxxxxxxxxxxxxxxxxxxxxxxx Configuration complete.
Keep this "filelu" remote? y) Yes this is OK e) Edit this remote d) Delete this remote y/e/d> y
## ๐ Paths ๐
A path with **no** initial `/` will operate in the Rclone directory, iykyk.
A path **with** an initial `/` will operate at the root, where you can see the Rclone directory.
$ rclone lsf TestFileLu:/ CCTV/ Camera/ Documents/ Music/ Photos/ Rclone/ Vault/ Videos/
## ๐ง Example Commands ๐ง
Make a new folder named `foldername` in the Rclone directory:
rclone mkdir filelu:foldername
Delete a folder on FileLu:
rclone rmdir filelu:/folder/path/
Delete a file on FileLu:
rclone delete filelu:/hello.txt
List files from your FileLu account:
rclone ls filelu:
List all folders:
rclone lsd filelu:
Copy a specific file to the FileLu root:
rclone copy D:\hello.txt filelu:
Copy files from a local directory to a FileLu directory:
rclone copy D:/local-folder filelu:/remote-folder/path/
Download a file from FileLu into a local directory:
rclone copy filelu:/file-path/hello.txt D:/local-folder
Move files from a local directory to a FileLu directory:
rclone move D:\local-folder filelu:/remote-path/
Sync files from a local directory to a FileLu directory:
rclone sync --interactive D:/local-folder filelu:/remote-path/
Mount remote to local Linux:
rclone mount filelu: /root/mnt --vfs-cache-mode full
Mount remote to local Windows:
rclone mount filelu: D:/local_mnt --vfs-cache-mode full
Get storage info about the FileLu account:
rclone about filelu:
And literally all the other rclone commands are supported by this backend. ๐
## ๐ธ FolderID instead of folder path ๐ธ
We use the **FolderID** instead of the folder name to prevent errors when users have identical folder names or paths. Think about it bestie: if a user has two or three folders named `"test_folders"`, the system may become confused and won't know which folder to move. ๐ญ In large storage systems, some clients have hundreds of thousands of folders and a few millions of files, so duplicate folder names or paths are quite common. So yeah, FolderID it is.
## ๐ Modification Times and Hashes ๐
FileLu supports both modification times and MD5 hashes.
FileLu only supports filenames and folder names up to **255 characters** in length, where a character is a Unicode character. No cap. โจ
## ๐ Duplicated Files ๐
When uploading and syncing via Rclone, FileLu does **not** allow uploading duplicate files within the same directory. However โ plot twist โ you *can* upload duplicate files, provided they are in different directories (folders). ๐
## ๐ Failure to Log / Invalid Credentials or KEY ๐
Make sure you have the correct Rclone key, which can be found in My Account (`https://filelu.com/account/`). Every single time you toggle Rclone OFF and ON in My Account, a new `RC_xxxxxxxxxxxxxxxxxxxx` key is generated. Be sure to update your Rclone configuration with the new key, fr fr. ๐
If you're connecting to your FileLu remote for the first time and encounter an error such as:
Failed to create file system for "my-filelu-remote:": couldn't login: Invalid credentials
...then ensure your Rclone Key is correct. That's it, that's the fix.
## ๐ฅ Process killed ๐ฅ
Accounts with large files or extensive metadata may experience **significant memory usage** during list/sync operations. So make sure the system running rclone has sufficient memory and CPU to handle these operations, bestie โ no one wants their process getting killed mid-sync. ๐ญ
## ๐ Standard options ๐
Here are the Standard options specific to `filelu` (FileLu Cloud Storage).
### `--filelu-key`
Your FileLu Rclone key from My Account
Properties:
- **Config:** `key`
- **Env Var:** `RCLONE_FILELU_KEY`
- **Type:** `string`
- **Required:** `true`
## โญ Advanced options โญ
Here are the Advanced options specific to `filelu` (FileLu Cloud Storage).
### `--filelu-upload-cutoff`
Cutoff for switching to chunked upload. Any files larger than this will be uploaded in chunks of `chunk_size`.
Properties:
- **Config:** `upload_cutoff`
- **Env Var:** `RCLONE_FILELU_UPLOAD_CUTOFF`
- **Type:** `SizeSuffix`
- **Default:** `500Mi`
### `--filelu-chunk-size`
Chunk size to use for uploading. Used for multipart uploads.
Properties:
- **Config:** `chunk_size`
- **Env Var:** `RCLONE_FILELU_CHUNK_SIZE`
- **Type:** `SizeSuffix`
- **Default:** `64Mi`
### `--filelu-encoding`
The encoding for the backend.
See the encoding section in the overview (`https://rclone.org/overview/#encoding`) for more info.
Properties:
- **Config:** `encoding`
- **Env Var:** `RCLONE_FILELU_ENCODING`
- **Type:** `Encoding`
- **Default:** `Slash,LtGt,DoubleQuote,SingleQuote,BackQuote,Dollar,Colon,Question,Asterisk,Pipe,Hash,Percent,BackSlash,CrLf,Del,Ctl,LeftSpace,LeftPeriod,LeftTilde,LeftCrLfHtVt,RightSpace,RightPeriod,RightCrLfHtVt,InvalidUtf8,Dot,SquareBracket,Semicolon,Exclamation`
### `--filelu-description`
Description of the remote.
Properties:
- **Config:** `description`
- **Env Var:** `RCLONE_FILELU_DESCRIPTION`
- **Type:** `string`
- **Required:** `false`
## ๐ Limitations ๐
This backend uses a custom library implementing the FileLu API. While it supports file transfers, some advanced features may not yet be available. Please report any issues to the rclone forum (`https://forum.rclone.org/`) for troubleshooting and updates โ the community ate and left no crumbs, they'll help you out. ๐ซถ
For further information, visit FileLu's website (`https://filelu.com/`).
## ๐ Configuration ๐
okay bestie, listen up, because this first bit is **so** important ๐ซถ Setting up Filen means you need an API key for your account, and rn the *only* way to get one is through the Filen CLI (<pink>`https://github.com/FilenCloudDienste/filen-cli`</pink>). so yeah โ download the CLI first, log in, then run the <mint>`export-api-key`</mint> command. that's the whole vibe, no cap.
> โ ๏ธ <yellow>**lowkey crucial:**</yellow> if you change your Filen account password, you **have** to update your rclone config with the new password *and* a freshly re-exported API key (via <mint>`export-api-key`</mint>). do not forget. i am begging. ๐ญ
here's an example of making a remote called <purple>`FilenRemote`</purple> โจ First run:
rclone config
and it will hold your hand through the interactive setup like this:
No remotes found, make a new one? n) New remote s) Set configuration password q) Quit config n/s/q> n
name> FilenRemote Option Storage.
Type of storage to configure. Choose a number from below, or type in your own value. [snip] XX / Filen \ "filen" [snip] Storage> filen
Option Email. The email of your Filen account Enter a value. Email> youremail@provider.com
Option Password. The password of your Filen account Choose an alternative below. y) Yes, type in my own password g) Generate random password y/g> y Enter the password: password: Confirm the password: password:
Option API Key. An API Key for your Filen account Get this using the Filen CLI export-api-key command You can download the Filen CLI from https://github.com/FilenCloudDienste/filen-cli Choose an alternative below. y) Yes, type in my own password g) Generate random password y/g> y Enter the password: password: Confirm the password: password:
Edit advanced config? y) Yes n) No (default) y/n> n
Configuration complete. Options:
- type: filen
- Email: youremail@provider.com
- Password: * ENCRYPTED *
- API Key: * ENCRYPTED * Keep this "FilenRemote" remote? y) Yes this is OK (default) e) Edit this remote d) Delete this remote y/e/d> y
look at you go, configuring remotes like a whole main character ๐
---
## ๐ฐ๏ธ Modification times and hashes ๐ฐ๏ธ
Modification times are <green>fully supported for files</green>, but for <purple>directories</purple>, only the **creation time** matters. that's the rule, okay?
Filen supports <cyan>Blake3</cyan> hashes. slay. ๐ฅ
---
## ๐ซ Restricted filename characters ๐ซ
Invalid UTF-8 bytes will be replaced (see the overview: <pink>`https://rclone.org/overview/#invalid-utf8`</pink>). that's it, that's the tea ๐
---
## ๐ API Key ๐
(this one's just a lil signpost in the original โ nothing hiding under here, bestie, the real API key deets live up in Configuration ๐
)
---
## โญ Standard options โญ
Here are the Standard options specific to <purple>filen</purple> (Filen). yes, we're doing all of them, and yes, i'm excited about it ๐
### <cyan>`--filen-email`</cyan>
Email of your Filen account ๐ง
Properties:
- Config: `email`
- Env Var: `RCLONE_FILEN_EMAIL`
- Type: `string`
- Required: `true`
---
### <cyan>`--filen-password`</cyan>
Password of your Filen account ๐
> <yellow>**NB**</yellow> Input to this must be obscured โ see <mint>`rclone obscure`</mint> (<pink>`https://rclone.org/commands/rclone_obscure/`</pink>).
Properties:
- Config: `password`
- Env Var: `RCLONE_FILEN_PASSWORD`
- Type: `string`
- Required: `true`
---
### <cyan>`--filen-api-key`</cyan>
API Key for your Filen account ๐๏ธ
Get this using the Filen CLI `export-api-key` command. You can download the Filen CLI from <pink>`https://github.com/FilenCloudDienste/filen-cli`</pink>.
> <yellow>**NB**</yellow> Input to this must be obscured โ see <mint>`rclone obscure`</mint> (<pink>`https://rclone.org/commands/rclone_obscure/`</pink>).
Properties:
- Config: `api_key`
- Env Var: `RCLONE_FILEN_API_KEY`
- Type: `string`
- Required: `true`
---
## ๐ฅ Advanced options ๐ฅ
Here are the Advanced options specific to <purple>filen</purple> (Filen). buckle up, these ones are spicy ๐ถ๏ธ (well. the first two are. the rest are โจinternalโจ, ok)
### <cyan>`--filen-upload-concurrency`</cyan>
Concurrency for chunked uploads. ๐
This is the upper limit for how many transfers for the same file are running concurrently.
> ๐ <red>**DANGER:**</red> setting this above to a value smaller than `1` will cause uploads to **deadlock**. do not do that. i'm serious.
If you are uploading small numbers of large files over high-speed links and these uploads do not fully utilize your bandwidth, then increasing this may help to speed up the transfers. go faster bestie ๐จ
Properties:
- Config: `upload_concurrency`
- Env Var: `RCLONE_FILEN_UPLOAD_CONCURRENCY`
- Type: `int`
- Default: `16`
---
### <cyan>`--filen-encoding`</cyan>
The encoding for the backend. ๐ง
See the encoding section in the overview (<pink>`https://rclone.org/overview/#encoding`</pink>) for more info.
Properties:
- Config: `encoding`
- Env Var: `RCLONE_FILEN_ENCODING`
- Type: `Encoding`
- Default: `Slash,Del,Ctl,InvalidUtf8,Dot`
---
### <cyan>`--filen-master-keys`</cyan>
Master Keys (**internal use only**) ๐คซ
Properties:
- Config: `master_keys`
- Env Var: `RCLONE_FILEN_MASTER_KEYS`
- Type: `string`
- Required: `false`
---
### <cyan>`--filen-private-key`</cyan>
Private RSA Key (**internal use only**) ๐
Properties:
- Config: `private_key`
- Env Var: `RCLONE_FILEN_PRIVATE_KEY`
- Type: `string`
- Required: `false`
---
### <cyan>`--filen-public-key`</cyan>
Public RSA Key (**internal use only**) ๐
Properties:
- Config: `public_key`
- Env Var: `RCLONE_FILEN_PUBLIC_KEY`
- Type: `string`
- Required: `false`
---
### <cyan>`--filen-auth-version`</cyan>
Authentication Version (**internal use only**) ๐ชช
Properties:
- Config: `auth_version`
- Env Var: `RCLONE_FILEN_AUTH_VERSION`
- Type: `string`
- Required: `false`
---
### <cyan>`--filen-base-folder-uuid`</cyan>
UUID of Account Root Directory (**internal use only**) ๐
Properties:
- Config: `base_folder_uuid`
- Env Var: `RCLONE_FILEN_BASE_FOLDER_UUID`
- Type: `string`
- Required: `false`
---
### <cyan>`--filen-description`</cyan>
Description of the remote. ๐
Properties:
- Config: `description`
- Env Var: `RCLONE_FILEN_DESCRIPTION`
- Type: `string`
- Required: `false`
---
that's the whole Filen situation, bestie โ go forth and sync ๐โจ
# ๐ Files.com ๐
<cyan>Files.com</cyan> (https://www.files.com/) is a cloud storage service that gives you a secure and easy way to store and share your files. It's giving "your files, but with a bodyguard" energy. ๐ซถ
The initial setup for filescom is literally just authenticating with your Files.com account. You do that by handing over your site subdomain, username, and password. Or โ plot twist โ you can authenticate using an API Key from Files.com (https://www.files.com/docs/sdk-and-apis/api-keys/) instead. Either way, `rclone config` walks you through it, no stress. โจ
## Configuration ๐ธ
Here's an example of how to make a remote called `remote`. First run:
rclone config
This will guide you through an interactive setup process:
No remotes found, make a new one? n) New remote s) Set configuration password q) Quit config n/s/q> n
Enter name for new remote. name> remote
Option Storage. Type of storage to configure. Choose a number from below, or type in your own value. [snip] XX / Files.com \ "filescom" [snip] Storage> filescom
Option site. Your site subdomain (e.g. mysite) or custom domain (e.g. myfiles.customdomain.com) Enter a value. Press Enter to leave empty. site> mysite
Option username. The username used to authenticate with Files.com. Enter a value. Press Enter to leave empty. username> user
Option password. The password used to authenticate with Files.com. Choose an alternative below. Press Enter for the default (n). y) Yes, type in my own password g) Generate random password n) No, leave this optional password blank (default) y/g/n> y Enter the password: password: Confirm the password: password:
Edit advanced config? y) Yes n) No (default) y/n> n
Configuration complete. Options:
- type: filescom
- site: mysite
- username: user
- password: * ENCRYPTED * Keep this "remote" remote? y) Yes this is OK (default) e) Edit this remote d) Delete this remote y/e/d> y
Once configured you can use rclone. <purple>Bestie era unlocked.</purple> ๐
See all files in the top level:
rclone lsf remote:
Make a new directory in the root:
rclone mkdir remote:dir
Recursively List the contents:
rclone ls remote:
Sync `/home/local/directory` to the remote directory, deleting any excess files in the directory.
rclone sync --interactive /home/local/directory remote:dir
---
## Restricted filename characters ๐ซ
On top of the default restricted characters set (https://rclone.org/overview/#restricted-characters) the following characters are **also** replaced:
- Character: `\`
- Value: `0x5C`
- Replacement: `๏ผผ`
File names also can't **end** with the following characters. These only get replaced if they are the *last* character in the name:
- `SP` โ `0x20` โ `โ `
- `LF` โ `0x0A` โ `โ`
- `CR` โ `0x0D` โ `โ`
- `HT` โ `0x09` โ `โ`
- `VT` โ `0x0B` โ `โ`
Invalid UTF-8 bytes will also be replaced (https://rclone.org/overview/#invalid-utf8). ๐ญ
<hotpink>Heads up bestie:</hotpink> Files.com treats the replacements `๏ผ` and `๏ผผ` as if they were `/` and `\`, and the names `๏ผ` and `๏ผ๏ผ` as if they were `.` and `..`, and rejects them with `Invalid path`. This means that files with `/` or `\` in their names, or which are called `.` or `..`, **can't be stored on Files.com**. Periodt. ๐
---
## Hashes ๐
In December 2024 files.com started supporting more checksums (https://www.files.com/blog/2024/11/01/new-modern-checksum-options-now-available-with-opt).
However if you want hashes you **must** enable them in your site by visiting the "File Integrity" section in "Data Governance" to configure your settings and select the checksum algorithms that meet your requirements. ๐
Rclone currently only support `CRC32` and `MD5` for use in syncing but selecting more checksums will not affect rclone's operations.
For use with rclone, selecting at least `MD5` is recommended so rclone can do an end to end integrity check. <mint>Do it for the vibes. Do it for the integrity check.</mint> โ
---
## Standard options โญ
Here are the Standard options specific to filescom (Files.com).
### `--filescom-site`
Your site subdomain (e.g. `mysite`) or custom domain (e.g. `myfiles.customdomain.com`).
Properties:
- Config: `site`
- Env Var: `RCLONE_FILESCOM_SITE`
- Type: `string`
- Required: `false`
### `--filescom-username`
The username used to authenticate with Files.com.
Properties:
- Config: `username`
- Env Var: `RCLONE_FILESCOM_USERNAME`
- Type: `string`
- Required: `false`
### `--filescom-password`
The password used to authenticate with Files.com.
> NB Input to this must be obscured - see `rclone obscure` (https://rclone.org/commands/rclone_obscure/). No plaintext, we don't do that here. ๐
Properties:
- Config: `password`
- Env Var: `RCLONE_FILESCOM_PASSWORD`
- Type: `string`
- Required: `false`
---
## Advanced options ๐
Here are the Advanced options specific to filescom (Files.com).
### `--filescom-api-key`
The API key used to authenticate with Files.com.
Properties:
- Config: `api_key`
- Env Var: `RCLONE_FILESCOM_API_KEY`
- Type: `string`
- Required: `false`
### `--filescom-encoding`
The encoding for the backend.
See the encoding section in the overview (https://rclone.org/overview/#encoding) for more info.
Properties:
- Config: `encoding`
- Env Var: `RCLONE_FILESCOM_ENCODING`
- Type: `Encoding`
- Default: `Slash,BackSlash,Del,Ctl,RightSpace,RightCrLfHtVt,InvalidUtf8,Dot`
### `--filescom-description`
Description of the remote.
Properties:
- Config: `description`
- Env Var: `RCLONE_FILESCOM_DESCRIPTION`
- Type: `string`
- Required: `false`
---
# ๐ FTP ๐
<cyan>FTP</cyan> is the File Transfer Protocol โ the classic, the OG, the one that's been around longer than your fave. Rclone FTP support is provided using the `github.com/jlaffaye/ftp` (https://godoc.org/github.com/jlaffaye/ftp) package. ๐ง
## Limitations of Rclone's FTP backend ๐ง
Paths are specified as `remote:path`. If the path does not begin with a `/` it is relative to the home directory of the user. An empty path `remote:` refers to the user's home directory.
## Configuration ๐
To create an FTP configuration named `remote`, run
rclone config
Rclone config guides you through an interactive setup process. A minimal rclone FTP remote definition only requires `host`, `username` and `password`. For an anonymous FTP server, see below. ๐
No remotes found, make a new one? n) New remote r) Rename remote c) Copy remote s) Set configuration password q) Quit config n/r/c/s/q> n name> remote Type of storage to configure. Enter a string value. Press Enter for the default (""). Choose a number from below, or type in your own value [snip] XX / FTP \ "ftp" [snip] Storage> ftp ** See help for ftp backend at: https://rclone.org/ftp/ **
FTP host to connect to Enter a string value. Press Enter for the default (""). Choose a number from below, or type in your own value 1 / Connect to ftp.example.com \ "ftp.example.com" host> ftp.example.com FTP username Enter a string value. Press Enter for the default ("$USER"). user> FTP port number Enter a signed integer. Press Enter for the default (21). port> FTP password y) Yes type in my own password g) Generate random password y/g> y Enter the password: password: Confirm the password: password: Use FTP over TLS (Implicit) Enter a boolean value (true or false). Press Enter for the default ("false"). tls> Use FTP over TLS (Explicit) Enter a boolean value (true or false). Press Enter for the default ("false"). explicit_tls> Remote config Configuration complete. Options:
- type: ftp
- host: ftp.example.com
- pass: * ENCRYPTED * Keep this "remote" remote? y) Yes this is OK e) Edit this remote d) Delete this remote y/e/d> y
To see all directories in the home directory of `remote`
rclone lsd remote:
Make a new directory
rclone mkdir remote:path/to/directory
List the contents of a directory
rclone ls remote:path/to/directory
Sync `/home/local/directory` to the remote directory, deleting any excess files in the directory.
rclone sync --interactive /home/local/directory remote:directory
---
## Anonymous FTP ๐ธ
When connecting to a FTP server that allows anonymous login, you can use the special `anonymous` username. Traditionally, this user account accepts any string as a password, although it is common to use either the password `anonymous` or `guest`. Some servers require the use of a valid e-mail address as password. ๐ง
Using on-the-fly or connection string (https://rclone.org/docs/#connection-strings) remotes makes it easy to access such servers, without requiring any configuration in advance. The following are examples of that:
rclone lsf :ftp: --ftp-host=speedtest.tele2.net --ftp-user=anonymous --ftp-pass=$(rclone obscure dummy) rclone lsf :ftp,host=speedtest.tele2.net,user=anonymous,pass=$(rclone obscure dummy):
The above examples work in Linux shells and in PowerShell, but **not** Windows Command Prompt. They execute the `rclone obscure` (https://rclone.org/commands/rclone_obscure/) command to create a password string in the format required by the `pass` option. The following examples are exactly the same, except use an already obscured string representation of the same password `dummy`, and therefore works even in Windows Command Prompt:
rclone lsf :ftp: --ftp-host=speedtest.tele2.net --ftp-user=anonymous --ftp-pass=IXs2wc8OJOz7SYLBk47Ji1rHTmxM rclone lsf :ftp,host=speedtest.tele2.net,user=anonymous,pass=IXs2wc8OJOz7SYLBk47Ji1rHTmxM:
---
## Implicit TLS ๐
Rclone FTP supports implicit FTP over TLS servers (FTPS). This has to be enabled in the FTP backend config for the remote, or with `--ftp-tls`. <yellow>And listen:</yellow> the default FTPS port is `990`, **not** `21` โ and it can be set with `--ftp-port`. Don't get caught out, bestie. ๐
### โจ TLS Options โจ
ok so for <pink>Implicit</pink> AND <pink>Explicit</pink> TLS you can use these flags, and they're FTP-backend-specific, iykyk ๐
:
--ftp-no-check-certificate Do not verify the TLS certificate of the server --ftp-disable-tls13 Disable TLS 1.3 (workaround for FTP servers with buggy TLS) --ftp-tls-cache-size int Size of TLS session cache for all control and data connections (default 32)
BUT bestie, the plot twist is you can <hotpink>also</hotpink> use any of the global TLS flags, like:
--ca-cert stringArray CA certificate used to verify servers --client-cert string Client SSL certificate (PEM) for mutual TLS auth --client-key string Client SSL private key (PEM) for mutual TLS auth --no-check-certificate Do not verify the server SSL certificate (insecure)
And if you need those to live in the config file so they apply <purple>to just the FTP backend</purple> and nowhere else, use the override syntax, periodt:
override.ca_cert = XXX override.client_cert = XXX override.client_key = XXX
---
### ๐ธ Restricted filename characters ๐ธ
On top of the default restricted characters set (`https://rclone.org/overview/#restricted-characters`), these ones get replaced too:
File names literally **cannot end** with the following characters. And the replacement is only limited to the **last character** in a file name โ so it's giving surgical precision ๐:
- Character `SP` โ Value `0x20` โ Replacement `โ `
And not every FTP server can handle every character in file names, so watch out:
- `proftpd` โ forbidden characters: `*`
- `pureftpd` โ forbidden characters: `\ [ ]`
Good news tho ๐ โ this backend's interactive configuration wizard hands you a selection of sensible encoding settings for the major FTP servers: <cyan>ProFTPd</cyan>, <cyan>PureFTPd</cyan>, <cyan>VsFTPd</cyan>. Just hit a selection number when it prompts you. Slay.
---
### ๐ Standard options ๐
Here are the Standard options specific to ftp (FTP). bestie we're going in order, no skipping ๐ซถ
**`--ftp-host`**
FTP host to connect to.
E.g. `"ftp.example.com"`.
Properties:
- Config: `host`
- Env Var: `RCLONE_FTP_HOST`
- Type: `string`
- Required: `true`
**`--ftp-user`**
FTP username.
Properties:
- Config: `user`
- Env Var: `RCLONE_FTP_USER`
- Type: `string`
- Default: `"$USER"`
**`--ftp-port`**
FTP port number.
Properties:
- Config: `port`
- Env Var: `RCLONE_FTP_PORT`
- Type: `int`
- Default: `21`
**`--ftp-pass`**
FTP password.
> NB Input to this **must** be obscured โ see `rclone obscure` (`https://rclone.org/commands/rclone_obscure/`). Don't rawdog your password in there, bestie ๐ญ
Properties:
- Config: `pass`
- Env Var: `RCLONE_FTP_PASS`
- Type: `string`
- Required: `false`
**`--ftp-tls`**
Use Implicit FTPS (FTP over TLS).
When you're on implicit FTP over TLS the client connects using TLS <purple>right from the start</purple>, which breaks compatibility with non-TLS-aware servers. This is usually served over port `990` rather than port `21`. **Cannot** be used in combination with explicit FTPS.
Properties:
- Config: `tls`
- Env Var: `RCLONE_FTP_TLS`
- Type: `bool`
- Default: `false`
**`--ftp-explicit-tls`**
Use Explicit FTPS (FTP over TLS).
With explicit FTP over TLS the client explicitly asks the server for security so it can upgrade a plain text connection to an encrypted one. **Cannot** be used in combination with implicit FTPS.
Properties:
- Config: `explicit_tls`
- Env Var: `RCLONE_FTP_EXPLICIT_TLS`
- Type: `bool`
- Default: `false`
---
### ๐ฅ Advanced options ๐ฅ
Here are the Advanced options specific to ftp (FTP). buckle up babes, this is the long one โจ
**`--ftp-concurrency`**
Maximum number of FTP simultaneous connections, `0` for unlimited.
> Note that setting this is **very likely** to cause deadlocks so it should be used with care. ๐
If you are doing a sync or copy then make sure concurrency is **one more** than the sum of `--transfers` and `--checkers`.
If you use `--check-first` then it just needs to be one more than the maximum of `--checkers` and `--transfers`.
So for concurrency 3 you'd use `--checkers 2 --transfers 2 --check-first` or `--checkers 1 --transfers 1`.
Properties:
- Config: `concurrency`
- Env Var: `RCLONE_FTP_CONCURRENCY`
- Type: `int`
- Default: `0`
**`--ftp-no-check-certificate`**
Do not verify the TLS certificate of the server.
Properties:
- Config: `no_check_certificate`
- Env Var: `RCLONE_FTP_NO_CHECK_CERTIFICATE`
- Type: `bool`
- Default: `false`
**`--ftp-disable-epsv`**
Disable using EPSV even if server advertises support.
Properties:
- Config: `disable_epsv`
- Env Var: `RCLONE_FTP_DISABLE_EPSV`
- Type: `bool`
- Default: `false`
**`--ftp-disable-mlsd`**
Disable using MLSD even if server advertises support.
Properties:
- Config: `disable_mlsd`
- Env Var: `RCLONE_FTP_DISABLE_MLSD`
- Type: `bool`
- Default: `false`
**`--ftp-disable-utf8`**
Disable using UTF-8 even if server advertises support.
Properties:
- Config: `disable_utf8`
- Env Var: `RCLONE_FTP_DISABLE_UTF8`
- Type: `bool`
- Default: `false`
**`--ftp-writing-mdtm`**
Use MDTM to set modification time (VsFtpd quirk)
Properties:
- Config: `writing_mdtm`
- Env Var: `RCLONE_FTP_WRITING_MDTM`
- Type: `bool`
- Default: `false`
**`--ftp-force-list-hidden`**
Use `LIST -a` to force listing of hidden files and folders. This will disable the use of MLSD.
Properties:
- Config: `force_list_hidden`
- Env Var: `RCLONE_FTP_FORCE_LIST_HIDDEN`
- Type: `bool`
- Default: `false`
**`--ftp-idle-timeout`**
Max time before closing idle connections.
If no connections have been returned to the connection pool in the time given, rclone will empty the connection pool.
Set to `0` to keep connections indefinitely.
Properties:
- Config: `idle_timeout`
- Env Var: `RCLONE_FTP_IDLE_TIMEOUT`
- Type: `Duration`
- Default: `1m0s`
**`--ftp-close-timeout`**
Maximum time to wait for a response to close.
Properties:
- Config: `close_timeout`
- Env Var: `RCLONE_FTP_CLOSE_TIMEOUT`
- Type: `Duration`
- Default: `1m0s`
**`--ftp-tls-cache-size`**
Size of TLS session cache for all control and data connections.
TLS cache allows to resume TLS sessions and reuse PSK between connections. Increase if default size is not enough resulting in TLS resumption errors. Enabled by default. Use `0` to disable.
Properties:
- Config: `tls_cache_size`
- Env Var: `RCLONE_FTP_TLS_CACHE_SIZE`
- Type: `int`
- Default: `32`
**`--ftp-disable-tls13`**
Disable TLS 1.3 (workaround for FTP servers with buggy TLS)
Properties:
- Config: `disable_tls13`
- Env Var: `RCLONE_FTP_DISABLE_TLS13`
- Type: `bool`
- Default: `false`
**`--ftp-allow-insecure-tls-ciphers`**
Allow insecure TLS ciphers
Setting this flag will allow the usage of the following TLS ciphers **in addition to the secure defaults** (so yeah, it's exactly as sketchy as it sounds, be careful bestie ๐):
- `TLS_RSA_WITH_AES_128_GCM_SHA256`
Properties:
- Config: `allow_insecure_tls_ciphers`
- Env Var: `RCLONE_FTP_ALLOW_INSECURE_TLS_CIPHERS`
- Type: `bool`
- Default: `false`
**`--ftp-shut-timeout`**
Maximum time to wait for data connection closing status.
Properties:
- Config: `shut_timeout`
- Env Var: `RCLONE_FTP_SHUT_TIMEOUT`
- Type: `Duration`
- Default: `1m0s`
**`--ftp-ask-password`**
Allow asking for FTP password when needed.
If this is set and no password is supplied then rclone will ask for a password
Properties:
- Config: `ask_password`
- Env Var: `RCLONE_FTP_ASK_PASSWORD`
- Type: `bool`
- Default: `false`
**`--ftp-socks-proxy`**
Socks 5 proxy host.
Supports the format `user:pass@host:port`, `user@host:port`, `host:port`.
Example:
myUser:myPass@localhost:9005
Properties:
- Config: `socks_proxy`
- Env Var: `RCLONE_FTP_SOCKS_PROXY`
- Type: `string`
- Required: `false`
**`--ftp-http-proxy`**
URL for HTTP CONNECT proxy
Set this to a URL for an HTTP proxy which supports the HTTP CONNECT verb.
Supports the format `http://user:pass@host:port`, `http://host:port`, `http://host`.
Example:
http://myUser:myPass@proxyhostname.example.com:8000
Properties:
- Config: `http_proxy`
- Env Var: `RCLONE_FTP_HTTP_PROXY`
- Type: `string`
- Required: `false`
**`--ftp-no-check-upload`**
Don't check the upload is OK
Normally rclone will try to check the upload exists after it has uploaded a file, to make sure the size and modification time are as expected.
This flag stops rclone doing these checks. This enables uploading to folders which are write only.
> You will **likely need to use the `--inplace` flag also** if uploading to a write only folder. ๐
Properties:
- Config: `no_check_upload`
- Env Var: `RCLONE_FTP_NO_CHECK_UPLOAD`
- Type: `bool`
- Default: `false`
**`--ftp-encoding`**
The encoding for the backend.
See the encoding section in the overview (`https://rclone.org/overview/#encoding`) for more info.
Properties:
- Config: `encoding`
- Env Var: `RCLONE_FTP_ENCODING`
- Type: `Encoding`
- Default: `Slash,Del,Ctl,RightSpace,Dot`
- Examples:
- `"Asterisk,Ctl,Dot,Slash"`
- ProFTPd can't handle `'*'` in file names
- `"BackSlash,Ctl,Del,Dot,RightSpace,Slash,SquareBracket"`
- PureFTPd can't handle `'[]'` or `'*'` in file names
- `"Ctl,LeftPeriod,Slash"`
- VsFTPd can't handle file names starting with dot
**`--ftp-description`**
Description of the remote.
Properties:
- Config: `description`
- Env Var: `RCLONE_FTP_DESCRIPTION`
- Type: `string`
- Required: `false`
---
### ๐ญ Limitations ๐ญ
FTP servers acting as rclone remotes **must support passive mode**. The mode cannot be configured โ passive is the only supported one. Rclone's FTP implementation is **not compatible with active mode**, because the library it uses doesn't support it (`https://github.com/jlaffaye/ftp/issues/29`). And honestly it will likely **never** be supported, due to security concerns. So that door is closed fr fr ๐
Rclone's FTP backend supports **no checksums at all**, but it can compare file sizes.
`rclone about` is **not supported** by the FTP backend. And backends without this capability can't determine free space for an rclone mount, and can't use policy `mfs` (most free space) as a member of an rclone union remote.
See List of backends that do not support `rclone about` (`https://rclone.org/overview/#optional-features`) and `rclone about` (`https://rclone.org/commands/rclone_about/`).
And last thing, the implementation of `--dump headers`, `--dump bodies`, `--dump auth` for debugging **isn't the same** as for rclone HTTP based backends โ it has less fine grained control. Not a bug, just how it is ๐ฆ
- `--timeout` isn't supported (but `--contimeout` is, bestie โ yes they're literally different things ๐
).
- `--bind` isn't supported. nope, not a thing here โจ
- Rclone's FTP backend *could* support server-side move but does not at present. (it's giving "someday, maybe" energy ๐ญ)
- The `ftp_proxy` environment variable is not currently supported. ๐
## Modification times โจ
File modification time (timestamps) is supported to <green>1 second resolution</green> for the major FTP servers: <pink>ProFTPd</pink>, <pink>PureFTPd</pink>, <pink>VsFTPd</pink>, and <pink>FileZilla FTP server</pink>. Heads up though โ the <yellow>VsFTPd</yellow> server has a non-standard implementation of time-related protocol commands and needs a special configuration setting: `writing_mdtm = true`.
Support for precise file time with other FTP servers varies depending on what protocol extensions they advertise. If all the `MLSD`, `MDTM` and `MFTM` extensions are present, rclone will use them together to provide precise time. Otherwise the times you see on the FTP server through rclone are those of the last file upload. (iykyk ๐ญ)
You can use the following command to check whether rclone can use precise time with your FTP server:
rclone backend features your_ftp_remote:
(the trailing colon is important!). Look for the number in the line tagged by `Precision` designating the remote time precision expressed as nanoseconds.
- A value of `1000000000` means that file time precision of 1 second is available. slay โจ
- A value of `3153600000000000000` (or another large number) means "unsupported". ๐
---
# Gofile ๐
Gofile (<blue>https://gofile.io</blue>) is a content storage and distribution platform. Its aim is to provide as much service as possible for free or at a very low price.
The initial setup for Gofile involves logging in to the web interface and going to the "My Profile" section. Copy the "Account API token" for use in the config file.
> Note that if you wish to connect rclone to Gofile you will need a premium account. ๐
## Configuration ๐
Here is an example of how to make a remote called `remote`. First run:
rclone config
This will guide you through an interactive setup process:
No remotes found, make a new one? n) New remote s) Set configuration password q) Quit config n/s/q> n
Enter name for new remote. name> remote
Option Storage. Type of storage to configure. Choose a number from below, or type in your own value. XX / Gofile \ (gofile) Storage> gofile
Option access_token. API Access token You can get this from the web control panel. Enter a value. Press Enter to leave empty. access_token> YOURACCESSTOKEN
Edit advanced config? y) Yes n) No (default) y/n> n
Configuration complete. Options:
- type: gofile
- access_token: YOURACCESSTOKEN Keep this "remote" remote? y) Yes this is OK (default) e) Edit this remote d) Delete this remote y/e/d> y
Once configured you can then use rclone like this (replace `remote` with the name you gave your remote):
List directories and files in the top level of your Gofile:
rclone lsf remote:
To copy a local directory to a Gofile directory called `backup`:
rclone copy /home/source remote:backup
## Modification times and hashes ๐ฆ
Gofile supports modification times with a resolution of <green>1 second</green>.
Gofile supports MD5 hashes, so you can use the `--checksum` flag. ๐
## Restricted filename characters ๐ธ
In addition to the default restricted characters set (<blue>https://rclone.org/overview/#restricted-characters</blue>) the following characters are also replaced:
Character Value Replacement โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ ! 0x21 ๏ผ " 0x22 ๏ผ
- 0x2A ๏ผ : 0x3A ๏ผ < 0x3C ๏ผ
0x3E ๏ผ
? 0x3F ๏ผ \ 0x5C ๏ผผ
| 0x7C ๏ฝ |
File names can also not start or end with the following characters. These only get replaced if they are the first or last character in the name:
Character Value Replacement โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ . 0x2E ๏ผ
Invalid UTF-8 bytes will also be replaced (<blue>https://rclone.org/overview/#invalid-utf8</blue>), as they can't be used in JSON strings.
## Public Links ๐
Gofile supports `rclone link` to make public links to files or directories. If you specify a directory it will download as a zip file. You can use the `--expire` flag to specify the time the link should be valid. Note that `rclone link --unlink` removes all the public links for a file. ๐
## Root folder ID ๐ณ
You can set the `root_folder_id` for rclone. This is the directory (identified by its Folder ID) that rclone considers to be the root of your Gofile drive.
Normally you will leave this blank and rclone will determine the correct root to use itself and fill in the value in the config file.
However you can set this to restrict rclone to a specific folder hierarchy.
In order to do this you will have to find the Folder ID of the directory you wish rclone to display.
You can do this with rclone:
$ rclone lsf -Fip --dirs-only remote: d6341f53-ee65-4f29-9f59-d11e8070b2a0;Files/ f4f5c9b8-6ece-478b-b03e-4538edfe5a1c;Photos/ d50e356c-29ca-4b27-a3a7-494d91026e04;Videos/
The ID to use is the part before the `;` so you could set:
root_folder_id = d6341f53-ee65-4f29-9f59-d11e8070b2a0
To restrict rclone to the `Files` directory. ๐
## Standard options โจ
Here are the Standard options specific to gofile (Gofile).
### --gofile-access-token
API Access token
You can get this from the web control panel.
Properties:
- Config: `access_token`
- Env Var: `RCLONE_GOFILE_ACCESS_TOKEN`
- Type: `string`
- Required: `false`
## Advanced options ๐
Here are the Advanced options specific to gofile (Gofile).
### --gofile-root-folder-id
ID of the root folder
Leave this blank normally, rclone will fill it in automatically.
If you want rclone to be restricted to a particular folder you can fill it in - see the docs for more info.
Properties:
- Config: `root_folder_id`
- Env Var: `RCLONE_GOFILE_ROOT_FOLDER_ID`
- Type: `string`
- Required: `false`
### --gofile-account-id
Account ID
Leave this blank normally, rclone will fill it in automatically.
Properties:
- Config: `account_id`
- Env Var: `RCLONE_GOFILE_ACCOUNT_ID`
- Type: `string`
- Required: `false`
### --gofile-list-chunk
Number of items to list in each call
Properties:
- Config: `list_chunk`
- Env Var: `RCLONE_GOFILE_LIST_CHUNK`
- Type: `int`
- Default: `1000`
### --gofile-encoding
The encoding for the backend.
See the encoding section in the overview (<blue>https://rclone.org/overview/#encoding</blue>) for more info.
Properties:
- Config: `encoding`
- Env Var: `RCLONE_GOFILE_ENCODING`
- Type: `Encoding`
- Default: `Slash,LtGt,DoubleQuote,Colon,Question,Asterisk,Pipe,BackSlash,Del,Ctl,LeftPeriod,RightPeriod,InvalidUtf8,Dot,Exclamation`
### --gofile-description
Description of the remote.
Properties:
- Config: `description`
- Env Var: `RCLONE_GOFILE_DESCRIPTION`
- Type: `string`
- Required: `false`
## Limitations ๐ง
Gofile only supports filenames up to <yellow>255 characters</yellow> in length, where a character is a unicode character.
Directories should not be cached for more than 24h otherwise files in the directory may not be downloadable. In practice this means when using a VFS based rclone command such as `rclone mount` you should make sure `--dir-cache-time` is less than 24h. โฐ
> Note that Gofile is currently limited to a total of 100,000 items. If you attempt to upload more than that you will get `error-limit-100000`. This limit may be lifted in the future. ๐
## Duplicated files ๐
Gofile is capable of having files with duplicated file names. For instance two files called `hello.txt` in the same directory.
Rclone cannot sync that to a normal file system but it can be fixed with the `rclone dedupe` command.
Duplicated files cause problems with the syncing and you will see messages in the log about duplicates.
Use `rclone dedupe` to fix duplicated files. ๐
---
# Google Cloud Storage ๐
Paths are specified as `remote:bucket` (or `remote:` for the `lsd` command.) You may put subdirectories in too, e.g. `remote:bucket/path/to/dir`.
## Configuration ๐
The initial setup for google cloud storage involves getting a token from Google Cloud Storage which you need to do in your browser. `rclone config` walks you through it.
Here is an example of how to make a remote called `remote`. First run:
rclone config
This will guide you through an interactive setup process:
n) New remote d) Delete remote q) Quit config e/n/d/q> n name> remote Type of storage to configure. Choose a number from below, or type in your own value [snip] XX / Google Cloud Storage (this is not Google Drive) \ "google cloud storage" [snip] Storage> google cloud storage Google Application Client Id - leave blank normally. client_id> Google Application Client Secret - leave blank normally. client_secret> Project number optional - needed only for list/create/delete buckets - see your developer console. project_number> 12345678 Service Account Credentials JSON file path - needed only if you want use SA instead of interactive login. service_account_file> Access Control List for new objects. Choose a number from below, or type in your own value 1 / Object owner gets OWNER access, and all Authenticated Users get READER access. \ "authenticatedRead" 2 / Object owner gets OWNER access, and project team owners get OWNER access. \ "bucketOwnerFullControl" 3 / Object owner gets OWNER access, and project team owners get READER access. \ "bucketOwnerRead" 4 / Object owner gets OWNER access [default if left blank]. \ "private" 5 / Object owner gets OWNER access, and project team members get access according to their roles. \ "projectPrivate" 6 / Object owner gets OWNER access, and all Users get READER access. \ "publicRead" object_acl> 4 Access Control List for new buckets. Choose a number from below, or type in your own value 1 / Project team owners get OWNER access, and all Authenticated Users get READER access. \ "authenticatedRead" 2 / Project team owners get OWNER access [default if left blank]. \ "private" 3 / Project team members get access according to their roles. \ "projectPrivate" 4 / Project team owners get OWNER access, and all Users get READER access. \ "publicRead" 5 / Project team owners get OWNER access, and all Users get WRITER access. \ "publicReadWrite" bucket_acl> 2 Location for the newly created buckets. Choose a number from below, or type in your own value 1 / Empty for default location (US). \ "" 2 / Multi-regional location for Asia. \ "asia" 3 / Multi-regional location for Europe. \ "eu" 4 / Multi-regional location for United States. \ "us" 5 / Taiwan. \ "asia-east1" 6 / Tokyo. \ "asia-northeast1" 7 / Singapore. \ "asia-southeast1" 8 / Sydney. \ "australia-southeast1" 9 / Belgium. \ "europe-west1" 10 / London. \ "europe-west2" 11 / Iowa. \ "us-central1" 12 / South Carolina. \ "us-east1" 13 / Northern Virginia. \ "us-east4" 14 / Ohio. \ "us-east5" 15 / Oregon. \ "us-west1" location> 12 The storage class to use when storing objects in Google Cloud Storage. Choose a number from below, or type in your own value 1 / Default \ "" 2 / Multi-regional storage class \ "MULTI_REGIONAL" 3 / Regional storage class \ "REGIONAL" 4 / Nearline storage class \ "NEARLINE" 5 / Coldline storage class \ "COLDLINE" 6 / Durable reduced availability storage class \ "DURABLE_REDUCED_AVAILABILITY" storage_class> 5 Remote config Use web browser to automatically authenticate rclone with remote?
- Say Y if the machine running rclone has a web browser you can use
- Say N if running rclone on a (remote) machine without web browser access If not sure try Y. If Y failed, try N. y) Yes n) No y/n> y If your browser doesn't open automatically go to the following link: http://127.0.0.1:53682/auth Log in and authorize rclone for access Waiting for code... Got code Configuration complete. Options:
- type: google cloud storage
- client_id:
- client_secret:
- token: {"AccessToken":"xxxx.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","RefreshToken":"x/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx_xxxxxxxxx","Expiry":"2014-07-17T20:49:14.929208288+01:00","Extra":null}
- project_number: 12345678
- object_acl: private
- bucket_acl: private Keep this "remote" remote? y) Yes this is OK e) Edit this remote d) Delete this remote y/e/d> y
Okay bestie, that whole wall of text was just you manifesting a <purple>remote</purple> โจ and here's the part that matters: see the remote setup docs (https://rclone.org/remote_setup/) for how to set it up on a machine without an internet-connected web browser available. Like, that machine is offline, it's giving cozy but inconvenient ๐
.
> Heads up! rclone runs a <hotpink>webserver</hotpink> on your local machine to collect the token as returned from Google if using web browser to automatically authenticate. This only runs from the moment it opens your browser to the moment you get back the verification code. This is on `http://127.0.0.1:53682/` and this it may require you to unblock it temporarily if you are running a host firewall, or use manual mode. Literally just a lil temporary guest, no cap.
This remote is called `remote` and can now be used like this ๐
See all the buckets in your project
rclone lsd remote:
Make a new bucket
rclone mkdir remote:bucket
List the contents of a bucket
rclone ls remote:bucket
Sync `/home/local/directory` to the remote bucket, deleting any excess files in the bucket.
rclone sync --interactive /home/local/directory remote:bucket
---
### ๐ Service Account support
You can set up rclone with Google Cloud Storage in an <cyan>unattended mode</cyan>, i.e. not tied to a specific end-user Google account. This is useful when you want to synchronise files onto machines that don't have actively logged-in users, for example build machines. Fr fr, the machines that just vibe and work with nobody watching ๐ซถ.
To get credentials for Google Cloud Platform IAM Service Accounts (https://cloud.google.com/iam/docs/service-accounts), please head to the Service Account (https://console.cloud.google.com/permissions/serviceaccounts) section of the Google Developer Console. Service Accounts behave just like normal User permissions in Google Cloud Storage ACLs (https://cloud.google.com/storage/docs/access-control), so you can limit their access (e.g. make them read only). After creating an account, a JSON file containing the Service Account's credentials will be downloaded onto your machines. These credentials are what rclone will use for authentication. Iconic behavior honestly ๐.
To use a Service Account instead of OAuth2 token flow, enter the path to your Service Account credentials at the `service_account_file` prompt and rclone won't use the browser based authentication flow. If you'd rather stuff the contents of the credentials file into the rclone config file, you can set `service_account_credentials` with the actual contents of the file instead, or set the equivalent environment variable.
---
### ๐ฅ Service Account Authentication with Access Tokens
Another option for service account authentication is to use access tokens via `gcloud impersonate-service-account`. Access tokens protect security by avoiding the use of the JSON key file, which can be breached. They also bypass oauth login flow, which is simpler on remote VMs that lack a web browser. Security but make it โจconvenientโจ.
If you already have a working service account, skip to step 3.
1. Create a service account using
gcloud iam service-accounts create gcs-read-only
You can re-use an existing service account as well (like the one created above)
2. Attach a Viewer (read-only) or User (read-write) role to the service account
$ PROJECT_ID=my-project $ gcloud --verbose iam service-accounts add-iam-policy-binding \ gcs-read-only@${PROJECT_ID}.iam.gserviceaccount.com \ --member=serviceAccount:gcs-read-only@${PROJECT_ID}.iam.gserviceaccount.com \ --role=roles/storage.objectViewer
Use the Google Cloud console to identify a limited role. Some relevant pre-defined roles:
- `roles/storage.objectUser` -- read-write access but no admin privileges
- `roles/storage.objectViewer` -- read-only access to objects
- `roles/storage.admin` -- create buckets & administrative roles
3. Get a temporary access key for the service account
$ gcloud auth application-default print-access-token \ --impersonate-service-account \ gcs-read-only@${PROJECT_ID}.iam.gserviceaccount.com
ya29.c.c0ASRK0GbAFEewXD [truncated]
4. Update `access_token` setting
hit <kbd>CTRL</kbd>+<kbd>C</kbd> when you see `waiting for code`. This will save the config without doing oauth flow
rclone config update ${REMOTE_NAME} access_token ya29.c.c0Axxxx
5. Run rclone as usual
rclone ls dev-gcs:${MY_BUCKET}/
---
### ๐ More Info on Service Accounts
- Official GCS Docs (https://cloud.google.com/compute/docs/access/service-accounts)
- Guide on Service Accounts using Key Files (less secure, but similar concepts) (https://forum.rclone.org/t/access-using-google-service-account/24822/2)
---
### ๐ฆ Anonymous Access
For downloads of objects that permit public access you can configure rclone to use anonymous access by setting `anonymous` to `true`. With unauthorized access you can't write or create files but only read or list those buckets and objects that have public read access. Look-but-don't-touch energy, respectfully ๐.
---
### ๐ Application Default Credentials
If no other source of credentials is provided, rclone will fall back to Application Default Credentials (https://cloud.google.com/video-intelligence/docs/common/auth#authenticating_with_application_default_credentials) this is useful both when you already have configured authentication for your developer account, or in production when running on a google compute host. Note that if running in docker, you may need to run additional commands on your google compute machine - see this page (https://cloud.google.com/container-registry/docs/advanced-authentication#gcloud_as_a_docker_credential_helper).
Note that in the case application default credentials are used, there is no need to explicitly configure a project number. Periodt ๐
.
### <cyan>--fast-list</cyan>
ok so this remote is one of the cool kids โ it **supports `--fast-list`** โจ which means you can get away with **fewer transactions** in exchange for using **more memory**. Pick your fighter: less network chatter, more RAM. Head to the rclone docs at `https://rclone.org/docs/#fast-list` for the full lore ๐
---
### Custom upload headers ๐ธ
You can set custom upload headers with the **`--header-upload`** flag. Google Cloud Storage is down for the headers described in the working with metadata documentation at `https://cloud.google.com/storage/docs/gsutil/addlhelp/WorkingWithObjectMetadata` ๐ซถ
The ones it speaks fluently:
- `Cache-Control`
- `Content-Disposition`
- `Content-Encoding`
- `Content-Language`
- `Content-Type`
- `X-Goog-Storage-Class`
- `X-Goog-Meta-`
Like, for example:
--header-upload "Content-Type text/potato"
And bestie, peep this โ that **last one** in the list is specifically for setting **custom metadata**, and it goes like:
--header-upload "x-goog-meta-key: value"
๐
---
### Modification times โฐ
Google Cloud Storage stores `md5sum` **natively** โ iconic, no notes. Meanwhile Google's gsutil tool (`https://cloud.google.com/storage/docs/gsutil`) stores modification time with **one-second precision** as `goog-reserved-file-mtime` in the file metadata.
So to keep things compatible with gsutil, rclone stores modification time in **2 separate metadata entries**:
- `mtime` uses **RFC3339 format** with **one-nanosecond precision**
- `goog-reserved-file-mtime` uses **Unix timestamp format** with **one-second precision**
When rclone needs to get the modification time from object metadata, it reads the metadata in this order, no skipping: `mtime`, then `goog-reserved-file-mtime`, then `object updated time` ๐
> โ ๏ธ Heads up: rclone's **default modify window is `1ns`**. Files uploaded by gsutil only carry timestamps with **one-second precision**. So if you use rclone to sync files that were previously uploaded by gsutil, rclone **will attempt to update modification time for all these files**. If you want to dodge those possibly unnecessary updates, use `--modify-window 1s`. Consider yourself warned, bestie ๐
---
### Restricted filename characters ๐ซ
Here's the forbidden list, the characters that get swapped out:
- `NUL` โ value `0x00` โ replaced with `โ`
- `LF` โ value `0x0A` โ replaced with `โ`
- `CR` โ value `0x0D` โ replaced with `โ`
- `/` โ value `0x2F` โ replaced with `๏ผ`
And **invalid UTF-8 bytes will also be replaced** (see `https://rclone.org/overview/#invalid-utf8`), because real talk, they can't be used in JSON strings ๐
---
## โจ Standard options โจ
Okay so here are the **Standard options** specific to google cloud storage (Google Cloud Storage โ this is **not** Google Drive, iykyk) ๐
---
- **`--gcs-client-id`** โ OAuth Client Id.
Leave blank normally.
- **Config:** `client_id`
- **Env Var:** `RCLONE_GCS_CLIENT_ID`
- **Type:** `string`
- **Required:** `false`
- **`--gcs-client-secret`** โ OAuth Client Secret.
Leave blank normally.
- **Config:** `client_secret`
- **Env Var:** `RCLONE_GCS_CLIENT_SECRET`
- **Type:** `string`
- **Required:** `false`
- **`--gcs-project-number`** โ Project number.
Optional โ needed only for list/create/delete buckets โ see your developer console.
- **Config:** `project_number`
- **Env Var:** `RCLONE_GCS_PROJECT_NUMBER`
- **Type:** `string`
- **Required:** `false`
- **`--gcs-user-project`** โ User project.
Optional โ needed only for requester pays.
- **Config:** `user_project`
- **Env Var:** `RCLONE_GCS_USER_PROJECT`
- **Type:** `string`
- **Required:** `false`
- **`--gcs-service-account-file`** โ Service Account Credentials JSON file path.
Leave blank normally. Needed only if you want use SA instead of interactive login.
Leading `~` will be expanded in the file name as will environment variables such as `${RCLONE_CONFIG_DIR}`.
- **Config:** `service_account_file`
- **Env Var:** `RCLONE_GCS_SERVICE_ACCOUNT_FILE`
- **Type:** `string`
- **Required:** `false`
- **`--gcs-anonymous`** โ Access public buckets and objects without credentials.
Set to `'true'` if you just want to download files and don't configure credentials.
- **Config:** `anonymous`
- **Env Var:** `RCLONE_GCS_ANONYMOUS`
- **Type:** `bool`
- **Default:** `false`
- **`--gcs-object-acl`** โ Access Control List for new objects.
- **Config:** `object_acl`
- **Env Var:** `RCLONE_GCS_OBJECT_ACL`
- **Type:** `string`
- **Required:** `false`
- **Examples:**
- `"authenticatedRead"`
- Object owner gets `OWNER` access.
- All Authenticated Users get `READER` access.
- `"bucketOwnerFullControl"`
- Object owner gets `OWNER` access.
- Project team owners get `OWNER` access.
- `"bucketOwnerRead"`
- Object owner gets `OWNER` access.
- Project team owners get `READER` access.
- `"private"`
- Object owner gets `OWNER` access.
- Default if left blank.
- `"projectPrivate"`
- Object owner gets `OWNER` access.
- Project team members get access according to their roles.
- `"publicRead"`
- Object owner gets `OWNER` access.
- All Users get `READER` access.
- **`--gcs-bucket-acl`** โ Access Control List for new buckets.
- **Config:** `bucket_acl`
- **Env Var:** `RCLONE_GCS_BUCKET_ACL`
- **Type:** `string`
- **Required:** `false`
- **Examples:**
- `"authenticatedRead"`
- Project team owners get `OWNER` access.
- All Authenticated Users get `READER` access.
- `"private"`
- Project team owners get `OWNER` access.
- Default if left blank.
- `"projectPrivate"`
- Project team members get access according to their roles.
- `"publicRead"`
- Project team owners get `OWNER` access.
- All Users get `READER` access.
- `"publicReadWrite"`
- Project team owners get `OWNER` access.
- All Users get `WRITER` access.
- **`--gcs-bucket-policy-only`** โ Access checks should use bucket-level IAM policies.
If you want to upload objects to a bucket with Bucket Policy Only set then you will need to set this.
When it is set, rclone:
- ignores ACLs set on buckets
- ignores ACLs set on objects
- creates buckets with Bucket Policy Only set
Docs: `https://cloud.google.com/storage/docs/bucket-policy-only`
- **Config:** `bucket_policy_only`
- **Env Var:** `RCLONE_GCS_BUCKET_POLICY_ONLY`
- **Type:** `bool`
- **Default:** `false`
- **`--gcs-location`** โ Location for the newly created buckets.
- **Config:** `location`
- **Env Var:** `RCLONE_GCS_LOCATION`
- **Type:** `string`
- **Required:** `false`
- **Examples:**
- `""`
- Empty for default location (US)
- `"asia"`
- Multi-regional location for Asia
- `"eu"`
- Multi-regional location for Europe
- `"us"`
- Multi-regional location for United States
- `"asia-east1"`
- Taiwan
- `"asia-east2"`
- Hong Kong
- `"asia-northeast1"`
- Tokyo
- `"asia-northeast2"`
- Osaka
- `"asia-northeast3"`
- Seoul
- `"asia-south1"`
- Mumbai
- `"asia-south2"`
- Delhi
- `"asia-southeast1"`
- Singapore
- `"asia-southeast2"`
- Jakarta
- `"australia-southeast1"`
- Sydney
- `"australia-southeast2"`
- Melbourne
- `"europe-north1"`
- Finland
- `"europe-west1"`
- Belgium
- `"europe-west2"`
- London
- `"europe-west3"`
- Frankfurt
- `"europe-west4"`
- Netherlands
- `"europe-west6"`
- Zรผrich
- `"europe-central2"`
- Warsaw
- `"us-central1"`
- Iowa
- `"us-east1"`
- South Carolina
- `"us-east4"`
- Northern Virginia
- `"us-east5"`
- Ohio
- `"us-west1"`
- Oregon
- `"us-west2"`
- California
- `"us-west3"`
- Salt Lake City
- `"us-west4"`
- Las Vegas
- `"northamerica-northeast1"`
- Montrรฉal
- `"northamerica-northeast2"`
- Toronto
- `"southamerica-east1"`
- Sรฃo Paulo
- `"southamerica-west1"`
- Santiago
- `"asia1"`
- Dual region: `asia-northeast1` and `asia-northeast2`.
- `"eur4"`
- Dual region: `europe-north1` and `europe-west4`.
- `"nam4"`
- Dual region: `us-central1` and `us-east1`.
- **`--gcs-storage-class`** โ The storage class to use when storing objects in Google Cloud Storage.
- **Config:** `storage_class`
- **Env Var:** `RCLONE_GCS_STORAGE_CLASS`
- **Type:** `string`
- **Required:** `false`
- **Examples:**
- `""`
- Default
- `"MULTI_REGIONAL"`
- Multi-regional storage class
- `"REGIONAL"`
- Regional storage class
- `"NEARLINE"`
- Nearline storage class
- `"COLDLINE"`
- Coldline storage class
- `"ARCHIVE"`
- Archive storage class
- `"DURABLE_REDUCED_AVAILABILITY"`
- Durable reduced availability storage class
- **`--gcs-env-auth`** โ Get GCP IAM credentials from runtime (environment variables or instance meta data if no env vars).
Only applies if `service_account_file` and `service_account_credentials` is blank.
- **Config:** `env_auth`
- **Env Var:** `RCLONE_GCS_ENV_AUTH`
- **Type:** `bool`
- **Default:** `false`
- **Examples:**
- `"false"`
- Enter credentials in the next step.
- `"true"`
- Get GCP IAM credentials from the environment (env vars or IAM).
---
## ๐ Advanced options ๐
And now the **Advanced options** specific to google cloud storage (Google Cloud Storage โ again, **not** Google Drive, bestie) ๐ฆ
---
- **`--gcs-token`** โ OAuth Access Token as a JSON blob.
- **Config:** `token`
- **Env Var:** `RCLONE_GCS_TOKEN`
- **Type:** `string`
- **Required:** `false`
- **`--gcs-auth-url`** โ Auth server URL.
Leave blank to use the provider defaults.
- **Config:** `auth_url`
- **Env Var:** `RCLONE_GCS_AUTH_URL`
- **Type:** `string`
- **Required:** `false`
- **`--gcs-token-url`** โ Token server url.
Leave blank to use the provider defaults.
- **Config:** `token_url`
- **Env Var:** `RCLONE_GCS_TOKEN_URL`
- **Type:** `string`
- **Required:** `false`
- **`--gcs-client-credentials`** โ Use client credentials OAuth flow.
This will use the OAUTH2 client Credentials Flow as described in RFC 6749.
> โ ๏ธ Note that this option is **NOT** supported by all backends, so don't come for me if yours ghosts you ๐
- **Config:** `client_credentials`
- **Env Var:** `RCLONE_GCS_CLIENT_CREDENTIALS`
- **Type:** `bool`
- **Default:** `false`
- **`--gcs-access-token`** โ Short-lived access token.
Leave blank normally, bestie. You only need this if you wanna use a short-lived access token instead of doing the whole interactive login dance. ๐
Properties:
- **Config:** `access_token`
- **Env Var:** `RCLONE_GCS_ACCESS_TOKEN`
- **Type:** string
- **Required:** false
---
## --gcs-directory-markers
Uploads a lil empty object with a trailing slash whenever a new directory gets created โจ
Okay so real talk: bucket-based remotes literally do not support empty folders. So this option makes an empty object that ends with `/` to keep that folder existing. Iconic workaround behavior, honestly.
Properties:
- **Config:** `directory_markers`
- **Env Var:** `RCLONE_GCS_DIRECTORY_MARKERS`
- **Type:** bool
- **Default:** false
---
## --gcs-no-check-bucket
If set, rclone won't even attempt to check that the bucket exists or create it. ๐ซถ
This is lowkey useful when you're tryna minimise the number of transactions rclone does and you already know the bucket is there.
Properties:
- **Config:** `no_check_bucket`
- **Env Var:** `RCLONE_GCS_NO_CHECK_BUCKET`
- **Type:** bool
- **Default:** false
---
## --gcs-decompress
If set, this will decompress gzip encoded objects ๐ญ
So here's the thing: you can upload objects to GCS with `Content-Encoding: gzip` set. Normally rclone will download these files as compressed objects.
But if this flag is on, rclone decompresses those `Content-Encoding: gzip` files as they're received. The tradeoff, bestie: rclone can't check the size and hash anymore, but the file contents will be decompressed. Periodt.
Properties:
- **Config:** `decompress`
- **Env Var:** `RCLONE_GCS_DECOMPRESS`
- **Type:** bool
- **Default:** false
---
## --gcs-endpoint
Custom endpoint for the storage API. Leave it blank to use the provider default ๐ธ
> Heads up: when you use a custom endpoint that includes a subpath (like `example.org/custom/endpoint`), the subpath gets **ignored** during upload operations because of a limitation in the underlying Google API Go client library. Download and listing operations still work correctly with the full endpoint path. So if you need subpath support for uploads, just don't put subpaths in your custom endpoint config. That's the move. ๐
Properties:
- **Config:** `endpoint`
- **Env Var:** `RCLONE_GCS_ENDPOINT`
- **Type:** string
- **Required:** false
- **Examples:**
- `"storage.example.org"`
- Specify a custom endpoint
- `"storage.example.org:4443"`
- Specifying a custom endpoint with port
- `"storage.example.org:4443/gcs/api"`
- Specifying a subpath, see the note, uploads won't use the custom path!
---
## --gcs-encoding
The encoding for the backend ๐
See the encoding section in the overview (https://rclone.org/overview/#encoding) for more info.
Properties:
- **Config:** `encoding`
- **Env Var:** `RCLONE_GCS_ENCODING`
- **Type:** Encoding
- **Default:** `Slash,CrLf,InvalidUtf8,Dot`
---
## --gcs-description
Description of the remote. Just a lil label for ur baby ๐ฆ
Properties:
- **Config:** `description`
- **Env Var:** `RCLONE_GCS_DESCRIPTION`
- **Type:** string
- **Required:** false
---
# ๐ญ Limitations
`rclone about` is **not** supported by the Google Cloud Storage backend. And backends without this capability can't determine free space for an rclone mount, and can't be used as a member of an rclone union remote with policy `mfs` (most free space). So yeah, that's a no from GCS.
See List of backends that do not support rclone about (https://rclone.org/overview/#optional-features) and rclone about (https://rclone.org/commands/rclone_about/).
---
# ๐ Google Drive
Paths are specified as `drive:path`
Drive paths may be as deep as required, e.g. `drive:directory/subdirectory`. Go as deep as ur heart desires, bestie ๐ซถ
---
## Configuration
The initial setup for drive involves getting a token from Google drive which you need to do in your browser. `rclone config` walks you through it, hand in hand, like a good friend. โจ
Here is an example of how to make a remote called `remote`. First run:
rclone config
This will guide you through an interactive setup process:
No remotes found, make a new one? n) New remote r) Rename remote c) Copy remote s) Set configuration password q) Quit config n/r/c/s/q> n name> remote Type of storage to configure. Choose a number from below, or type in your own value [snip] XX / Google Drive \ "drive" [snip] Storage> drive Google Application Client Id Leave blank to use rclone's shared client_id, or if you are using a service account. The shared client_id is being retired and will stop working during 2026, so creating your own is now strongly recommended. See https://rclone.org/drive/#making-your-own-client-id for how to create your own. client_id> Google Application Client Secret Leave blank to use rclone's shared client_id, or if you are using a service account. If you created your own client_id then enter its client secret here. client_secret> Scope that rclone should use when requesting access from drive. Choose a number from below, or type in your own value 1 / Full access all files, excluding Application Data Folder. \ "drive" 2 / Read-only access to file metadata and file contents. \ "drive.readonly" / Access to files created by rclone only. 3 | These are visible in the drive website.
| File authorization is revoked when the user deauthorizes the app. |
\ "drive.file" / Allows read and write access to the Application Data folder. 4 | This is not visible in the drive website. \ "drive.appfolder" / Allows read-only access to file metadata but 5 | does not allow any access to read or download file content. \ "drive.metadata.readonly" scope> 1 Service Account Credentials JSON file path - needed only if you want use SA instead of interactive login. service_account_file> Remote config rclone's shared Google Drive client_id is being retired and will stop working during 2026. Create your own to avoid interruption: https://rclone.org/drive/#making-your-own-client-id
Continue using the shared client_id anyway? y) Yes n) No (default) y/n> n Google Application Client Id client_id> 1234567890-abcdefghijklmnop.apps.googleusercontent.com Google Application Client Secret client_secret> GOCSPX-your-client-secret Use web browser to automatically authenticate rclone with remote?
- Say Y if the machine running rclone has a web browser you can use
- Say N if running rclone on a (remote) machine without web browser access If not sure try Y. If Y failed, try N. y) Yes n) No y/n> y If your browser doesn't open automatically go to the following link: http://127.0.0.1:53682/auth Log in and authorize rclone for access Waiting for code... Got code Configure this as a Shared Drive (Team Drive)? y) Yes n) No y/n> n Configuration complete. Options: type: drive
- client_id: 1234567890-abcdefghijklmnop.apps.googleusercontent.com
- client_secret: GOCSPX-your-client-secret
- scope: drive
- root_folder_id:
- service_account_file:
- token: {"access_token":"XXX","token_type":"Bearer","refresh_token":"XXX","expiry":"2014-03-16T13:57:58.955387075Z"} Keep this "remote" remote? y) Yes this is OK e) Edit this remote d) Delete this remote y/e/d> y
See the remote setup docs (https://rclone.org/remote_setup/) for how to set it up on a machine without an internet-connected web browser available. Bestie we got u even offline ๐
Note that rclone runs a webserver on your local machine to collect the token as returned from Google if using web browser to automatically authenticate. This only runs from the moment it opens your browser to the moment you get back the verification code. This is on `http://127.0.0.1:53682/` and it may require you to unblock it temporarily if you are running a host firewall, or use manual mode.
You can then use it like this,
List directories in top level of your drive
rclone lsd remote:
List all the files in your drive
rclone ls remote:
To copy a local directory to a drive directory called `backup`
rclone copy /home/source remote:backup
---
## Scopes ๐ฅ
Rclone allows you to select which scope you would like for rclone to use. This changes what type of token is granted to rclone. The scopes are defined here (https://developers.google.com/drive/v3/web/about-auth).
A comma-separated list is allowed e.g. `drive.readonly,drive.file`.
The scope are:
---
### drive
This is the default scope and allows full access to all files, except for the Application Data Folder (see below).
Choose this one if you aren't sure. When in doubt, vibe check says: pick this one. ๐
---
### drive.readonly
This allows read only access to all files. Files may be listed and downloaded but not uploaded, renamed or deleted. Look, don't touch energy. ๐
---
### drive.file
With this scope rclone can read/view/modify only those files and folders it creates.
So if you uploaded files to drive via the web interface (or any other means) they will **not** be visible to rclone.
This can be useful if you are using rclone to backup data and you want to be sure confidential data on your drive is not visible to rclone.
Files created with this scope are visible in the web interface.
---
### drive.appfolder
This gives rclone its own private area to store files. Rclone will not be able to see any other files on your drive and you won't be able to see rclone's files from the web interface either. It's giving secret garden ๐ธ
---
### drive.metadata.readonly
This allows read only access to file names only. It does **not** allow rclone to download or upload data, or rename or delete files or directories. Names only, no content, no chaos. ๐ฆ
---
## Root folder ID
This option has been moved to the advanced section. You can set the `root_folder_id` for rclone. This is the directory (identified by its Folder ID) that rclone considers to be the root of your drive.
Normally you will leave this blank and rclone will determine the correct root to use itself. Let rclone cook ๐ง
<purple>However</purple> โ and this is the fun part โ you *can* set this to lock rclone down to one specific folder hierarchy, or to reach into the data hanging out in the <cyan>"Computers"</cyan> tab on the drive web interface (that's where stuff from Google's Backup and Sync desktop program lives).
But ngl? That's not the easiest method. The cute way is: make a shortcut to a folder over in <cyan>"Computers"</cyan> and drop it into <cyan>"My Drive."</cyan> Like, right-click the folder, hit <cyan>"Organize"</cyan>, then pick <cyan>"Add shortcut"</cyan> in the Google Drive web interface. Once that shortcut is chillin' in <cyan>"My Drive,"</cyan> rclone will show you the folder and you can play with it. See also <cyan>Shortcuts</cyan> ๐ซ
If you *do* decide to switch up your root folder though, you're gonna have to hunt down the <purple>Folder ID</purple> of the directory you want rclone to display. It's the last segment of the URL when you open that folder in the drive web interface.
So if the folder you want rclone to use has a URL that looks like
https://drive.google.com/drive/folders/1XyfxxxxxxxxxxxxxxxxxxxxxxxxxKHCh
in the browser, then you use `1XyfxxxxxxxxxxxxxxxxxxxxxxxxxKHCh` as the `root_folder_id` in the config โจ
> NB folders under the <cyan>"Computers"</cyan> tab seem to be read only (drive gives a `500` error) when using rclone โ but bestie, they're also read-only in the Google Drive web interface, probably because this folder is managed by the Google Drive Desktop tool. Top-level folders in <cyan>"Computers"</cyan> are read-only, BUT you can still interact with folders inside them using rclone ๐ซถ Those are also the folders you can make a shortcut for, exactly like I described above.
There doesn't appear to be an API to discover the folder IDs of the <cyan>"Computers"</cyan> tab โ please contact us if you know otherwise! ๐
Also note bestie: rclone can't access any data under the <cyan>"Backups"</cyan> tab on the google drive web interface yet ๐
---
## ๐ง๐ผ Service Account support
Okay so you can set up rclone with Google Drive in an *unattended* mode โ aka not tied to any specific end-user Google account. This is the moment when you wanna sync files onto machines that don't have actively logged-in users, like build machines ๐
To use a Service Account instead of the OAuth2 token flow, enter the path to your Service Account credentials at the `service_account_file` prompt during `rclone config` and rclone won't use the browser based authentication flow at all. And if you'd rather just stuff the contents of the credentials file straight into the rclone config file? You can set `service_account_credentials` with the actual contents of the file instead, or set the equivalent environment variable ๐
---
## ๐ข Use case - Google Workspace account and individual Drive
Let's say you're the administrator of a Google Workspace. The goal: read or write data on an individual's Drive account, who IS a member of the domain. We'll call the domain *`example.com`*, and the user *`foo@example.com`*.
There's a few steps we need to go through to accomplish this:
---
### 1. Create a service account for example.com
- To create a service account and obtain its credentials, go to the Google Developer Console (`https://console.developers.google.com`).
- You must have a project โ create one if you don't, and make sure you are on the selected project.
- Then go to <cyan>"IAM & admin"</cyan> -> <cyan>"Service Accounts"</cyan>.
- Use the <cyan>"Create Service Account"</cyan> button. Fill in <cyan>"Service account name"</cyan> and <cyan>"Service account ID"</cyan> with something that identifies your client.
- Select <cyan>"Create And Continue"</cyan>. Step 2 and 3 are optional.
- Click on the newly created service account
- Click <cyan>"Keys"</cyan> and then <cyan>"Add Key"</cyan> and then <cyan>"Create new key"</cyan>
- Choose type <cyan>"JSON"</cyan> and click create
- This will download a small JSON file that rclone will use for authentication.
If you ever need to remove access, press the <cyan>"Delete service account key"</cyan> button ๐
---
### 2. Allowing API access to example.com Google Drive
- Go to *`example.com`*'s Workspace Admin Console (`https://admin.google.com`)
- Go into <cyan>"Security"</cyan> (or use the search bar)
- Select <cyan>"Access and data control"</cyan> and then <cyan>"API controls"</cyan>
- Click <cyan>"Manage domain-wide delegation"</cyan>
- Click <cyan>"Add new"</cyan>
- In the <cyan>"Client ID"</cyan> field enter the service account's <cyan>"Client ID"</cyan> โ this can be found in the Developer Console under <cyan>"IAM & Admin"</cyan> -> <cyan>"Service Accounts"</cyan>, then <cyan>"View Client ID"</cyan> for the newly created service account. It is a ~21 character numerical string.
- In the next field, <cyan>"OAuth Scopes"</cyan>, enter `https://www.googleapis.com/auth/drive` to grant read/write access to Google Drive specifically. You can also use `https://www.googleapis.com/auth/drive.readonly` for read only access with `--drive-scope=drive.readonly`.
- Click <cyan>"Authorise"</cyan>
---
### 3. Configure rclone, assuming a new install
rclone config
n/s/q> n # New name>gdrive # Gdrive is an example name Storage> # Type drive client_id> # Can be left blank client_secret> # Can be left blank scope> # Select the scope use used in step 2 root_folder_id> # Can be left blank service_account_file> /home/foo/myJSONfile.json # Path to the JSON file you downloaded in step 1. y/n> # Auto config, n
---
### 4. Verify that it's working
- `rclone -v --drive-impersonate foo@example.com lsf gdrive:backup`
- The arguments do:
- `-v` โ verbose logging
- `--drive-impersonate foo@example.com` โ this is what does the magic, pretending to be user `foo`.
- `lsf` โ list files in a parsing friendly way
- `gdrive:backup` โ use the remote called `gdrive`, work in the folder named `backup`.
> Note: in case you configured a specific root folder on gdrive and rclone is unable to access the contents of that folder when using `--drive-impersonate`, do this instead:
- in the gdrive web interface, share your root folder with the user/email of the new Service Account you created/selected at step 1
- use rclone without specifying the `--drive-impersonate` option, like this: `rclone -v lsf gdrive:backup` ๐ฆ
---
## ๐ Shared drives (team drives)
If you want to configure the remote to point to a Google Shared Drive (previously known as Team Drives) then answer `y` to the question `Configure this as a Shared Drive (Team Drive)?`.
This will fetch the list of Shared Drives from google and allow you to configure which one you want to use. You can also type in a Shared Drive ID if you prefer ๐
For example:
Configure this as a Shared Drive (Team Drive)? y) Yes n) No y/n> y Fetching Shared Drive list... Choose a number from below, or type in your own value 1 / Rclone Test \ "xxxxxxxxxxxxxxxxxxxx" 2 / Rclone Test 2 \ "yyyyyyyyyyyyyyyyyyyy" 3 / Rclone Test 3 \ "zzzzzzzzzzzzzzzzzzzz" Enter a Shared Drive ID> 1 Configuration complete. Options:
- type: drive
- client_id:
- client_secret:
- token: {"AccessToken":"xxxx.x.xxxxx_xxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","RefreshToken":"1/xxxxxxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxxxx","Expiry":"2014-03-16T13:57:58.955387075Z","Extra":null}
- team_drive: xxxxxxxxxxxxxxxxxxxx Keep this "remote" remote? y) Yes this is OK e) Edit this remote d) Delete this remote y/e/d> y
---
## โก `--fast-list`
This remote supports `--fast-list` which lets you use fewer transactions in exchange for more memory. Check the rclone docs (`https://rclone.org/docs/#fast-list`) for more details ๐
It does this by combining multiple list calls into a single API request.
This works by combining many `'%s' in parents` filters into one expression. To list the contents of directories `a`, `b` and `c`, the following requests will be send by the regular `List` function:
trashed=false and 'a' in parents trashed=false and 'b' in parents trashed=false and 'c' in parents
These can now be combined into a single request:
trashed=false and ('a' in parents or 'b' in parents or 'c' in parents)
The implementation of `ListR` will put up to `50` parents filters into one request. It will use the `--checkers` value to specify the number of requests to run in parallel.
In tests, these batch requests were up to `20x` faster than the regular method. Running the following command against different sized folders gives:
rclone lsjson -vv -R --checkers=6 gdrive:folder
small folder (`220` directories, `700` files):
- without `--fast-list`: `38s`
- with `--fast-list`: `10s`
large folder (`10600` directories, `39000` files):
- without `--fast-list`: `22:05 min`
- with `--fast-list`: `58s`
---
## ๐ Modification times and hashes
Google drive stores modification times accurate to `1 ms`.
Hash algorithms `MD5`, `SHA1` and `SHA256` are supported. Note, however, that a small fraction of files uploaded may not have `SHA1` or `SHA256` hashes especially if they were uploaded before `2018` ๐ญ
---
## ๐ซ Restricted filename characters
Only Invalid UTF-8 bytes will be replaced (`https://rclone.org/overview/#invalid-utf8`), as they can't be used in JSON strings.
In contrast to other backends, `/` can also be used in names and `.` or `..` are valid names ๐
---
## ๐ Revisions
Google drive stores revisions of files. When you upload a change to an existing file to google drive using rclone it will create a new revision of that file.
Revisions follow the standard google policy which at time of writing was
- They are deleted after `30` days or `100` revisions (whatever comes first).
- They do not count towards a user storage quota.
---
## ๐๏ธ Deleting files
By default rclone will send all files to the trash when deleting files. If deleting them permanently is required then use the `--drive-use-trash=false` flag, or set the equivalent environment variable ๐
---
## ๐ Shortcuts
In March `2020` Google introduced a new feature in Google Drive called drive shortcuts (`https://support.google.com/drive/answer/9700156`) (API (`https://developers.google.com/drive/api/v3/shortcuts`)). These will (by September `2020`) replace the ability for files or folders to be in multiple folders at once (`https://cloud.google.com/blog/products/g-suite/simplifying-google-drives-folder-structure-and-sharing-models`) โจ
Shortcuts are files that link to other files on Google Drive somewhat like a symlink in unix, except they point to the underlying file data (e.g. the inode in unix terms) so they don't break if the source is renamed or moved about ๐
By default rclone treats these as follows.
For shortcuts pointing to files:
- When listing a file shortcut appears as the destination file.
- When downloading the contents of the destination file is downloaded.
- Bestie, when you update a shortcut file with a **non-shortcut** file? The shortcut gets yeeted and a fresh new file is uploaded right where the shortcut was. โจ
- When you **server-side move** (rename) it, it's the <pink>shortcut</pink> that gets renamed โ NOT the destination file. ๐
โโ๏ธ
- When you **server-side copy** it, the shortcut itself is copied, not the contents of the shortcut. (Unless `--drive-copy-shortcut-content` is in play, in which case the contents of the shortcut DO get copied. iykyk.)
- When you **delete** it, the shortcut gets deleted โ not the linked file. ๐
- When you **set the modification time**, the modification time of the **linked file** is what gets set.
For shortcuts pointing to **folders**:
- When **listing**, the shortcut shows up as a folder, and that folder will contain the contents of the linked folder (including any sub folders). ๐ฆ
- When **downloading**, the contents of the linked folder and its sub contents are downloaded.
- When **uploading** to a shortcut folder, the file lands in the linked folder.
- When **server-side moving** (renaming), the shortcut is renamed โ not the destination folder.
- When **server-side copying**, the contents of the linked folder get copied, not the shortcut.
- When **deleting** with `rclone rmdir` or `rclone purge`, the shortcut is deleted โ not the linked folder.
> ๐จ <red>NB</red> โ When deleting with `rclone remove` or `rclone mount`, the **contents of the linked folder will be deleted**. Not the shortcut. The actual stuff. Be so careful bestie. ๐ญ
The `rclone backend` command (https://rclone.org/commands/rclone_backend/) can be used to create shortcuts. ๐
Shortcuts can be completely ignored with the `--drive-skip-shortcuts` flag or the corresponding `skip_shortcuts` configuration setting.
When `rclone lsf --format i` lists a file shortcut, the ID field contains the **target file ID** followed by the **shortcut ID**, separated by a tab. This internal tab is not changed by `--separator`. ๐
If you have a folder shortcut that points at one of its own parent folders, that's an infinite recursion situation, and it's giving cursed. ๐ Rclone detects this, leaves the offending shortcut out of the listing, and logs an **ERROR**, so the rest of the drive can still be copied. Slay.
---
### ๐ธ Emptying trash ๐ธ
If you wish to empty your trash you can use the `rclone cleanup remote:` command, which will **permanently** delete all your trashed files. This command does not take any path arguments.
> Note that Google Drive takes some time (**minutes to days**) to empty the trash even though the command returns within a few seconds. No output is echoed, so there will be no confirmation even using `-v` or `-vv`. ๐
---
### ๐ Quota information ๐
To view your current quota you can use the `rclone about remote:` command, which will display your usage limit (quota), the usage in Google Drive, the size of all files in the Trash, and the space used by other Google services such as Gmail. This command does not take any path arguments. โจ
---
### ๐ Import/Export of google documents ๐
Google documents can be exported from and uploaded to Google Drive. Bestie it's a whole thing.
When rclone downloads a Google doc it chooses a format to download depending upon the `--drive-export-formats` setting. By default the export formats are `docx,xlsx,pptx,svg`, which are a sensible default for an editable document.
When choosing a format, rclone runs down the list provided **in order** and chooses the first file format the doc can be exported as from the list. If the file can't be exported to a format on the formats list, then rclone will choose a format from the default list. ๐
If you prefer an archive copy then you might use `--drive-export-formats pdf`, or if you prefer openoffice/libreoffice formats you might use `--drive-export-formats ods,odt,odp`.
Note that rclone adds the extension to the google doc, so if it is called `My Spreadsheet` on google docs, it will be exported as `My Spreadsheet.xlsx` or `My Spreadsheet.pdf` etc. ๐
When importing files into Google Drive, rclone will convert all files with an extension in `--drive-import-formats` to their associated document type. rclone will **not** convert any files by default, since the conversion is a **lossy** process. ๐ฌ
The conversion must result in a file with the **same extension** when the `--drive-export-formats` rules are applied to the uploaded document.
Here are some examples for allowed and prohibited conversions. ๐
- export-formats: *(none)*, import-formats: `odt`, Upload Ext: `odt`, Document Ext: `odt` โ **Allowed: Yes**
- export-formats: *(none)*, import-formats: `docx,odt`, Upload Ext: `odt`, Document Ext: `odt` โ **Allowed: Yes**
- export-formats: *(none)*, import-formats: `docx`, Upload Ext: `docx`, Document Ext: `docx` โ **Allowed: Yes**
- export-formats: *(none)*, import-formats: `odt`, Upload Ext: `odt`, Document Ext: `docx` โ **Allowed: No**
- export-formats: `odt,docx`, import-formats: `docx,odt`, Upload Ext: `docx`, Document Ext: `odt` โ **Allowed: No**
- export-formats: `docx,odt`, import-formats: `docx,odt`, Upload Ext: `docx`, Document Ext: `docx` โ **Allowed: Yes**
- export-formats: `docx,odt`, import-formats: `docx,odt`, Upload Ext: `odt`, Document Ext: `docx` โ **Allowed: No**
This limitation can be disabled by specifying `--drive-allow-import-name-change`. When using this flag, rclone can convert multiple files types resulting in the same document type at once, e.g. with `--drive-import-formats docx,odt,txt`, all files having these extensions would result in a document represented as a `docx` file.
> ๐จ This brings the additional risk of **overwriting a document**, if multiple files have the same stem. Many rclone operations will not handle this name change in any way. They assume an equal name when copying files and might copy the file again or delete them when the name changes. <red>Heads up fr.</red>
Here are the possible export extensions with their corresponding mime types. Most of these can also be used for importing, but there are more that are not listed here. Some of these additional ones might only be available when the operating system provides the correct MIME type entries. ๐ง
This list can be changed by Google Drive at any time and might not represent the currently available conversions. (So don't come for me if it's different, it's Google's list not mine. ๐)
- `bmp` โ `image/bmp` โ Windows Bitmap format
- `csv` โ `text/csv` โ Standard CSV format for Spreadsheets
- `doc` โ `application/msword` โ Classic Word file
- `docx` โ `application/vnd.openxmlformats-officedocument.wordprocessingml.document` โ Microsoft Office Document
- `epub` โ `application/epub+zip` โ E-book format
- `html` โ `text/html` โ An HTML Document
- `jpg` โ `image/jpeg` โ A JPEG Image File
- `json` โ `application/vnd.google-apps.script+json` โ JSON Text Format for Google Apps scripts
- `md` โ `text/markdown` โ Markdown Text Format
- `odp` โ `application/vnd.oasis.opendocument.presentation` โ Openoffice Presentation
- `ods` โ `application/vnd.oasis.opendocument.spreadsheet` โ Openoffice Spreadsheet
- `ods` โ `application/x-vnd.oasis.opendocument.spreadsheet` โ Openoffice Spreadsheet
- `odt` โ `application/vnd.oasis.opendocument.text` โ Openoffice Document
- `pdf` โ `application/pdf` โ Adobe PDF Format
- `pjpeg` โ `image/pjpeg` โ Progressive JPEG Image
- `png` โ `image/png` โ PNG Image Format
- `pptx` โ `application/vnd.openxmlformats-officedocument.presentationml.presentation` โ Microsoft Office Powerpoint
- `rtf` โ `application/rtf` โ Rich Text Format
- `svg` โ `image/svg+xml` โ Scalable Vector Graphics Format
- `tsv` โ `text/tab-separated-values` โ Standard TSV format for spreadsheets
- `txt` โ `text/plain` โ Plain Text
- `wmf` โ `application/x-msmetafile` โ Windows Meta File
- `xls` โ `application/vnd.ms-excel` โ Classic Excel file
- `xlsx` โ `application/vnd.openxmlformats-officedocument.spreadsheetml.sheet` โ Microsoft Office Spreadsheet
- `zip` โ `application/zip` โ A ZIP file of HTML, Images CSS
Google documents can also be exported as **link files**. These files will open a browser window for the Google Docs website of that document when opened. The link file extension has to be specified as a `--drive-export-formats` parameter. They will match all available Google Documents. ๐
- `desktop` โ freedesktop.org specified desktop entry โ OS Support: **Linux**
- `link.html` โ An HTML Document with a redirect โ OS Support: **All**
- `url` โ INI style link file โ OS Support: **macOS, Windows**
- `webloc` โ macOS specific XML format โ OS Support: **macOS**
---
### โญ Standard options โญ
Here are the Standard options specific to drive (Google Drive). ๐
---
### ๐ `--drive-client-id`
Google Application Client Id
Leave blank to use rclone's shared `client_id`, or if you are using a service account. The shared `client_id` is being retired and will stop working during **2026**, so creating your own is now strongly recommended. See https://rclone.org/drive/#making-your-own-client-id for how to create your own. ๐ซถ
Properties:
- Config: `client_id`
- Env Var: `RCLONE_DRIVE_CLIENT_ID`
- Type: `string`
- Required: false
---
### ๐ `--drive-client-secret`
Google Application Client Secret
Leave blank to use rclone's shared `client_id`, or if you are using a service account. If you created your own `client_id` then enter its client secret here.
Properties:
- Config: `client_secret`
- Env Var: `RCLONE_DRIVE_CLIENT_SECRET`
- Type: `string`
- Required: false
- **`--drive-scope`** โ <pink>okay bestie</pink>, this is a comma separated list of scopes that rclone should use when requesting access from `drive`. ๐
- **Properties:**
- **Config:** `scope`
- **Env Var:** `RCLONE_DRIVE_SCOPE`
- **Type:** `string`
- **Required:** `false`
- **Examples:**
- `"drive"` โ full access all files, excluding Application Data Folder.
- `"drive.readonly"` โ read-only access to file metadata and file contents.
- `"drive.file"` โ access to files created by rclone only.
- These are visible in the drive website.
- File authorization is revoked when the user deauthorizes the app.
- `"drive.appfolder"` โ allows read and write access to the Application Data folder.
- This is **not** visible in the drive website.
- `"drive.metadata.readonly"` โ allows read-only access to file metadata but
- does **not** allow any access to read or download file content.
- **`--drive-service-account-file`** โ path to a Service Account Credentials JSON file. ๐ Leave blank normally. Needed only if you want use SA instead of interactive login. Leading `~` will be expanded in the file name as will environment variables such as `${RCLONE_CONFIG_DIR}`.
- **Properties:**
- **Config:** `service_account_file`
- **Env Var:** `RCLONE_DRIVE_SERVICE_ACCOUNT_FILE`
- **Type:** `string`
- **Required:** `false`
## <rainbow>Advanced options</rainbow> โจ
Here are the Advanced options specific to `drive` (Google Drive). ๐
- **`--drive-token`** โ OAuth Access Token as a JSON blob. ๐ซถ
- **Properties:**
- **Config:** `token`
- **Env Var:** `RCLONE_DRIVE_TOKEN`
- **Type:** `string`
- **Required:** `false`
- **`--drive-auth-url`** โ Auth server URL. ๐ Leave blank to use the provider defaults.
- **Properties:**
- **Config:** `auth_url`
- **Env Var:** `RCLONE_DRIVE_AUTH_URL`
- **Type:** `string`
- **Required:** `false`
- **`--drive-token-url`** โ Token server url. โจ Leave blank to use the provider defaults.
- **Properties:**
- **Config:** `token_url`
- **Env Var:** `RCLONE_DRIVE_TOKEN_URL`
- **Type:** `string`
- **Required:** `false`
- **`--drive-client-credentials`** โ Use client credentials OAuth flow. ๐
This will use the OAUTH2 client Credentials Flow as described in RFC 6749. Note that this option is **NOT** supported by all backends.
- **Properties:**
- **Config:** `client_credentials`
- **Env Var:** `RCLONE_DRIVE_CLIENT_CREDENTIALS`
- **Type:** `bool`
- **Default:** `false`
- **`--drive-root-folder-id`** โ ID of the root folder. ๐ฆ Leave blank normally. Fill in to access `"Computers"` folders (see docs), or for rclone to use a non root folder as its starting point.
- **Properties:**
- **Config:** `root_folder_id`
- **Env Var:** `RCLONE_DRIVE_ROOT_FOLDER_ID`
- **Type:** `string`
- **Required:** `false`
- **`--drive-service-account-credentials`** โ Service Account Credentials JSON blob. ๐ Leave blank normally. Needed only if you want use SA instead of interactive login.
- **Properties:**
- **Config:** `service_account_credentials`
- **Env Var:** `RCLONE_DRIVE_SERVICE_ACCOUNT_CREDENTIALS`
- **Type:** `string`
- **Required:** `false`
- **`--drive-team-drive`** โ ID of the Shared Drive (Team Drive). ๐
- **Properties:**
- **Config:** `team_drive`
- **Env Var:** `RCLONE_DRIVE_TEAM_DRIVE`
- **Type:** `string`
- **Required:** `false`
- **`--drive-auth-owner-only`** โ Only consider files owned by the authenticated user. ๐
- **Properties:**
- **Config:** `auth_owner_only`
- **Env Var:** `RCLONE_DRIVE_AUTH_OWNER_ONLY`
- **Type:** `bool`
- **Default:** `false`
- **`--drive-use-trash`** โ Send files to the trash instead of deleting permanently. โป๏ธ Defaults to `true`, namely sending files to the trash. Use `--drive-use-trash=false` to delete files permanently instead.
- **Properties:**
- **Config:** `use_trash`
- **Env Var:** `RCLONE_DRIVE_USE_TRASH`
- **Type:** `bool`
- **Default:** `true`
- **`--drive-copy-shortcut-content`** โ Server side copy contents of shortcuts instead of the shortcut. ๐ฅ When doing server side copies, normally rclone will copy shortcuts as shortcuts. If this flag is used then rclone will copy the contents of shortcuts rather than shortcuts themselves when doing server side copies.
- **Properties:**
- **Config:** `copy_shortcut_content`
- **Env Var:** `RCLONE_DRIVE_COPY_SHORTCUT_CONTENT`
- **Type:** `bool`
- **Default:** `false`
- **`--drive-skip-gdocs`** โ Skip google documents in all listings. ๐ If given, gdocs practically become invisible to rclone.
- **Properties:**
- **Config:** `skip_gdocs`
- **Env Var:** `RCLONE_DRIVE_SKIP_GDOCS`
- **Type:** `bool`
- **Default:** `false`
- **`--drive-show-all-gdocs`** โ Show all Google Docs including non-exportable ones in listings. ๐ If you try a server side copy on a Google Form without this flag, you will get this error:
No export formats found for "application/vnd.google-apps.form"
However adding this flag will allow the form to be server side copied. Note that rclone doesn't add extensions to the Google Docs file names in this mode.
> Do **not** use this flag when trying to download Google Docs - rclone will fail to download them. ๐
- **Properties:**
- **Config:** `show_all_gdocs`
- **Env Var:** `RCLONE_DRIVE_SHOW_ALL_GDOCS`
- **Type:** `bool`
- **Default:** `false`
- **`--drive-skip-checksum-gphotos`** โ Skip checksums on Google photos and videos only. ๐ธ Use this if you get checksum errors when transferring Google photos or videos. Setting this flag will cause Google photos and videos to return a blank checksums. Google photos are identified by being in the `"photos"` space. Corrupted checksums are caused by Google modifying the image/video but not updating the checksum.
- **Properties:**
- **Config:** `skip_checksum_gphotos`
- **Env Var:** `RCLONE_DRIVE_SKIP_CHECKSUM_GPHOTOS`
- **Type:** `bool`
- **Default:** `false`
- **`--drive-shared-with-me`** โ Only show files that are shared with me. ๐ซ Instructs rclone to operate on your `"Shared with me"` folder (where Google Drive lets you access the files and folders others have shared with you). This works both with the `"list"` (`lsd`, `lsl`, etc.) and the `"copy"` commands (`copy`, `sync`, etc.), and with all other commands too.
- **Properties:**
- **Config:** `shared_with_me`
- **Env Var:** `RCLONE_DRIVE_SHARED_WITH_ME`
- **Type:** `bool`
- **Default:** `false`
- **`--drive-trashed-only`** โ Only show files that are in the trash. ๐๏ธ This will show trashed files in their original directory structure.
- **Properties:**
- **Config:** `trashed_only`
- **Env Var:** `RCLONE_DRIVE_TRASHED_ONLY`
- **Type:** `bool`
- **Default:** `false`
- **`--drive-starred-only`** โ Only show files that are starred. โญ
- **Properties:**
- **Config:** `starred_only`
- **Env Var:** `RCLONE_DRIVE_STARRED_ONLY`
- **Type:** `bool`
- **Default:** `false`
- **`--drive-formats`** โ Deprecated: See `export_formats`. ๐ซ
- **Properties:**
- **Config:** `formats`
- **Env Var:** `RCLONE_DRIVE_FORMATS`
- **Type:** `string`
- **Required:** `false`
- **`--drive-export-formats`** โ Comma separated list of preferred formats for downloading Google docs. ๐
- **Properties:**
- **Config:** `export_formats`
- **Env Var:** `RCLONE_DRIVE_EXPORT_FORMATS`
- **Type:** `string`
- **Default:** `"docx,xlsx,pptx,svg"`
- **`--drive-import-formats`** โ Comma separated list of preferred formats for uploading Google docs. ๐ค
- **Properties:**
- **Config:** `import_formats`
- **Env Var:** `RCLONE_DRIVE_IMPORT_FORMATS`
- **Type:** `string`
- **Required:** `false`
- **`--drive-allow-import-name-change`** โ Allow the filetype to change when uploading Google docs. ๐ E.g. `file.doc` to `file.docx`. This will confuse sync and reupload every time.
- **Properties:**
- **Config:** `allow_import_name_change`
- **Env Var:** `RCLONE_DRIVE_ALLOW_IMPORT_NAME_CHANGE`
- **Type:** `bool`
- **Default:** `false`
- **`--drive-use-created-date`** โ Use file created date instead of modified date. ๐
Useful when downloading data and you want the creation date used in place of the last modified date.
> **WARNING:** This flag may have some unexpected consequences. ๐ญ
When uploading to your drive all files will be overwritten unless they haven't been modified since their creation. And the inverse will occur while downloading. This side effect can be avoided by using the `--checksum` flag.
This feature was implemented to retain photos capture date as recorded by google photos. You will first need to check the `"Create a Google Photos folder"` option in your google drive settings. You can then copy or move the photos locally and use the date the image was taken (created) set as the modification date.
- **Properties:**
- **Config:** `use_created_date`
- **Env Var:** `RCLONE_DRIVE_USE_CREATED_DATE`
- **Type:** `bool`
- **Default:** `false`
- **`--drive-use-shared-date`** โ Use date file was shared instead of modified date. ๐ค Note that, as with `--drive-use-created-date`, this flag may have unexpected consequences when uploading/downloading files. If both this flag and `--drive-use-created-date` are set, the created date is used.
- **Properties:**
- **Config:** `use_shared_date`
- **Env Var:** `RCLONE_DRIVE_USE_SHARED_DATE`
- **Type:** `bool`
- **Default:** `false`
- **`--drive-list-chunk`** โ Size of listing chunk `100-1000`, `0` to disable. ๐งฉ
- **Properties:**
- **Config:** `list_chunk`
- **Env Var:** `RCLONE_DRIVE_LIST_CHUNK`
- **Type:** `int`
- **Default:** `1000`
- **`--drive-impersonate`** โ Impersonate this user when using a service account. ๐ญ
- **Properties:**
- **Config:** `impersonate`
- **Env Var:** `RCLONE_DRIVE_IMPERSONATE`
- **Type:** `string`
- **Required:** `false`
- **`--drive-upload-cutoff`** โ Cutoff for switching to chunked upload. โ๏ธ
- **Properties:**
- **Config:** `upload_cutoff`
- **Env Var:** `RCLONE_DRIVE_UPLOAD_CUTOFF`
- **Type:** `SizeSuffix`
- **Default:** `8Mi`
- **`--drive-chunk-size`** โ Upload chunk size. ๐ฆ Must be a power of 2 `>= 256k`. Making this larger will improve performance, but note that each chunk is buffered in memory one per transfer. Reducing this will reduce memory usage but decrease performance.
- **Properties:**
- **Config:** `chunk_size`
- **Env Var:** `RCLONE_DRIVE_CHUNK_SIZE`
- **Type:** `SizeSuffix`
- **Default:** `8Mi`
- **`--drive-acknowledge-abuse`** โ Set to allow files which return `cannotDownloadAbusiveFile` to be downloaded. ๐
If downloading a file returns the error `"This file has been identified as malware or spam and cannot be downloaded"` with the error code `"cannotDownloadAbusiveFile"` then supply this flag to rclone to indicate you acknowledge the risks of downloading the file and rclone will download it anyway.
Note that if you are using service account it will need Manager permission (not Content Manager) to for this flag to work. If the SA does not have the right permission, Google will just ignore the flag.
- **Properties:**
- **Config:** `acknowledge_abuse`
- **Env Var:** `RCLONE_DRIVE_ACKNOWLEDGE_ABUSE`
- **Type:** bool
- **Default:** false
---
## `--drive-keep-revision-forever`
Keep new head revision of each file forever. ๐โจ forever-forever, no take-backs.
**Properties:**
- **Config:** `keep_revision_forever`
- **Env Var:** `RCLONE_DRIVE_KEEP_REVISION_FOREVER`
- **Type:** bool
- **Default:** false
---
## `--drive-size-as-quota`
Show sizes as storage quota usage, not actual size.
So instead of telling you how big the file *is*, it tells you how much of your storage quota it's eating. And bestie, that's the current version **plus** any older versions that have been set to keep forever. The way that stacks upโฆ ๐
> **WARNING:** This flag may have some unexpected consequences. ๐
It is **not** recommended to set this flag in your config. The recommended usage is using the flag form `--drive-size-as-quota` when doing `rclone ls/lsl/lsf/lsjson/etc` only.
If you do use this flag for syncing (**not** recommended) then you will need to use `--ignore size` also. Periodt.
**Properties:**
- **Config:** `size_as_quota`
- **Env Var:** `RCLONE_DRIVE_SIZE_AS_QUOTA`
- **Type:** bool
- **Default:** false
---
## `--drive-v2-download-min-size`
If Object's are greater, use drive v2 API to download.
**Properties:**
- **Config:** `v2_download_min_size`
- **Env Var:** `RCLONE_DRIVE_V2_DOWNLOAD_MIN_SIZE`
- **Type:** SizeSuffix
- **Default:** off
---
## `--drive-pacer-min-sleep`
Minimum time to sleep between API calls. ๐ด girl needs her beauty rest between requests.
**Properties:**
- **Config:** `pacer_min_sleep`
- **Env Var:** `RCLONE_DRIVE_PACER_MIN_SLEEP`
- **Type:** Duration
- **Default:** `100ms`
---
## `--drive-pacer-burst`
Number of API calls to allow without sleeping. no naps, just go go go ๐ฅ
**Properties:**
- **Config:** `pacer_burst`
- **Env Var:** `RCLONE_DRIVE_PACER_BURST`
- **Type:** int
- **Default:** `100`
---
## `--drive-server-side-across-configs`
> **Deprecated:** use `--server-side-across-configs` instead. ๐ซ
Allow server-side operations (e.g. copy) to work across different drive configs.
This can be useful if you wish to do a server-side copy between two different Google drives. Note that this isn't enabled by default because it isn't easy to tell if it will work between any two configurations. like. it *might* slay, it might not, nobody knows ๐
**Properties:**
- **Config:** `server_side_across_configs`
- **Env Var:** `RCLONE_DRIVE_SERVER_SIDE_ACROSS_CONFIGS`
- **Type:** bool
- **Default:** false
---
## `--drive-disable-http2`
Disable drive using http2. ๐ซ
There is currently an unsolved issue with the google drive backend and HTTP/2. HTTP/2 is therefore disabled by default for the drive backend but can be re-enabled here. When the issue is solved this flag will be removed.
**See:** `https://github.com/rclone/rclone/issues/3631`
**Properties:**
- **Config:** `disable_http2`
- **Env Var:** `RCLONE_DRIVE_DISABLE_HTTP2`
- **Type:** bool
- **Default:** true
---
## `--drive-stop-on-upload-limit`
Make upload limit errors be fatal. ๐ like, end-the-sync fatal.
At the time of writing it is only possible to upload `750 GiB` of data to Google Drive a day (this is an undocumented limit). When this limit is reached Google Drive produces a slightly different error message. When this flag is set it causes these errors to be fatal. These will stop the in-progress sync.
Note that this detection is relying on error message strings which Google don't document so it may break in the future. ๐ (iykyk โ undocumented strings are the messiest exes)
**See:** `https://github.com/rclone/rclone/issues/3857`
**Properties:**
- **Config:** `stop_on_upload_limit`
- **Env Var:** `RCLONE_DRIVE_STOP_ON_UPLOAD_LIMIT`
- **Type:** bool
- **Default:** false
---
## `--drive-stop-on-download-limit`
Make download limit errors be fatal. ๐
At the time of writing it is only possible to download `10 TiB` of data from Google Drive a day (this is an undocumented limit). When this limit is reached Google Drive produces a slightly different error message. When this flag is set it causes these errors to be fatal. These will stop the in-progress sync.
Note that this detection is relying on error message strings which Google don't document so it may break in the future. ๐
**Properties:**
- **Config:** `stop_on_download_limit`
- **Env Var:** `RCLONE_DRIVE_STOP_ON_DOWNLOAD_LIMIT`
- **Type:** bool
- **Default:** false
---
## `--drive-skip-shortcuts`
If set skip shortcut files. ๐ not today, shortcuts.
Normally rclone dereferences shortcut files making them appear as if they are the original file (see the shortcuts section). If this flag is set then rclone will ignore shortcut files completely.
**Properties:**
- **Config:** `skip_shortcuts`
- **Env Var:** `RCLONE_DRIVE_SKIP_SHORTCUTS`
- **Type:** bool
- **Default:** false
---
## `--drive-skip-dangling-shortcuts`
If set skip dangling shortcut files. ๐ gone but not forgotten, actually just not shown.
If this is set then rclone will not show any dangling shortcuts in listings.
**Properties:**
- **Config:** `skip_dangling_shortcuts`
- **Env Var:** `RCLONE_DRIVE_SKIP_DANGLING_SHORTCUTS`
- **Type:** bool
- **Default:** false
---
## `--drive-resource-key`
Resource key for accessing a link-shared file. ๐
If you need to access files shared with a link like this
https://drive.google.com/drive/folders/XXX?resourcekey=YYY&usp=sharing
Then you will need to use the first part `"XXX"` as the `"root_folder_id"` and the second part `"YYY"` as the `"resource_key"` otherwise you will get `404` not found errors when trying to access the directory. ๐ญ the 404 jumpscare is real
**See:** `https://developers.google.com/drive/api/guides/resource-keys`
This resource key requirement only applies to a subset of old files. ๐ต
<rainbow>Note also that opening the folder once in the web interface (with the user you've authenticated rclone with) seems to be enough so that the resource key is not needed.</rainbow> โจ little hack, iconic honestly
**Properties:**
- **Config:** `resource_key`
- **Env Var:** `RCLONE_DRIVE_RESOURCE_KEY`
- **Type:** string
- **Required:** false
---
## `--drive-fast-list-bug-fix`
Work around a bug in Google Drive listing. ๐
Normally rclone will work around a bug in Google Drive when using `--fast-list` (`ListR`) where the search `"(A in parents) or (B in parents)"` returns nothing sometimes.
**See:** `#3114`, `#4289` and `https://issuetracker.google.com/issues/149522397`
Rclone detects this by finding no items in more than one directory when listing and retries them as lists of individual directories.
This means that if you have a lot of empty directories rclone will end up listing them all individually and this can take many more API calls. ๐๐๐ it's giving call center energy
This flag allows the work-around to be disabled. This is not recommended in normal use - only if you have a particular case you are having trouble with like many empty directories.
**Properties:**
- **Config:** `fast_list_bug_fix`
- **Env Var:** `RCLONE_DRIVE_FAST_LIST_BUG_FIX`
- **Type:** bool
- **Default:** true
---
## `--drive-metadata-owner`
Control whether owner should be read or written in metadata. ๐
Owner is a standard part of the file metadata so is easy to read. But it isn't always desirable to set the owner from the metadata.
Note that you can't set the owner on Shared Drives, and that setting ownership will generate an email to the new owner (this can't be disabled), and you can't transfer ownership to someone outside your organization. ๐ง the email is automatic and it is *not* optional bestie
**Properties:**
- **Config:** `metadata_owner`
- **Env Var:** `RCLONE_DRIVE_METADATA_OWNER`
- **Type:** Bits
- **Default:** `read`
- **Examples:**
- `"off"` โ Do not read or write the value
- `"read"` โ Read the value only
- `"write"` โ Write the value only
- `"failok"` โ If writing fails log errors only, don't fail the transfer
- `"read,write"` โ Read and Write the value.
---
## `--drive-metadata-permissions`
Control whether permissions should be read or written in metadata.
Reading permissions metadata from files can be done quickly, but it isn't always desirable to set the permissions from the metadata.
Note that rclone drops any inherited permissions on Shared Drives and any owner permission on My Drives as these are duplicated in the owner metadata. ๐๏ธ dropped, delicious, we love a clean duplicate
**Properties:**
- **Config:** `metadata_permissions`
- **Env Var:** `RCLONE_DRIVE_METADATA_PERMISSIONS`
- **Type:** Bits
- **Default:** `off`
- **Examples:**
- `"off"` โ Do not read or write the value
- `"read"` โ Read the value only
- `"write"` โ Write the value only
- `"failok"` โ If writing fails log errors only, don't fail the transfer
- `"read,write"` โ Read and Write the value.
---
## `--drive-metadata-labels`
Control whether labels should be read or written in metadata. ๐ท๏ธ
Reading labels metadata from files takes an extra API transaction and will slow down listings. It isn't always desirable to set the labels from the metadata. ๐ the slowdown is real, notice her
The format of labels is documented in the drive API documentation at `https://developers.google.com/drive/api/reference/rest/v3/Label` - rclone just provides a JSON dump of this format.
When setting labels, the label and fields must already exist - rclone will not create them. This means that if you are transferring labels from two different accounts you will have to create the labels in advance and use the metadata mapper to translate the IDs between the two accounts. ๐ฎโ๐จ you have to build it yourself first, no hand-holding
**Properties:**
- **Config:** `metadata_labels`
- **Env Var:** `RCLONE_DRIVE_METADATA_LABELS`
- **Type:** Bits
- **Default:** `off`
- **Examples:**
- `"off"` โ Do not read or write the value
- `"read"` โ Read the value only
- `"write"` โ Write the value only
- `"failok"` โ If writing fails log errors only, don't fail the transfer
- `"read,write"` โ Read and Write the value.
---
## `--drive-metadata-enforce-expansive-access`
Whether the request should enforce expansive access rules.
From Feb 2026 this flag will be set by default so this flag can be used for testing before then. โฐ mark your calendars bestie, future-you says hi
**See:** `https://developers.google.com/workspace/drive/api/guides/limited-expansive-access`
**Properties:**
- **Config:** `metadata_enforce_expansive_access`
- **Env Var:** `RCLONE_DRIVE_METADATA_ENFORCE_EXPANSIVE_ACCESS`
- **Type:** bool
- **Default:** false
---
## `--drive-encoding`
The encoding for the backend.
See the encoding section in the overview (`https://rclone.org/overview/#encoding`) for more info. ๐ค
**Properties:**
- **Config:** `encoding`
- **Env Var:** `RCLONE_DRIVE_ENCODING`
- **Type:** Encoding
- **Default:** `InvalidUtf8`
---
## `--drive-env-auth`
Get IAM credentials from runtime (environment variables or instance meta data if no env vars).
Only applies if `service_account_file` and `service_account_credentials` is blank. ๐คซ only then, don't be messy about it
**Properties:**
- **Config:** `env_auth`
- **Env Var:** `RCLONE_DRIVE_ENV_AUTH`
- **Type:** bool
- **Default:** false
- **Examples:**
- `"false"` โ Enter credentials in the next step.
- `"true"` โ Get GCP IAM credentials from the environment (env vars or IAM).
---
## `--drive-description`
Description of the remote. ๐ฌ just a lil name tag for your remote, cute
**Properties:**
- **Config:** description
- **Env Var:** `RCLONE_DRIVE_DESCRIPTION`
- **Type:** string
- **Required:** false
### โจ Metadata โจ
Okay bestie, so user metadata lives in the `properties` field of the drive object โ that's just where Google keeps it, no biggie ๐
Metadata is supported on **files and directories**. Yes, both. Slay.
Here are the possible system metadata items for the drive backend. Every single one, no skips ๐ซถ
- **`btime`** โ Time of file birth (creation) with mS accuracy. *Type:* `RFC 3339`. *Example:* `2006-01-02T15:04:05.999Z07:00`. *Read Only:* `N`. โ ๏ธ Note that this is only writable on fresh uploads โ it can't be written for updates. (So if you're trying to set birth time on an existing fileโฆ nope, sorry bestie ๐ญ)
- **`content-type`** โ The MIME type of the file. *Type:* `string`. *Example:* `text/plain`. *Read Only:* `N`
- **`copy-requires-writer-permission`** โ Whether the options to copy, print, or download this file, should be disabled for readers and commenters. *Type:* `boolean`. *Example:* `true`. *Read Only:* `N`
- **`description`** โ A short description of the file. *Type:* `string`. *Example:* `Contract for signing`. *Read Only:* `N`
- **`folder-color-rgb`** โ The color for a folder or a shortcut to a folder as an RGB hex string. *Type:* `string`. *Example:* `881133`. *Read Only:* `N`
- **`labels`** โ Labels attached to this file in a JSON dump of Googled drive format. Enable with `--drive-metadata-labels`. *Type:* `JSON`. *Example:* `[]`. *Read Only:* `N`
- **`mtime`** โ Time of last modification with mS accuracy. *Type:* `RFC 3339`. *Example:* `2006-01-02T15:04:05.999Z07:00`. *Read Only:* `N`
- **`owner`** โ The owner of the file. Usually an email address. Enable with `--drive-metadata-owner`. *Type:* `string`. *Example:* `user@example.com`. *Read Only:* `N`
- **`permissions`** โ Permissions in a JSON dump of Google drive format. On shared drives these will only be present if they aren't inherited. Enable with `--drive-metadata-permissions`. *Type:* `JSON`. *Example:* `{}`. *Read Only:* `N`
- **`starred`** โ Whether the user has starred the file. *Type:* `boolean`. *Example:* `false`. *Read Only:* `N`
- **`viewed-by-me`** โ Whether the file has been viewed by this user. *Type:* `boolean`. *Example:* `true`. *Read Only:* `Y`
- **`writers-can-share`** โ Whether users with only writer permission can modify the file's permissions. Not populated and ignored when setting for items in shared drives. *Type:* `boolean`. *Example:* `false`. *Read Only:* `N`
See the metadata docs for more info (https://rclone.org/docs/#metadata) ๐
---
### ๐ Backend commands ๐
Here are the commands specific to the drive backend. Like, the lil extra ones that are just for Drive, iykyk.
Run them with:
rclone backend COMMAND remote:
The help below will explain what arguments each command takes.
See the backend command docs for more info on how to pass options and arguments (https://rclone.org/commands/rclone_backend/).
These can be run on a running backend using the rc command `backend/command` (https://rclone.org/rc/#backend-command). So you can poke at a live one, no restart needed ๐
---
### get
Get command for fetching the drive config parameters. It's giving "peek behind the curtain" energy ๐
rclone backend get remote: [options] [<arguments>+]
This is a `get` command which will be used to fetch the various drive config parameters.
Usage examples:
rclone backend get drive: [-o service_account_file] [-o chunk_size] rclone rc backend/command command=get fs=drive: [-o service_account_file] [-o chunk_size]
Options:
- **`"chunk_size"`** โ Show the current upload chunk size.
- **`"service_account_file"`** โ Show the current service account file.
---
### set
Set command for updating the drive config parameters. The glow-up command fr โจ
rclone backend set remote: [options] [<arguments>+]
This is a `set` command which will be used to update the various drive config parameters.
Usage examples:
rclone backend set drive: [-o service_account_file=sa.json] [-o chunk_size=67108864] rclone rc backend/command command=set fs=drive: [-o service_account_file=sa.json] [-o chunk_size=67108864]
Options:
- **`"chunk_size"`** โ Update the current upload chunk size.
- **`"service_account_file"`** โ Update the current service account file.
---
### shortcut
Create shortcuts from files or directories. It's giving "shortcut era" ๐
rclone backend shortcut remote: [options] [<arguments>+]
This command creates shortcuts from files or directories.
Usage examples:
rclone backend shortcut drive: source_item destination_shortcut rclone backend shortcut drive: source_item -o target=drive2: destination_shortcut
In the first example this creates a shortcut from the `"source_item"` which can be a file or a directory to the `"destination_shortcut"`. The `"source_item"` and the `"destination_shortcut"` should be relative paths from `"drive:"`.
In the second example this creates a shortcut from the `"source_item"` relative to `"drive:"` to the `"destination_shortcut"` relative to `"drive2:"`. This may fail with a permission error if the user authenticated with `"drive2:"` can't read files from `"drive:"`. ๐ญ (permission drama, classic)
Options:
- **`"target"`** โ Optional target remote for the shortcut destination.
---
### drives
List the Shared Drives available to this account. Main character inventory moment ๐
rclone backend drives remote: [options] [<arguments>+]
This command lists the Shared Drives (Team Drives) available to this account.
Usage example:
rclone backend [-o config] drives drive:
This will return a JSON list of objects like this:
[ { "id": "0ABCDEF-01234567890", "kind": "drive#teamDrive", "name": "My Drive" }, { "id": "0ABCDEFabcdefghijkl", "kind": "drive#teamDrive", "name": "Test Drive" } ]
With the `-o config` parameter it will output the list in a format suitable for adding to a config file to make aliases for all the drives found and a combined drive.
[My Drive] type = alias remote = drive,team_drive=0ABCDEF-01234567890,root_folder_id=:
[Test Drive] type = alias remote = drive,team_drive=0ABCDEFabcdefghijkl,root_folder_id=:
[AllDrives] type = combine upstreams = "My Drive=My Drive:" "Test Drive=Test Drive:"
Adding this to the rclone config file will cause those team drives to be accessible with the aliases shown. Any illegal characters will be substituted with `"_"` and duplicate names will have numbers suffixed. It will also add a remote called `AllDrives` which shows all the shared drives combined into one directory tree. Obsessed with this, honestly ๐
---
### untrash
Untrash files and directories. The "oops bring it back" command ๐
rclone backend untrash remote: [options] [<arguments>+]
This command untrashes all the files and directories in the directory passed in recursively.
Usage example:
rclone backend untrash drive:directory rclone backend --interactive untrash drive:directory subdir
This takes an optional directory to trash which make this easier to use via the API.
Use the `--interactive`/`-i` or `--dry-run` flag to see what would be restored before restoring it. (Please do this, bestie โ always vibe check before you commit ๐)
Result:
{ "Untrashed": 17, "Errors": 0 }
---
### copyid
Copy files by ID. Because sometimes you've got the ID and not the path, and that's valid โจ
rclone backend copyid remote: [options] [<arguments>+]
This command copies files by ID.
Usage examples:
rclone backend copyid drive: ID path rclone backend copyid drive: ID1 path1 ID2 path2
It copies the drive file with ID given to the path (an rclone path which will be passed internally to `rclone copyto`). The ID and path pairs can be repeated.
The path should end with a `/` to indicate copy the file as named to this directory. If it doesn't end with a `/` then the last path component will be used as the file name. (iykyk โ that trailing slash MATTERS ๐
)
If the destination is a drive backend then server-side copying will be attempted if possible. Zero data transfer, so fast, slay ๐ฅ
Use the `--interactive`/`-i` or `--dry-run` flag to see what would be copied before copying.
---
### moveid
Move files by ID. Same energy as copyid but it *moves* ๐ฆ
rclone backend moveid remote: [options] [<arguments>+]
This command moves files by ID.
Usage examples:
rclone backend moveid drive: ID path rclone backend moveid drive: ID1 path1 ID2 path2
It moves the drive file with ID given to the path (an rclone path which will be passed internally to `rclone moveto`).
The path should end with a `/` to indicate move the file as named to this directory. If it doesn't end with a `/` then the last path component will be used as the file name.
If the destination is a drive backend then server-side moving will be attempted if possible.
Use the `--interactive`/`-i` or `--dry-run` flag to see what would be moved beforehand.
---
### exportformats
Dump the export formats for debug purposes. Lowkey a nerd moment and I respect it ๐ง
rclone backend exportformats remote: [options] [<arguments>+]
---
### importformats
Dump the import formats for debug purposes.
rclone backend importformats remote: [options] [<arguments>+]
---
### query
List files using Google Drive query language. The big-brain one, fr fr ๐
- **`rclone backend query remote: [options] [<arguments>+]`** โ lists files based on a query, bestie ๐
This command lists files based on a query.
Usage example:
rclone backend query drive: query
The query syntax is documented at Google Drive Search query terms and operators (`https://developers.google.com/drive/api/guides/ref-search-terms`).
For example:
rclone backend query drive: "'0ABc9DEFGHIJKLMNop0QRatUVW3X' in parents and name contains 'foo'"
If the query contains literal `'` or `\` characters, these need to be escaped with `\` characters. `'` becomes `\'` and `\` becomes `\\`, for example to match a file named "foo ' \.txt":
rclone backend query drive: "name = 'foo ' \.txt'"
The result is a JSON array of matches, for example:
[ { "createdTime": "2017-06-29T19:58:28.537Z", "id": "0AxBe_CDEF4zkGHI4d0FjYko2QkD", "md5Checksum": "68518d16be0c6fbfab918be61d658032", "mimeType": "text/plain", "modifiedTime": "2024-02-02T10:40:02.874Z", "name": "foo ' \.txt", "parents": [ "0BxAe_BCDE4zkFGZpcWJGek0xbzC" ], "resourceKey": "0-ABCDEFGHIXJQpIGqBJq3MC", "sha1Checksum": "8f284fa768bfb4e45d076a579ab3905ab6bfa893", "size": "311", "webViewLink": "https://drive.google.com/file/d/0AxBe_CDEF4zkGHI4d0FjYko2QkD/view?usp=drivesdk\u0026resourcekey=0-ABCDEFGHIXJQpIGqBJq3MC" } ]
### ๐ rescue ๐
Rescue or delete any orphaned files. iykyk, this one is a whole rescue mission ๐ฆ
rclone backend rescue remote: [options] [<arguments>+]
This command rescues or deletes any orphaned files or directories.
Sometimes files can get orphaned in Google Drive. This means that they are no longer in any folder in Google Drive. ๐ญ Literally floating in the void with no parent folder, no cap.
This command finds those files and either rescues them to a directory you specify or deletes them.
This can be used in 3 ways.
First, list all orphaned files:
rclone backend rescue drive:
Second rescue all orphaned files to the directory indicated:
rclone backend rescue drive: "relative/path/to/rescue/directory"
E.g. to rescue all orphans to a directory called "Orphans" in the top level:
rclone backend rescue drive: Orphans
Third delete all orphaned files to the trash:
rclone backend rescue drive: -o delete
## ๐ง Limitations ๐ง
Drive has <hotpink>quite a lot</hotpink> of rate limiting. This causes rclone to be limited to transferring about 2 files per second only. Individual files may be transferred much faster at 100s of MiB/s but lots of small files can take a long time. ๐ฎโ๐จ The small-files girlies really do suffer out here.
Server side copies are also subject to a separate rate limit. If you see <red>User rate limit exceeded</red> errors, wait at least 24 hours and retry. You can disable server-side copies with `--disable copy` to download and upload the files if you prefer.
---
## ๐ Limitations of Google Docs ๐
Google docs will appear as size `-1` in `rclone ls`, `rclone ncdu` etc, and as size `0` in anything which uses the VFS layer, e.g. `rclone mount` and `rclone serve`. When calculating directory totals, e.g. in `rclone size` and `rclone ncdu`, they will be counted in as empty files.
This is because rclone can't find out the size of the Google docs without downloading them. It's giving "we literally don't know her size bestie" ๐
Google docs will transfer correctly with `rclone sync`, `rclone copy` etc as rclone knows to ignore the size when doing the transfer.
However an unfortunate consequence of this is that you may not be able to download Google docs using `rclone mount`. If it doesn't work you will get a 0 sized file. If you try again the doc may gain its correct size and be downloadable. Whether it will work on not depends on the application accessing the mount and the OS you are running โ experiment to find out if it does work for you! ๐ง
---
## ๐ฏ Duplicated files ๐ฏ
Sometimes, for no reason I've been able to track down, drive will duplicate a file that rclone uploads. Drive unlike all the other remotes can have duplicated files.
Duplicated files cause problems with the syncing and you will see messages in the log about duplicates. ๐
Use `rclone dedupe` to fix duplicated files.
Note that this isn't just a problem with rclone, even Google Photos on Android duplicates files on drive sometimes.
---
## ๐ญ Rclone appears to be re-copying files it shouldn't ๐ญ
The most likely cause of this is the duplicated file issue above โ run `rclone dedupe` and check your logs for duplicate object or directory messages.
This can also be caused by a delay/caching on google drive's end when comparing directory listings. Specifically with team drives used in combination with `--fast-list`. Files that were uploaded recently may not appear on the directory list sent to rclone when using `--fast-list`.
Waiting a moderate period of time between attempts (estimated to be approximately 1 hour) and/or not using `--fast-list` both seem to be effective in preventing the problem. โณ
---
## ๐ SHA1 or SHA256 hashes may be missing ๐
All files have MD5 hashes, but a small fraction of files uploaded may not have SHA1 or SHA256 hashes especially if they were uploaded before 2018.
---
## ๐ Making your own client_id ๐
When you use rclone with Google drive in its default configuration you are using rclone's client_id. This is shared between all the rclone users.
This shared client_id is being retired and will stop working during 2026. To avoid interruption you **must** create and use your own client_id, so creating one is now **required** rather than merely recommended. New remotes created with `rclone config` will warn you if you leave the client_id blank. โ ๏ธ Like, this is not a drill bestie.
Using your own client_id has other benefits too. There is a global rate limit on the number of queries per second that each client_id can do set by Google. If you have multiple services running, it is recommended to use an API key for each service. The default Google quota is 10 transactions per second so it is recommended to stay under that number as if you use more than that, it will cause rclone to rate limit and make things slower.
Here is how to create your own Google Drive client ID for rclone:
1. Log into the Google API Console (`https://console.developers.google.com/`) with your Google account. It doesn't matter what Google account you use. (It need not be the same account as the Google Drive you want to access)
2. Select a project or create a new project.
3. Under "ENABLE APIS AND SERVICES" search for "Drive", and enable the "Google Drive API".
4. Click "Credentials" in the left-side panel (not "Create credentials", which opens the wizard).
5. If you already configured an "Oauth Consent Screen", then skip to the next step; if not, click on "CONFIGURE CONSENT SCREEN" button (near the top right corner of the right panel), then click "Get started". On the next screen, enter an "Application name" ("rclone" is OK); enter "User Support Email" (your own email is OK); Next, under Audience select "External". Next enter your own contact information, agree to terms and click "Create". You should now see `rclone` (or your project name) in a box in the top left of the screen.
(PS: if you are a GSuite user, you could also select "Internal" instead of "External" above, but this will restrict API use to Google Workspace users in your organisation).
You will also have to add some scopes (`https://developers.google.com/drive/api/guides/api-specific-auth`), including
- `https://www.googleapis.com/auth/docs`
- `https://www.googleapis.com/auth/drive` in order to be able to edit, create and delete files with RClone.
- `https://www.googleapis.com/auth/drive.metadata.readonly` which you may also want to add.
To do this, click Data Access on the left side panel, click "add or remove scopes" and select the three above and press update or go to the "Manually add scopes" text box (scroll down) and enter `https://www.googleapis.com/auth/docs,https://www.googleapis.com/auth/drive,https://www.googleapis.com/auth/drive.metadata.readonly`, press add to table then update.
You should now see the three scopes on your Data access page. Now press save at the bottom! ๐พ
6. After adding scopes, click Audience. Scroll down and click "+ Add users". Add yourself as a test user and press save.
7. Go to Overview on the left panel, click "Create OAuth client". Choose an application type of "Desktop app" and click "Create". (the default name is fine)
8. It will show you a client ID and client secret. Make a note of these. (If you selected "External" at Step 5 continue to Step 9. If you chose "Internal" you don't need to publish and can skip straight to Step 10 but your destination drive must be part of the same Google Workspace.)
9. Go to "Audience" and then click "PUBLISH APP" button and confirm. Add yourself as a test user if you haven't already.
(If the "PUBLISH APP" button is greyed out, Google now requires a homepage URL and a privacy policy URL before publishing, even for a personal single-user app. Go to "Branding" in the left panel, fill in "Application home page" and "Application privacy policy link" โ a free GitHub Pages site is fine for these if you don't have a domain of your own โ then "Authorized domains" with the domain you used, and click Save. Return to "Audience" and the "PUBLISH APP" button should now be available.)
10. Provide the noted client ID and client secret to rclone.
11. Run the web-based authorization flow from within `rclone config`, by answering "Y" when it asks "Token already configured - replace it?".
Be aware that, due to the "enhanced security" recently introduced by Google, you are theoretically expected to "submit your app for verification" and then wait a few weeks(!) for their response; in practice, you can go right ahead and use the client ID and client secret with rclone, the only issue will be a very scary confirmation screen shown when you connect via your browser for rclone to be able to get its token-id (but as this only happens during the remote configuration, it's not such a big deal). Keeping the application in "Testing" will work as well, but the limitation is that any grants will expire after a week, which can be annoying to refresh constantly. If, for whatever reason, a short grant time is not a problem, then keeping the application in testing mode would also be sufficient. โจ
<purple>In most cases verification is not actually required.</purple> Google exempts a number of app categories (https://support.google.com/cloud/answer/13464323) from mandatory verification, including:
- <mint>**Personal Use apps**</mint>: if the app is for your personal use (fewer than 100 users), you and your limited number of users can keep using it without verification โ you will just need to click through the "unverified app" warning screen during sign-in. Verification is only required if you want to grow your user base beyond 100 users.
- <mint>**Development/Testing/Staging apps**</mint>: apps in development, testing or staging mode are not subject to verification (but are limited to the 100-user cap and the unverified-app warning until verified).
So for typical personal rclone use you can leave the app unverified, accept the warning screen, and publish it (rather than leaving it in "Testing") to avoid the weekly grant expiry described above. lowkey the move ๐
(Thanks to @balazer on github for these instructions.) ๐ซถ
Sometimes, creation of an OAuth consent in Google API Console fails due to an error message <red>"The request failed because changes to one of the field of the resource is not supported"</red>. As a convenient workaround, the necessary Google Drive API key can be created on the Python Quickstart (https://developers.google.com/drive/api/v3/quickstart/python) page. Just push the <yellow>Enable the Drive API</yellow> button to receive the Client ID and Secret. Note that it will automatically create a new project in the API Console. (sneaky of it, but okay ๐)
---
# ๐ฆ Google Photos ๐ฆ
The rclone backend for Google Photos (https://www.google.com/photos/about/) is a specialized backend for transferring photos and videos to and from Google Photos. it's giving camera roll energy ๐ธโจ
> <hotpink>**NB**</hotpink> The Google Photos API which rclone uses has quite a few limitations, so please read the limitations section carefully to make sure it is suitable for your use.
> <hotpink>**NB**</hotpink> From March 31, 2025 rclone can only download photos it uploaded. This limitation is due to policy changes at Google. You may need to run `rclone config reconnect remote:` to make rclone work again after upgrading to rclone v1.70. ๐ญ
## ๐ธ Configuration ๐ธ
The initial setup for google cloud storage involves getting a token from Google Photos which you need to do in your browser. `rclone config` walks you through it. fr fr it holds your hand the whole way ๐ซถ
Here is an example of how to make a remote called `remote`. First run:
rclone config
This will guide you through an interactive setup process:
No remotes found, make a new one? n) New remote s) Set configuration password q) Quit config n/s/q> n name> remote Type of storage to configure. Enter a string value. Press Enter for the default (""). Choose a number from below, or type in your own value [snip] XX / Google Photos \ "google photos" [snip] Storage> google photos ** See help for google photos backend at: https://rclone.org/googlephotos/ **
OAuth Client Id. Creating your own is now strongly recommended. If you leave this blank rclone uses a shared client_id which is being retired and will stop working during 2026. See https://rclone.org/googlephotos/#making-your-own-client-id for how to create your own. Enter a string value. Press Enter for the default (""). client_id> OAuth Client Secret. Leave blank to use rclone's shared client_id. If you created your own client_id then enter its client secret here. Enter a string value. Press Enter for the default (""). client_secret> Set to make the Google Photos backend read only.
If you choose read only then rclone will only request read only access to your photos, otherwise rclone will request full access. Enter a boolean value (true or false). Press Enter for the default ("false"). read_only> Edit advanced config? (y/n) y) Yes n) No y/n> n Remote config rclone's shared Google Photos client_id is being retired and will stop working during 2026. Create your own to avoid interruption: https://rclone.org/googlephotos/#making-your-own-client-id
Continue using the shared client_id anyway? y) Yes n) No (default) y/n> n OAuth Client Id. client_id> 1234567890-abcdefghijklmnop.apps.googleusercontent.com OAuth Client Secret. client_secret> GOCSPX-your-client-secret Use web browser to automatically authenticate rclone with remote?
- Say Y if the machine running rclone has a web browser you can use
- Say N if running rclone on a (remote) machine without web browser access If not sure try Y. If Y failed, try N. y) Yes n) No y/n> y If your browser doesn't open automatically go to the following link: http://127.0.0.1:53682/auth Log in and authorize rclone for access Waiting for code... Got code
* IMPORTANT: All media items uploaded to Google Photos with rclone * are stored in full resolution at original quality. These uploads *** will count towards storage in your Google Account.
Configuration complete. Options:
- type: google photos
- token: {"access_token":"XXX","token_type":"Bearer","refresh_token":"XXX","expiry":"2019-06-28T17:38:04.644930156+01:00"} Keep this "remote" remote? y) Yes this is OK e) Edit this remote d) Delete this remote y/e/d> y
See the remote setup docs (https://rclone.org/remote_setup/) for how to set it up on a machine without an internet-connected web browser available. ๐ง
Note that rclone runs a webserver on your local machine to collect the token as returned from Google if using web browser to automatically authenticate. This only runs from the moment it opens your browser to the moment you get back the verification code. This is on `http://127.0.0.1:53682/` and this may require you to unblock it temporarily if you are running a host firewall, or use manual mode. ikyk the firewall always wants to start something ๐
This remote is called `remote` and can now be used like this
See all the albums in your photos
rclone lsd remote:album
Make a new album
rclone mkdir remote:album/newAlbum
List the contents of an album
rclone ls remote:album/newAlbum
Sync `/home/local/images` to the Google Photos, removing any excess files in the album.
rclone sync --interactive /home/local/image remote:album/newAlbum
## ๐ธ Layout ๐ธ
As Google Photos is not a general purpose cloud storage system, the backend is laid out to help you navigate it. ๐บ๏ธโจ
The directories under `media` show different ways of categorizing the media. Each file will appear multiple times. So if you want to make a backup of your google photos you might choose to backup `remote:media/by-month`. (NB `remote:media/by-day` is rather slow at the moment so avoid for syncing.) ๐
Note that all your photos and videos will appear somewhere under `media`, but they may not appear under `album` unless you've put them into albums.
/
- upload
- file1.jpg
- file2.jpg
- ...
- media
- all
- file1.jpg
- file2.jpg
- ...
- by-year
- 2000
- file1.jpg
- ...
- 2001
- file2.jpg
- ...
- ...
- 2000
- by-month
- 2000
- 2000-01
- file1.jpg
- ...
- 2000-02
- file2.jpg
- ...
- ...
- 2000
- by-day
- 2000
- 2000-01-01
- file1.jpg
- ...
- 2000-01-02
- file2.jpg
- ...
- ...
- 2000
- all
- album
- album name
- album name/sub
- shared-album
- album name
- album name/sub
- feature
- favorites
- file1.jpg
- file2.jpg
- favorites
There are two writable parts of the tree, the `upload` directory and sub directories of the `album` directory. ๐
The `upload` directory is for uploading files you don't want to put into albums. This will be empty to start with and will contain the files you've uploaded for one rclone session only, becoming empty again when you restart rclone. The use case for this would be if you have a load of files you just want to once off dump into Google Photos. For repeated syncing, uploading to `album` will work better. ๐
Directories within the `album` directory are also writeable and you may create new directories (albums) under `album`. If you copy files with a directory hierarchy in there then rclone will create albums with the `/` character in them. For example if you do
rclone copy /path/to/images remote:album/images
and the images directory contains
images
- file1.jpg dir file2.jpg dir2 dir3 file3.jpg
Then rclone will create the following albums with the following files in
- `images`
- `file1.jpg`
- `images/dir`
- `file2.jpg`
- `images/dir2/dir3`
- `file3.jpg`
This means that you can use the `album` path pretty much like a normal filesystem and it is a good target for repeated syncing. slay ๐ซถ
The `shared-album` directory shows albums shared with you or by you. This is similar to the Sharing tab in the Google Photos web interface. ๐
## ๐ธ Standard options ๐ธ
Here are the Standard options specific to google photos (Google Photos).
### ๐ธ --gphotos-client-id ๐ธ
OAuth Client Id.
Creating your own is now strongly recommended. If you leave this blank rclone uses a shared client_id which is being retired and will stop working during 2026. See https://rclone.org/googlephotos/#making-your-own-client-id for how to create your own.
Properties:
- Config: `client_id`
- Env Var: `RCLONE_GPHOTOS_CLIENT_ID`
- Type: string
- Required: false
### ๐ธ --gphotos-client-secret ๐ธ
OAuth Client Secret.
Leave blank to use rclone's shared client_id. If you created your own client_id then enter its client secret here.
Properties:
- Config: `client_secret`
- **`Env Var`**: `RCLONE_GPHOTOS_CLIENT_SECRET`
- **`Type`**: string
- **`Required`**: false
- **`--gphotos-read-only`** โ flips the whole Google Photos backend into read-only mode, bestie ๐
If you go read-only, rclone asks for <mint>read-only access</mint> to your photos and that's it. Otherwise? rclone wants <hotpink>full access</hotpink>. That's the whole vibe check.
Properties:
- **`Config`**: read_only
- **`Env Var`**: `RCLONE_GPHOTOS_READ_ONLY`
- **`Type`**: bool
- **`Default`**: false
---
## โจ Advanced options โจ
okay so these are the <purple>Advanced options</purple> that are specifically for google photos (Google Photos). extremely specific, no notes ๐ซถ
- **`--gphotos-token`** โ the OAuth Access Token, delivered to you as a JSON blob ๐ซ
Properties:
- **`Config`**: token
- **`Env Var`**: `RCLONE_GPHOTOS_TOKEN`
- **`Type`**: string
- **`Required`**: false
- **`--gphotos-auth-url`** โ the Auth server URL.
Leave it blank and you get the provider defaults. blank = default, always ๐
Properties:
- **`Config`**: auth_url
- **`Env Var`**: `RCLONE_GPHOTOS_AUTH_URL`
- **`Type`**: string
- **`Required`**: false
- **`--gphotos-token-url`** โ the Token server url.
Leave blank โ provider defaults. same deal, iconic ๐
Properties:
- **`Config`**: token_url
- **`Env Var`**: `RCLONE_GPHOTOS_TOKEN_URL`
- **`Type`**: string
- **`Required`**: false
- **`--gphotos-client-credentials`** โ use the client credentials OAuth flow.
This one uses the <cyan>OAUTH2 client Credentials Flow</cyan> exactly as described in RFC 6749. very official.
Heads up though: this option is <red>NOT</red> supported by all backends. not every backend wants that energy ๐
Properties:
- **`Config`**: client_credentials
- **`Env Var`**: `RCLONE_GPHOTOS_CLIENT_CREDENTIALS`
- **`Type`**: bool
- **`Default`**: false
- **`--gphotos-read-size`** โ set this to actually read the size of media items.
Normally rclone does <italic>not</italic> read the size of media items, because that costs another transaction. For syncing it's literally unnecessary. <mint>However</mint> โ rclone mount needs to know file sizes <italic>before</italic> it reads them, so if you're using rclone mount and you want to read the media, turning this flag on is recommended. do it for the mount bestie ๐
Properties:
- **`Config`**: read_size
- **`Env Var`**: `RCLONE_GPHOTOS_READ_SIZE`
- **`Type`**: bool
- **`Default`**: false
- **`--gphotos-start-year`** โ a year. it limits which photos get downloaded to only the ones uploaded <italic>after</italic> that year. time gate โจ
Properties:
- **`Config`**: start_year
- **`Env Var`**: `RCLONE_GPHOTOS_START_YEAR`
- **`Type`**: int
- **`Default`**: 2000
- **`--gphotos-include-archived`** โ also view and download archived media.
By default rclone does not request archived media. So when syncing, archived media is <italic>not visible</italic> in directory listings and it does not get transferred. periodt.
Lowkey important: media in albums is always visible and synced, no matter its archive status. albums don't play by the archive rules ๐
With this flag, archived media is always visible in directory listings and gets transferred.
Without this flag, archived media will not be visible in directory listings and won't be transferred.
Properties:
- **`Config`**: include_archived
- **`Env Var`**: `RCLONE_GPHOTOS_INCLUDE_ARCHIVED`
- **`Type`**: bool
- **`Default`**: false
- **`--gphotos-proxy`** โ use the gphotosdl proxy for downloading the full resolution images ๐ฅ
Here's the tea: the Google API will hand you images and video which aren't full resolution, and/or are missing EXIF data. which is giving "why is it like this".
But if you use the <cyan>gphotosdl</cyan> proxy then you can download original, unchanged images. slay.
This runs a headless browser in the background. very main character.
Download the software from gphotosdl (https://github.com/rclone/gphotosdl)
First run with
gphotosdl -login
Then once you have logged into google photos close the browser window and run
gphotosdl
Then supply the parameter `--gphotos-proxy "http://localhost:8282"` to make rclone use the proxy. ๐ซ
Properties:
- **`Config`**: proxy
- **`Env Var`**: `RCLONE_GPHOTOS_PROXY`
- **`Type`**: string
- **`Required`**: false
- **`--gphotos-encoding`** โ the encoding for the backend.
See the encoding section in the overview (https://rclone.org/overview/#encoding) for more info. iykyk.
Properties:
- **`Config`**: encoding
- **`Env Var`**: `RCLONE_GPHOTOS_ENCODING`
- **`Type`**: Encoding
- **`Default`**: Slash,CrLf,InvalidUtf8,Dot
- **`--gphotos-batch-mode`** โ upload file batching sync|async|off.
This sets the batch mode used by rclone.
This has 3 possible values
- `off` โ no batching
- `sync` โ batch uploads and check completion (default)
- `async` โ batch upload and don't check completion
Rclone will close any outstanding batches when it exits, which may make a delay on quit. just a lil heads up ๐ซถ
Properties:
- **`Config`**: batch_mode
- **`Env Var`**: `RCLONE_GPHOTOS_BATCH_MODE`
- **`Type`**: string
- **`Default`**: "sync"
- **`--gphotos-batch-size`** โ max number of files in an upload batch.
This sets the batch size of files to upload. It <italic>has</italic> to be less than 50. no negotiating.
By default this is `0`, which means rclone will calculate the batch size depending on the setting of `batch_mode`.
- `batch_mode: async` โ default `batch_size` is 50
- `batch_mode: sync` โ default `batch_size` is the same as `--transfers`
- `batch_mode: off` โ not in use
Rclone will close any outstanding batches when it exits, which may make a delay on quit.
Setting this is a <mint>great idea</mint> if you are uploading lots of small files, because it will make them a lot quicker. You can use `--transfers 32` to maximise throughput. go off ๐
Properties:
- **`Config`**: batch_size
- **`Env Var`**: `RCLONE_GPHOTOS_BATCH_SIZE`
- **`Type`**: int
- **`Default`**: 0
- **`--gphotos-batch-timeout`** โ max time to allow an idle upload batch before uploading.
If an upload batch is idle for more than this long then it will be uploaded. bye girl ๐
The default for this is `0`, which means rclone will choose a sensible default based on the `batch_mode` in use.
- `batch_mode: async` โ default `batch_timeout` is 10s
- `batch_mode: sync` โ default `batch_timeout` is 1s
- `batch_mode: off` โ not in use
Properties:
- **`Config`**: batch_timeout
- **`Env Var`**: `RCLONE_GPHOTOS_BATCH_TIMEOUT`
- **`Type`**: Duration
- **`Default`**: 0s
- **`--gphotos-description`** โ description of the remote โจ
Properties:
- **`Config`**: description
- **`Env Var`**: `RCLONE_GPHOTOS_DESCRIPTION`
- **`Type`**: string
- **`Required`**: false
---
## ๐ง Limitations ๐ง
Only images and videos can be uploaded. If you attempt to upload non videos or images or formats that Google Photos doesn't understand, rclone will upload the file, then Google Photos will give an error when it is put turned into a media item. so likeโฆ it goes up and then immediately gets humbled ๐
> NB From March 31, 2025 rclone can only download photos <italic>it</italic> uploaded. This limitation is due to policy changes at Google. You may need to run `rclone config reconnect remote:` to make rclone work again after upgrading to rclone v1.70. not a drill.
Note that all media items uploaded to Google Photos through the API are stored in full resolution at "original quality" and will count towards your storage quota in your Google Account. The API does not offer a way to upload in "high quality" mode.. (yes that double period is in the original, we don't judge ๐ญ)
`rclone about` is not supported by the Google Photos backend. Backends without this capability cannot determine free space for an rclone mount or use policy `mfs` (most free space) as a member of an rclone union remote. big L honestly.
See List of backends that do not support `rclone about` (https://rclone.org/overview/#optional-features) See `rclone about` (https://rclone.org/commands/rclone_about/)
---
## ๐ธ Downloading Images ๐ธ
When Images are downloaded this strips EXIF location (according to the docs and my tests). This is a limitation of the Google Photos API and is covered by bug #112096115 (https://issuetracker.google.com/issues/112096115).
The current google API does not allow photos to be downloaded at original resolution. This is <red>very important</red> if you are, for example, relying on "Google Photos" as a backup of your photos. You will not be able to use rclone to redownload original images. You could use 'google takeout' to recover the original photos as a last resort. ok that's actually kind of scary ๐ญ
> NB you can use the `--gphotos-proxy` flag to use a headless browser to download images in full resolution. ๐ฆ
---
## ๐ Downloading Videos ๐
When videos are downloaded they are downloaded in a really compressed version of the video compared to downloading it via the Google Photos web interface. This is covered by bug #113672044 (https://issuetracker.google.com/issues/113672044). the compression is giving "we did our best".
> NB you can use the `--gphotos-proxy` flag to use a headless browser to download images in full resolution.
---
## ๐ฏ Duplicates ๐ฏ
If a file name is duplicated in a directory then rclone will add the file ID into its name. So two files called `file.jpg` would then appear as `file {123456}.jpg` and `file {ABCDEF}.jpg` (the actual IDs are a lot longer alas!). long ID representation, we love to see it ๐
If you upload the same image (with the same binary data) twice then Google Photos will deduplicate it. However it will retain the filename from the <italic>first</italic> upload which may confuse rclone. For example if you uploaded an image to `upload` then uploaded the same image to `album/my_album` the filename of the image in `album/my_album` will be what it was uploaded with initially, not what you uploaded it with to `album`. In practise this shouldn't cause too many problems. it's fine it's fine ๐
---
## โฐ Modification times โฐ
The date shown of media in Google Photos is the creation date as determined by the EXIF information, or the upload date if that is not known.
This is not changeable by rclone and is <italic>not</italic> the modification date of the media on local disk. This means that rclone cannot use the dates from Google Photos for syncing purposes. sorry bestie, them's the rules.
---
## ๐ Size ๐
The Google Photos API does not return the size of media. This means that when syncing to Google Photos, rclone can only do a file existence check. just vibes, no numbers.
It is possible to read the size of the media, but this needs an extra HTTP HEAD request per media item so is <red>very slow</red> and uses up a lot of transactions. This can be enabled with the `--gphotos-read-size` option or the `read_size = true` config parameter.
If you want to use the backend with rclone mount you may need to enable this flag (depending on your OS and application using the photos) otherwise you may not be able to read media off the mount. You'll need to experiment to see if it works for you without the flag. science ๐ฌโจ
---
## ๐ธ Albums ๐ธ
Rclone can only upload files to albums <italic>it</italic> created. This is a limitation of the Google Photos API (https://developers.google.com/photos/library/guides/manage-albums). no crashing other people's albums.
Rclone can remove files it uploaded from albums it created only.
---
## ๐๏ธ Deleting files ๐๏ธ
Rclone can remove files from albums it created, but note that the Google Photos API does not allow media to be deleted permanently so this media will still remain. See bug #109759781 (https://issuetracker.google.com/issues/109759781). it's gone but not <italic>gone</italic> gone.
Rclone cannot delete files anywhere except under `album`.
---
## ๐ Deleting albums ๐
The Google Photos API does not support deleting albums โ see bug #135714733 (https://issuetracker.google.com/issues/135714733). the album stays forever, she's immortal ๐
### ๐ธ Making your own client_id ๐ธ
Okay bestie, listen up, because this one is **important**. When you use rclone with Google Photos in its default configuration, you're using *rclone's* client_id. And that client_id is shared between **all** the rclone users. Every single one. The whole girlies-and-they-dies population. ๐
> <red>This shared client_id is being retired and will stop working during 2026.</red> Not a drill. To avoid interruption you **must** create and use your own client_id โ so creating one is now **required** rather than optional. New remotes created with `rclone config` will warn you if you leave the client_id blank.
So go follow the steps in the google drive docs (`https://rclone.org/drive/#making-your-own-client-id`) but likeโฆ with these little differences, okay? โจ
- At step 3, instead of enabling the `"Google Drive API"`, search for and enable the `"Photos Library API"`.
- At step 5, you will need to add different scopes. Use these scopes instead of the drive ones:
https://www.googleapis.com/auth/photoslibrary.appendonly https://www.googleapis.com/auth/photoslibrary.readonly.appcreateddata https://www.googleapis.com/auth/photoslibrary.edit.appcreateddata
---
## Hasher ๐
Hasher is a special *overlay* backend that makes remotes which handle checksums for other remotes. It's giving personal assistant for hashes. It's main functions include:
- Emulate hash types unimplemented by backends
- Cache checksums to help with slow hashing of large local or (S)FTP files
- Warm up checksum cache from external SUM files
### โจ Getting started โจ
To use Hasher, first set up the underlying remote following the configuration instructions for that remote. You can also use a local pathname instead of a remote. Check that your base remote is working โ vibe check it first, fr fr.
Let's call the base remote `myRemote:path` here. Note that **anything inside** `myRemote:path` will be handled by hasher and **anything outside won't**. This means that if you are using a bucket based remote (S3, B2, Swift) then you should put the bucket in the remote `s3:bucket`.
Now proceed to interactive or manual configuration. Pick your fighter. ๐
### ๐ฆ Interactive configuration ๐ฆ
Run `rclone config`:
No remotes found, make a new one? n) New remote s) Set configuration password q) Quit config n/s/q> n name> Hasher1 Type of storage to configure. Choose a number from below, or type in your own value [snip] XX / Handle checksums for other remotes \ "hasher" [snip] Storage> hasher Remote to cache checksums for, like myremote:mypath. Enter a string value. Press Enter for the default (""). remote> myRemote:path Comma separated list of supported checksum types. Enter a string value. Press Enter for the default ("md5,sha1"). hashsums> md5 Maximum time to keep checksums in cache. 0 = no cache, off = cache forever. max_age> off Edit advanced config? (y/n) y) Yes n) No y/n> n Remote config
[Hasher1] type = hasher remote = myRemote:path hashsums = md5 max_age = off
y) Yes this is OK e) Edit this remote d) Delete this remote y/e/d> y
### ๐
Manual configuration ๐
Run `rclone config path` to see the path of current active config file, usually `YOURHOME/.config/rclone/rclone.conf`. Open it in your favorite text editor, find the section for the base remote and create a new section for hasher like in the following examples:
[Hasher1] type = hasher remote = myRemote:path hashes = md5 max_age = off
[Hasher2] type = hasher remote = /local/path hashes = dropbox,sha1 max_age = 24h
Hasher takes basically the following parameters:
- `remote` is **required**
- `hashes` is a comma separated list of supported checksums (by default `md5,sha1`)
- `max_age` โ maximum time to keep a checksum value in the cache. `0` will disable caching completely, `off` will cache "forever" (that is until the files get changed)
Make sure the remote has `:` (colon) in. If you specify the remote without a colon then rclone will use a local directory of that name. So if you use a remote of `/local/path` then rclone will handle hashes for that directory. If you use `remote = name` literally then rclone will put files in a directory called `name` located under current directory.
## Usage ๐
### Basic operations ๐
Now you can use it as `Hasher2:subdir/file` instead of base remote. Hasher will transparently update cache with new checksums when a file is fully read or overwritten, like:
rclone copy External:path/file Hasher:dest/path rclone cat Hasher:path/to/file > /dev/null
The way to refresh all cached checksums (even unsupported by the base backend) for a subtree is to re-download all files in the subtree. For example, use `hashsum --download` using any supported hashsum on the command line (we just care to re-read):
rclone hashsum MD5 --download Hasher:path/to/subtree > /dev/null rclone backend dump Hasher:path/to/subtree
You can print or drop hashsum cache using custom backend commands:
rclone backend dump Hasher:dir/subdir rclone backend drop Hasher:
### ๐ Pre-Seed from a SUM File ๐
Hasher supports two backend commands: generic SUM file import and faster but less consistent `stickyimport`.
rclone backend import Hasher:dir/subdir SHA1 /path/to/SHA1SUM [--checkers 4]
Instead of `SHA1` it can be any hash supported by the remote. The last argument can point to either a local or an other-`remote:path` text file in SUM format. The command will parse the SUM file, then walk down the path given by the first argument, snapshot current fingerprints and fill in the cache entries correspondingly.
- Paths in the SUM file are treated as relative to `hasher:dir/subdir`.
- The command will **not** check that supplied values are correct. You must know what you are doing. ๐
- This is a one-time action. The SUM file will not get "attached" to the remote. Cache entries can still be overwritten later, should the object's fingerprint change.
- The tree walk can take long depending on the tree size. You can increase `--checkers` to make it faster. Or use `stickyimport` if you don't care about fingerprints and consistency.
rclone backend stickyimport hasher:path/to/data sha1 remote:/path/to/sum.sha1
`stickyimport` is similar to `import` but works much faster because it does not need to stat existing files and skips initial tree walk. Instead of binding cache entries to file fingerprints it creates *sticky* entries bound to the file name alone ignoring size, modification time etc. Such hash entries can be replaced only by `purge`, `delete`, `backend drop` or by full re-read/re-write of the files.
## Configuration reference ๐
### Standard options
Here are the Standard options specific to hasher (Better checksums for other remotes).
#### `--hasher-remote`
Remote to cache checksums for (e.g. `myRemote:path`).
Properties:
- Config: `remote`
- Env Var: `RCLONE_HASHER_REMOTE`
- Type: `string`
- Required: **true**
#### `--hasher-hashes`
Comma separated list of supported checksum types.
Properties:
- Config: `hashes`
- Env Var: `RCLONE_HASHER_HASHES`
- Type: `CommaSepList`
- Default: `md5,sha1`
#### `--hasher-max-age`
Maximum time to keep checksums in cache (`0` = no cache, `off` = cache forever).
Properties:
- Config: `max_age`
- Env Var: `RCLONE_HASHER_MAX_AGE`
- Type: `Duration`
- Default: `off`
### Advanced options ๐
Here are the Advanced options specific to hasher (Better checksums for other remotes).
#### `--hasher-auto-size`
Auto-update checksum for files smaller than this size (disabled by default).
Properties:
- Config: `auto_size`
- Env Var: `RCLONE_HASHER_AUTO_SIZE`
- Type: `SizeSuffix`
- Default: `0`
#### `--hasher-description`
Description of the remote.
Properties:
- Config: `description`
- Env Var: `RCLONE_HASHER_DESCRIPTION`
- Type: `string`
- Required: **false**
### Metadata ๐ซถ
Any metadata supported by the underlying remote is read and written.
See the metadata (`https://rclone.org/docs/#metadata`) docs for more info.
### Backend commands โจ
Here are the commands specific to the hasher backend.
Run them with:
rclone backend COMMAND remote:
The help below will explain what arguments each command takes.
See the backend (`https://rclone.org/commands/rclone_backend/`) command for more info on how to pass options and arguments.
These can be run on a running backend using the rc command backend/command (`https://rclone.org/rc/#backend-command`).
#### drop
Drop cache.
rclone backend drop remote: [options] [<arguments>+]
Completely drop checksum cache.
Usage example:
rclone backend drop hasher:
#### dump
Dump the database.
rclone backend dump remote: [options] [<arguments>+]
Dump cache records covered by the current remote.
#### fulldump
Full dump of the database.
rclone backend fulldump remote: [options] [<arguments>+]
Dump all cache records in the database.
#### import
Import a SUM file.
rclone backend import remote: [options] [<arguments>+]
Amend hash cache from a SUM file and bind checksums to files by size/time.
Usage example:
rclone backend import hasher:subdir md5 /path/to/sum.md5
#### stickyimport
Perform fast import of a SUM file.
rclone backend stickyimport remote: [options] [<arguments>+]
Fill hash cache from a SUM file without verifying file fingerprints.
Usage example:
rclone backend stickyimport hasher:subdir md5 remote:path/to/sum.md5
## Implementation details (advanced) ๐ง
This section explains how various rclone operations work on a hasher remote.
> Disclaimer. This section describes current implementation which can change in future rclone versions!!. So like, don't @ me. ๐
### Hashsum command
The `rclone hashsum` (or `md5sum` or `sha1sum`) command will:
1. if requested hash is supported by lower level, just pass it.
2. if object size is below `auto_size` then download object and calculate requested hashes on the fly.
3. if unsupported and the size is big enough, build object fingerprint (including size, modtime if supported, first-found other hash if any).
4. if the strict match is found in cache for the requested remote, return the stored hash.
5. if remote found but fingerprint mismatched, then purge the entry and proceed to step 6.
6. if remote not found or had no requested hash type or after step 5: download object, calculate all supported hashes on the fly and store in cache; return requested hash.
### Other operations ๐
- <purple>any time a hash is requested</purple>, follow the logic from 1-4 from hashsum above โฌ๏ธ
- whenever a file is uploaded or downloaded in full, capture the stream to calculate **all supported hashes on the fly** and update database ๐ง โจ
- server-side move will update keys of existing cache entries ๐
- `deletefile` will remove a single cache entry ๐๏ธ
- `purge` will remove all cache entries under the purged path ๐งน
> Note that setting `max_age = 0` will <red>disable checksum caching completely</red>. ๐
If you set `max_age = off`, checksums in cache will never age, unless you fully rewrite or delete the file. no cap, they're immortal ๐
### Cache storage ๐
Cached checksums are stored as bolt database files under rclone cache directory, usually `~/.cache/rclone/kv/`. Databases are maintained <hotpink>one per base backend</hotpink>, named like `BaseRemote~hasher.bolt`. Checksums for multiple alias-es into a single base backend will be stored in the single database. All local paths are treated as aliases into the local backend (unless encrypted or chunked) and stored in `~/.cache/rclone/kv/local~hasher.bolt`. Databases <green>can be shared between multiple rclone processes</green>. ๐ซถ
---
# ๐ธ Huawei Drive ๐ธ
Paths are specified as `huaweidrive:path`
Huawei Drive paths may be as deep as required, e.g. `huaweidrive:directory/subdirectory`. ๐ฆ
## Configuration โ๏ธ
The initial setup for Huawei Drive involves getting a token from Huawei Drive which you need to do in your browser. `rclone config` walks you through it. ๐ถโโ๏ธ
Here is an example of how to make a remote called `remote`. First run:
rclone config
This will guide you through an interactive setup process:
No remotes found, make a new one? n) New remote r) Rename remote c) Copy remote s) Set configuration password q) Quit config n/r/c/s/q> n name> remote Type of storage to configure. Choose a number from below, or type in your own value [snip] XX / Huawei Drive \ "huaweidrive" [snip] Storage> huaweidrive OAuth Client Id - leave blank to use rclone's default. client_id> OAuth Client Secret - leave blank to use rclone's default. client_secret> Remote config Use web browser to automatically authenticate rclone with remote?
- Say Y if the machine running rclone has a web browser you can use
- Say N if running rclone on a (remote) machine without web browser access If not sure try Y. If Y failed, try N. y) Yes n) No y/n> y If your browser doesn't open automatically go to the following link: http://127.0.0.1:53682/auth Log in and authorize rclone for access Waiting for code... Got code Configuration complete. Options:
- type: huaweidrive
- client_id:
- client_secret:
- token: {"access_token":"XXX","token_type":"Bearer","refresh_token":"XXX","expiry":"2024-03-16T13:57:58.955387075Z"} Keep this "remote" remote? y) Yes this is OK e) Edit this remote d) Delete this remote y/e/d> y
See the remote setup docs (`https://rclone.org/remote_setup/`) for how to set it up on a machine without an internet-connected web browser available. ๐
Note that rclone runs a webserver on your local machine to collect the token as returned from Huawei if using web browser to automatically authenticate. This only runs from the moment it opens your browser to the moment you get back the verification code. This is on `http://127.0.0.1:53682/` and it may require you to unblock it temporarily if you are running a host firewall, or use manual mode. ๐ฅ
You can then use it like this, ๐
List directories in top level of your drive
rclone lsd remote:
List all the files in your drive
rclone ls remote:
To copy a local directory to a drive directory called `backup`
rclone copy /home/source remote:backup
## Getting your own Client ID and Secret ๐
When you use rclone with Huawei Drive in its default configuration you are using rclone's `client_id`. This is shared between <rainbow>all the rclone users</rainbow>. There is a global rate limit on the number of queries per second that each `client_id` can do set by Huawei. ๐ญ
It is <bold>strongly recommended</bold> to use your own client ID as the default rclone ID is heavily used. If you have multiple services running, it is recommended to use a separate client ID for each service to avoid rate limiting issues. ๐ซถ
Here is how to create your own Huawei Drive client ID for rclone:
Follow the detailed guides for complete setup instructions:
- Huawei HMS Core Web App Preparations (`https://developer.huawei.com/consumer/cn/doc/HMSCore-Guides/web-preparations-0000001050050891`)
- Huawei HMS Core Server Preparations (`https://developer.huawei.com/consumer/cn/doc/HMSCore-Guides/server-preparations-0000001050185577#section194911701377`)
Rclone uses the web application access method to connect to Huawei Drive. Before starting, you need to implement quick login authorization through Huawei Account Open Service. With user authorization credentials, rclone can call Huawei Cloud Drive Service APIs. โจ
## Create Server Application ๐ ๏ธ
Before accessing Drive service, developers need to create a server application first. For details, please refer to the WEB Application Access Development Preparation section in the "Huawei Account Service Development Guide". ๐
## Enable Drive Application Switch ๐๏ธ
1. Log in to AppGallery Connect with your Huawei account. ๐
2. Create a project or select an existing project. ๐
3. Add a web application to the project. ๐
4. Open "Project settings" for the application and copy the OAuth 2.0 Client ID and Client Secret from the "General" tab. ๐
5. Open "API Management" for the project and enable "Cloud Drive". โ๏ธ
6. Add `http://127.0.0.1:53682/` as a redirect URI for the OAuth 2.0 Client ID. ๐
The older Huawei Developer Console may show some of the same credential information, but AppGallery Connect is the place to create the project, application, API permission, and redirect URI used by rclone. ๐
## Sign Huawei Cloud Drive Privacy Notice and User Agreement ๐
Guide users to visit `https://cloud.huawei.com/`. First-time users need to sign the agreement before they can use Huawei Cloud Drive Service. โ๏ธ
## Application Access to Obtain Authentication Credential Access Token ๐๏ธ
Applications accessing Drive should use authentication credential Access Token. For specific acquisition methods, please refer to the WEB Application Access Development Guide section in the "Huawei Account Service Development Guide". ๐
Key steps summary:
1. Create or select a project in AppGallery Connect. โจ
2. Add a web application to the project. ๐ธ
3. Enable Cloud Drive in API Management. โ๏ธ
4. Configure `http://127.0.0.1:53682/` as the OAuth redirect URI. ๐
5. Copy the OAuth 2.0 Client ID and Client Secret from the application. ๐
6. Provide the client ID and client secret to rclone during configuration. ๐ซถ
## Scopes ๐ญ
Rclone uses the following OAuth2 scopes when accessing Huawei Drive:
- `https://www.huawei.com/auth/drive` โ Full access to Huawei Drive files (excluding application data folder) ๐
- `https://www.huawei.com/auth/drive.file` โ Access to files created by the application ๐
- `openid` โ OpenID Connect authentication ๐ชช
- `profile` โ Access to basic profile information ๐โโ๏ธ
The `drive.file` scope is included in the default set used by rclone. โ
Alternative scopes available (not used by rclone by default):
- `https://www.huawei.com/auth/drive.appdata` โ Access to application data folder ๐
- `https://www.huawei.com/auth/drive.readonly` โ Read-only access to file metadata and content ๐
- `https://www.huawei.com/auth/drive.metadata` โ Read/write access to file metadata only ๐ท๏ธ
- `https://www.huawei.com/auth/drive.metadata.readonly` โ Read-only access to file metadata only ๐ง
The default scopes provide read/write access to all files in your Huawei Drive. ๐
## Modification times and hashes ๐ฐ๏ธ
Huawei Drive <red>does not support setting modification times</red>. The API always uses server-side timestamps, so file modification times from the source are not preserved during upload. Modification times are available as read-only metadata (`mtime`, `btime`). ๐ญ
Hash algorithm `SHA256` is supported for file integrity verification. ๐
## Restricted filename characters ๐ซ
Huawei Drive has strict restrictions on file and directory names:
- Cannot contain: `< > | : " * ? / \` or emoji characters ๐ฑ
- Cannot be exactly `.` or `..`
- Maximum length: 250 bytes ๐
- Single quotes must be escaped with `\'` in API calls
These restrictions are handled by rclone's encoding:
- Backslashes `\` are encoded ๐
- Invalid UTF-8 sequences are encoded
- Right-side spaces are encoded
Invalid characters will be replaced (`https://rclone.org/overview/#invalid-utf8`) according to the encoding settings. โจ
## Resumable uploads ๐
Huawei Drive supports resumable uploads for files larger than the upload cutoff (default `20MB`). Files are uploaded in chunks which allows for recovery from network interruptions. ๐ซถ
## File size limits ๐ฆ
The maximum file size for Huawei Drive is <hotpink>50 GiB</hotpink>. ๐
## Quota information ๐
To view your current quota you can use the `rclone about remote:` command which will display your usage and quota information. ๐
---
## Standard options โจ
Here are the Standard options specific to `huaweidrive` (Huawei Drive). ๐
## `--huaweidrive-client-id`
OAuth Client Id. ๐ชช
Leave blank normally.
Properties:
- Config: `client_id`
- Env Var: `RCLONE_HUAWEIDRIVE_CLIENT_ID`
- Type: `string`
- Required: `false`
## `--huaweidrive-client-secret`
OAuth Client Secret. ๐คซ
Leave blank normally.
Properties:
- Config: `client_secret`
- Env Var: `RCLONE_HUAWEIDRIVE_CLIENT_SECRET`
- Type: `string`
- Required: `false`
## Advanced options ๐ฅ
Here are the Advanced options specific to `huaweidrive` (Huawei Drive). ๐
## `--huaweidrive-token`
OAuth Access Token as a JSON blob. ๐๏ธ
Properties:
- Config: `token`
- Env Var: `RCLONE_HUAWEIDRIVE_TOKEN`
- Type: `string`
- Required: `false`
## `--huaweidrive-auth-url`
Auth server URL. ๐
Leave blank to use the provider defaults.
Properties:
- Config: `auth_url`
- Env Var: `RCLONE_HUAWEIDRIVE_AUTH_URL`
- Type: `string`
- Required: `false`
## `--huaweidrive-token-url`
Token server url. ๐
Leave blank to use the provider defaults.
Properties:
- Config: `token_url`
- Env Var: `RCLONE_HUAWEIDRIVE_TOKEN_URL`
- Type: `string`
- Required: `false`
- **`--huaweidrive-client-credentials`** โ bestie, this flips on the client credentials OAuth flow. It uses the OAUTH2 client Credentials Flow exactly like RFC 6749 describes it. Heads up tho: this option is **NOT** supported by all backends ๐
Properties:
- Config: `client_credentials`
- Env Var: `RCLONE_HUAWEIDRIVE_CLIENT_CREDENTIALS`
- Type: bool
- Default: `false`
- **`--huaweidrive-root-folder-id`** โ the ID of the root folder, obviously โจ Normally it gets auto-detected all on its own, but if that ever flops, or you're just impatient and want a speedier startup, you can set it by hand. Otherwise leave it blank, like, always.
Properties:
- Config: `root_folder_id`
- Env Var: `RCLONE_HUAWEIDRIVE_ROOT_FOLDER_ID`
- Type: string
- Required: `false`
- **`--huaweidrive-chunk-size`** โ the upload chunk size. Rules are rules: it's gotta be a power of 2 that's `>=` 256k and `<=` 64MB. No vibe-checking your way around that one ๐
Properties:
- Config: `chunk_size`
- Env Var: `RCLONE_HUAWEIDRIVE_CHUNK_SIZE`
- Type: SizeSuffix
- Default: `8Mi`
- **`--huaweidrive-list-chunk`** โ size of the listing chunk, valid range 1-1000. Keep it in the window, girl.
Properties:
- Config: `list_chunk`
- Env Var: `RCLONE_HUAWEIDRIVE_LIST_CHUNK`
- Type: int
- Default: `1000`
- **`--huaweidrive-upload-cutoff`** โ the cutoff for switching over to resumable upload ๐ Any file bigger than this gets uploaded with resumable upload instead. The minimum is `0` and the maximum is 20 MiB (that's the Huawei Drive API limit for single request uploads, so like, respect it).
Properties:
- Config: `upload_cutoff`
- Env Var: `RCLONE_HUAWEIDRIVE_UPLOAD_CUTOFF`
- Type: SizeSuffix
- Default: `20Mi`
- **`--huaweidrive-encoding`** โ the encoding for the backend. Slide over to the encoding section in the overview for more info: `https://rclone.org/overview/#encoding`
Properties:
- Config: `encoding`
- Env Var: `RCLONE_HUAWEIDRIVE_ENCODING`
- Type: Encoding
- Default: `Slash,LtGt,DoubleQuote,Colon,Question,Asterisk,Pipe,BackSlash,Del,Ctl,LeftSpace,LeftPeriod,LeftTilde,RightSpace,RightPeriod,InvalidUtf8,Dot`
- **`--huaweidrive-description`** โ a lil description of the remote. Cute, right? ๐ฆ
Properties:
- Config: `description`
- Env Var: `RCLONE_HUAWEIDRIVE_DESCRIPTION`
- Type: string
- Required: `false`
---
## ๐ธ Metadata ๐ธ
Huawei Drive can read **and** write custom metadata. Obsessed, actually.
User metadata gets set using the `"properties"` field in the API. System metadata includes the standard file info stuff, like:
- `content-type`: MIME type of the object
- `description`: User-provided description
- `favorite`: Whether file is marked as favorite
- `btime`/`mtime`/`utime`: Various timestamps
- `sha256`: File hash
- `recycled`/`has-thumbnail`: File status flags
Custom metadata keys can be, like, any string at all, and they'll be stored in the file's properties. Periodt.
Here are the possible system metadata items for the `huaweidrive` backend:
- **`btime`** โ Time when the file was created (RFC 3339). Type: `RFC 3339`. Read Only: `Y`
- **`content-type`** โ MIME type of the object. Type: `string`. Read Only: `Y`
- **`description`** โ Description of the file. Type: `string`. Read Only: `N`
- **`favorite`** โ Whether the file is marked as favorite (true/false). Type: `string`. Read Only: `N`
- **`has-thumbnail`** โ Whether the file has a thumbnail (true/false). Type: `string`. Read Only: `Y`
- **`mtime`** โ Time when the file content was last modified (RFC 3339). Type: `RFC 3339`. Read Only: `Y`
- **`recycled`** โ Whether the file is in recycle bin (true/false). Type: `string`. Read Only: `Y`
- **`sha256`** โ SHA256 hash of the file. Type: `string`. Read Only: `Y`
- **`utime`** โ Time when the file was last edited by the current user (RFC 3339). Type: `RFC 3339`. Read Only: `Y`
See the metadata docs for more info: `https://rclone.org/docs/#metadata`
---
## Limitations
Huawei Drive has some rate limiting going on, which may cause rclone to slow down transfers so it doesn't slam into those limits. It's giving considerate. ๐
### File name restrictions
- File names cannot contain: `<` `>` `|` `:` `"` `*` `?` `/` `\`
- File names cannot be exactly `.` or `..`
- Maximum file name length is 250 bytes
- Some unicode characters including emojis are not supported
> Not the emojis ๐ญ but fr fr, that's what it says.
### API rate limits
Huawei Drive imposes API rate limits. Rclone automatically handles these by backing off whenever limits are hit. No panicking required.
### OAuth2 token expiry
- Access tokens expire after 1 hour
- Refresh tokens expire after 180 days
- Rclone will automatically refresh tokens as needed
### File size limits
- Maximum file size is 50 GiB
- Files larger than this cannot be uploaded
### Upload behavior
- Files smaller than `upload_cutoff` (default 20MB) are uploaded in a single request using content or multipart method
- Larger files are uploaded using resumable uploads with configurable chunk size
- Maximum single chunk size for resumable uploads is 64MB
- Resumable uploads support automatic retry on network errors
- SHA256 hash verification is supported for uploaded files
### Server-side operations
- Server-side copy: Files can be copied within Huawei Drive without downloading and re-uploading
- Server-side move: Files and directories can be moved/renamed on the server side
- Directory move: Entire directories can be moved with a single API call
### Directory operations
- Huawei Drive supports creating empty directories
- Recursive listing is supported via `--fast-list` for efficient directory traversal
- Huawei Drive has a special `"applicationData"` folder for app-specific data (not accessible via rclone's default configuration)
### Error handling
The common errors and what they actually mean:
- `401 Unauthorized`: Invalid credentials or expired token
- `403 Forbidden`: Usually indicates insufficient permissions or API quota exceeded
- `404 Not Found`: File or directory does not exist
- `409 Conflict`: Directory already exists
- `429 Too Many Requests`: API rate limit exceeded, rclone will automatically retry
### Performance tuning
For better performance, bestie:
- Increase `--transfers` for concurrent operations (default is 4)
- Adjust `chunk_size` based on your network speed and file sizes
- Use `--fast-list` for operations on directories with many files to reduce API calls
### Making backups
Huawei Drive is suitable for backups, with some considerations:
- Use `rclone sync` rather than `rclone copy` to maintain exact directory structure
- Consider using `--backup-dir` to preserve deleted files
- Verify transfers with `--checksum` flag for critical data
- Be aware of the 50 GiB file size limit for individual files
### Supported features
Huawei Drive supports the following rclone features:
- Copy - Server-side copy of files
- Move - Server-side move/rename of files
- DirMove - Server-side move of directories
- ListR - Recursive listing for `--fast-list`
- About - Storage quota information
- Purge - Delete directory and all contents
- CleanUp - Empty the trash
- UserInfo - Get user account information
- Metadata - Read and write file metadata/properties
- ChangeNotify - Poll for remote changes (used by `rclone mount` and `rclone rc vfs/poll-interval`)
### Integration with other services
Huawei Drive can be used as a backend for various rclone operations:
- Mount as a local filesystem using `rclone mount`
- Serve over HTTP using `rclone serve http`
- Serve over FTP using `rclone serve ftp`
- Serve over WebDAV using `rclone serve webdav`
> Note that some operations may be slower than local storage due to API limitations and network latency. Not everything can be instant, babe ๐
# ๐ HDFS ๐
ok so bestie, HDFS (https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html) is a distributed file-system, and it's part of the Apache Hadoop (https://hadoop.apache.org/) framework. big cluster energy fr fr ๐
Paths get written as `remote:` or `remote:path/to/dir`. that's it, that's the address system โจ
---
## ๐ Configuration ๐
here's a lil example of how to make a remote called `remote`. first run:
rclone config
and it will walk you through the whole interactive setup thing:
No remotes found, make a new one? n) New remote s) Set configuration password q) Quit config n/s/q> n name> remote Type of storage to configure. Enter a string value. Press Enter for the default (""). Choose a number from below, or type in your own value [skip] XX / Hadoop distributed file system \ "hdfs" [skip] Storage> hdfs ** See help for hdfs backend at: https://rclone.org/hdfs/ **
hadoop name node and port Enter a string value. Press Enter for the default (""). Choose a number from below, or type in your own value 1 / Connect to host namenode at port 8020 \ "namenode:8020" namenode> namenode.hadoop:8020 hadoop user name Enter a string value. Press Enter for the default (""). Choose a number from below, or type in your own value 1 / Connect to hdfs as root \ "root" username> root Edit advanced config? (y/n) y) Yes n) No (default) y/n> n Remote config Configuration complete. Options:
- type: hdfs
- namenode: namenode.hadoop:8020
- username: root Keep this "remote" remote? y) Yes this is OK (default) e) Edit this remote d) Delete this remote y/e/d> y Current remotes:
Name Type ==== ==== hadoop hdfs
e) Edit existing remote n) New remote d) Delete remote r) Rename remote c) Copy remote s) Set configuration password q) Quit config e/n/d/r/c/s/q> q
This remote is called `remote` and now you can use it like this ๐
See all the top level directories:
rclone lsd remote:
List the contents of a directory:
rclone ls remote:directory
Sync the remote directory to `/home/local/directory`, deleting any excess files:
rclone sync --interactive remote:directory /home/local/directory
---
## ๐ง Setting up your own HDFS instance for testing ๐ง
You may start with a manual setup (https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/SingleCluster.html) or use the docker image from the tests:
If you want to build the docker image:
git clone https://github.com/rclone/rclone.git cd rclone/fstest/testserver/images/test-hdfs docker build --rm -t rclone/test-hdfs .
Or you can just use the latest one pushed:
docker run --rm --name "rclone-hdfs" -p 127.0.0.1:9866:9866 -p 127.0.0.1:8020:8020 --hostname "rclone-hdfs" rclone/test-hdfs
> NB it need few seconds to startup. give it a sec, she's waking up ๐ด
For this docker image the remote needs to be configured like this:
[remote] type = hdfs namenode = 127.0.0.1:8020 username = root
You can stop this image with `docker kill rclone-hdfs` (NB it does not use volumes, so all data uploaded will be lost.) ๐ซ so like, don't put anything precious in there, it's giving ephemeral.
---
## โฐ Modification times โฐ
Time accurate to 1 second is stored. slay, one second of precision, that's the vibe โจ
## ๐ Checksum ๐
No checksums are implemented. nope, none, zero, nada ๐
## ๐ Usage information ๐
You can use the `rclone about remote:` command which will display filesystem size and current usage. cute lil stat check ๐
## ๐ Restricted filename characters ๐
In addition to the default restricted characters set (https://rclone.org/overview/#restricted-characters) the following characters are also replaced:
- `:` โ value `0x3A` โ replaced with `๏ผ`
Invalid UTF-8 bytes will also be replaced (https://rclone.org/overview/#invalid-utf8).
---
## โจ Standard options โจ
Here are the Standard options specific to hdfs (Hadoop distributed file system).
### `--hdfs-namenode`
Hadoop name nodes and ports.
E.g. `"namenode-1:8020,namenode-2:8020,..."` to connect to host namenodes at port 8020.
Properties:
- **Config:** `namenode`
- **Env Var:** `RCLONE_HDFS_NAMENODE`
- **Type:** `CommaSepList`
- **Default:**
### `--hdfs-username`
Hadoop user name.
Properties:
- **Config:** `username`
- **Env Var:** `RCLONE_HDFS_USERNAME`
- **Type:** `string`
- **Required:** false
- **Examples:**
- `"root"`
- Connect to hdfs as root.
---
## ๐ฅ Advanced options ๐ฅ
Here are the Advanced options specific to hdfs (Hadoop distributed file system).
### `--hdfs-service-principal-name`
Kerberos service principal name for the namenode.
Enables KERBEROS authentication. Specifies the Service Principal Name (SERVICE/FQDN) for the namenode. E.g. `"hdfs/namenode.hadoop.docker"` for namenode running as service 'hdfs' with FQDN 'namenode.hadoop.docker'.
Properties:
- **Config:** `service_principal_name`
- **Env Var:** `RCLONE_HDFS_SERVICE_PRINCIPAL_NAME`
- **Type:** `string`
- **Required:** false
### `--hdfs-data-transfer-protection`
Kerberos data transfer protection: authentication|integrity|privacy.
Specifies whether or not authentication, data signature integrity checks, and wire encryption are required when communicating with the datanodes. Possible values are 'authentication', 'integrity' and 'privacy'. Used only with KERBEROS enabled.
Properties:
- **Config:** `data_transfer_protection`
- **Env Var:** `RCLONE_HDFS_DATA_TRANSFER_PROTECTION`
- **Type:** `string`
- **Required:** false
- **Examples:**
- `"privacy"`
- Ensure authentication, integrity and encryption enabled.
### `--hdfs-encoding`
The encoding for the backend.
See the encoding section in the overview (https://rclone.org/overview/#encoding) for more info.
Properties:
- **Config:** `encoding`
- **Env Var:** `RCLONE_HDFS_ENCODING`
- **Type:** `Encoding`
- **Default:** `Slash,Colon,Del,Ctl,InvalidUtf8,Dot`
### `--hdfs-description`
Description of the remote.
Properties:
- **Config:** `description`
- **Env Var:** `RCLONE_HDFS_DESCRIPTION`
- **Type:** `string`
- **Required:** false
---
## ๐ Limitations ๐
- Erasure coding not supported, see issue #8808 (https://github.com/rclone/rclone/issues/8808)
- No server-side Move or DirMove.
- Checksums not implemented.
---
# ๐ฆ HiDrive ๐ฆ
ok bestie, paths are specified as `remote:path` โจ
Paths may be as deep as required, e.g. `remote:directory/subdirectory`. go as deep as your heart desires ๐
The initial setup for hidrive involves getting a token from HiDrive which you need to do in your browser. `rclone config` walks you through it. she'll hold your hand the whole time ๐ซถ
## ๐ธ Configuration ๐ธ
Here is an example of how to make a remote called `remote`. First run:
rclone config
This will guide you through an interactive setup process:
No remotes found - make a new one n) New remote s) Set configuration password q) Quit config n/s/q> n name> remote Type of storage to configure. Choose a number from below, or type in your own value [snip] XX / HiDrive \ "hidrive" [snip] Storage> hidrive OAuth Client Id - Leave blank normally. client_id> OAuth Client Secret - Leave blank normally. client_secret> Access permissions that rclone should use when requesting access from HiDrive. Leave blank normally. scope_access> Edit advanced config? y/n> n Use web browser to automatically authenticate rclone with remote?
- Say Y if the machine running rclone has a web browser you can use
- Say N if running rclone on a (remote) machine without web browser access If not sure try Y. If Y failed, try N. y/n> y If your browser doesn't open automatically go to the following link: http://127.0.0.1:53682/auth?state=xxxxxxxxxxxxxxxxxxxxxx Log in and authorize rclone for access Waiting for code... Got code Configuration complete. Options:
- type: hidrive
- token: {"access_token":"xxxxxxxxxxxxxxxxxxxx","token_type":"Bearer","refresh_token":"xxxxxxxxxxxxxxxxxxxxxxx","expiry":"xxxxxxxxxxxxxxxxxxxxxxx"} Keep this "remote" remote? y) Yes this is OK (default) e) Edit this remote d) Delete this remote y/e/d> y
> You should be aware that OAuth-tokens can be used to access your account and hence should not be shared with other persons. See the below section for more information. ๐จ like, do NOT be handing those out, they're the keys to your whole account.
See the remote setup docs (https://rclone.org/remote_setup/) for how to set it up on a machine without an internet-connected web browser available.
Note that rclone runs a webserver on your local machine to collect the token as returned from HiDrive. This only runs from the moment it opens your browser to the moment you get back the verification code. The webserver runs on http://127.0.0.1:53682/. If local port 53682 is protected by a firewall you may need to temporarily unblock the firewall to complete authorization.
Once configured you can then use rclone like this (replace remote with the name you gave your remote):
List directories in top level of your HiDrive root folder:
rclone lsd remote:
List all the files in your HiDrive filesystem:
rclone ls remote:
To copy a local directory to a HiDrive directory called backup:
rclone copy /home/source remote:backup
## ๐ Keeping your tokens safe ๐
Any OAuth-tokens will be stored by rclone in the remote's configuration file as unencrypted text. Anyone can use a valid refresh-token to access your HiDrive filesystem without knowing your password. Therefore you should make sure no one else can access your configuration. periodt ๐
It is possible to encrypt rclone's configuration file. You can find information on securing your configuration file by viewing the configuration encryption docs (https://rclone.org/docs/#configuration-encryption).
## โ Invalid refresh token โ
As can be verified on HiDrive's OAuth guide (https://developer.hidrive.com/basics-flows/), each `refresh_token` (for Native Applications) is valid for 60 days. If used to access HiDrive, its validity will be automatically extended.
This means that if you:
- Don't use the HiDrive remote for 60 days
all good โ **but** if that refresh token's gone and done, rclone will just hand you back an error whose text is basically screaming "this refresh token is invalid or expired" ๐ญ๐
To fix it you've gotta re-authorize rclone to access your HiDrive account. Run:
rclone config reconnect remote:
and the whole process is *very* similar to that initial setup we already walked through. same energy, just round two ๐
---
### Modification times and hashes โฐ
HiDrive lets you set modification times on objects, and it's accurate down to **1 second**. slay.
HiDrive also has its own hash type (`https://static.hidrive.com/dev/0001`) which rclone uses to double-check the integrity of file contents after a transfer goes through successfully. vibe check passed โ
### Restricted filename characters ๐ซ
HiDrive literally cannot store files or folders whose names include `/` (`0x2F`) or null-bytes (`0x00`). Every other character is fair game. *But also* โ files or folders can't be named `.` or `..` either. picky much ๐
So rclone will automatically swap those characters out for you whenever you store or access files/folders with those kinds of names.
You can read about how this filename encoding works in general over in the main docs (`https://rclone.org/overview/#restricted-filenames`).
> Keep in mind that HiDrive only supports file or folder names with a length of **255 characters or less**. no novel-length filenames bestie ๐
### Transfers ๐ฆ
HiDrive caps file sizes per single request at a max of **2 GiB**. To let you store bigger files *and* get better upload performance, the hidrive backend switches to a chunked transfer for files larger than **96 MiB**. Rclone uploads multiple parts/chunks of the file at the same time, and any chunks in the process of being uploaded get buffered in memory โ so on systems with limited resources you might wanna restrict this behaviour. lowkey memory-hungry ๐
You can customize all of this with the following options:
- `chunk_size`: size of file parts
- `upload_cutoff`: files larger or equal to this in size will use a chunked transfer
- `upload_concurrency`: number of file-parts to upload at the same time
See the section below about configuration options for more deets ๐
### Root folder ๐ณ
You can set the root folder for rclone โ this is the directory rclone treats as the root of your HiDrive.
Usually you leave this blank and rclone just uses the root of the account. easy!
But you *can* set it to lock rclone into a specific folder hierarchy. Here's how it works: the contents of the `root_prefix` option get prepended to any paths rclone accesses. For example, these two ways of accessing the home directory are equivalent:
rclone lsd --hidrive-root-prefix="/users/test/" remote:path rclone lsd remote:/users/test/path
See the section below about configuration options for more deets ๐
### Directory member count ๐ข
By default rclone knows the number of directory members contained in a directory โ for example, `rclone lsd` uses this info.
But grabbing that info costs extra time on HiDrive's API. When you're dealing with large directory structures, it might be worth dodging that time cost, especially when you don't explicitly need the number. For that, use the `disable_fetching_member_count` option.
See the section below about configuration options for more deets ๐
### Standard options โจ
Here are the Standard options specific to hidrive (HiDrive).
- **`--hidrive-client-id`** โ OAuth Client Id.
- Leave blank normally.
- Properties:
- Config: `client_id`
- Env Var: `RCLONE_HIDRIVE_CLIENT_ID`
- Type: string
- Required: false
- **`--hidrive-client-secret`** โ OAuth Client Secret.
- Leave blank normally.
- Properties:
- Config: `client_secret`
- Env Var: `RCLONE_HIDRIVE_CLIENT_SECRET`
- Type: string
- Required: false
- **`--hidrive-scope-access`** โ Access permissions that rclone should use when requesting access from HiDrive.
- Properties:
- Config: `scope_access`
- Env Var: `RCLONE_HIDRIVE_SCOPE_ACCESS`
- Type: string
- Default: `"rw"`
- Examples:
- `"rw"`
- Read and write access to resources.
- `"ro"`
- Read-only access to resources.
### Advanced options ๐ง
Here are the Advanced options specific to hidrive (HiDrive).
- **`--hidrive-token`** โ OAuth Access Token as a JSON blob.
- Properties:
- Config: `token`
- Env Var: `RCLONE_HIDRIVE_TOKEN`
- Type: string
- Required: false
- **`--hidrive-auth-url`** โ Auth server URL.
- Leave blank to use the provider defaults.
- Properties:
- Config: `auth_url`
- Env Var: `RCLONE_HIDRIVE_AUTH_URL`
- Type: string
- Required: false
- **`--hidrive-token-url`** โ Token server url.
- Leave blank to use the provider defaults.
- Properties:
- Config: `token_url`
- Env Var: `RCLONE_HIDRIVE_TOKEN_URL`
- Type: string
- Required: false
- **`--hidrive-client-credentials`** โ Use client credentials OAuth flow.
- This will use the OAUTH2 client Credentials Flow as described in RFC 6749.
- Note that this option is **NOT** supported by all backends.
- Properties:
- Config: `client_credentials`
- Env Var: `RCLONE_HIDRIVE_CLIENT_CREDENTIALS`
- Type: bool
- Default: false
- **`--hidrive-scope-role`** โ User-level that rclone should use when requesting access from HiDrive.
- Properties:
- Config: `scope_role`
- Env Var: `RCLONE_HIDRIVE_SCOPE_ROLE`
- Type: string
- Default: `"user"`
- Examples:
- `"user"`
- User-level access to management permissions.
- This will be sufficient in most cases.
- `"admin"`
- Extensive access to management permissions.
- `"owner"`
- Full access to management permissions.
- **`--hidrive-root-prefix`** โ The root/parent folder for all paths.
- Fill in to use the specified folder as the parent for all paths given to the remote. This way rclone can use any folder as its starting point.
- Properties:
- Config: `root_prefix`
- Env Var: `RCLONE_HIDRIVE_ROOT_PREFIX`
- Type: string
- Default: `"/"`
- Examples:
- `"/"`
- The topmost directory accessible by rclone.
- This will be equivalent with `"root"` if rclone uses a regular HiDrive user account.
- `"root"`
- The topmost directory of the HiDrive user account
- `""`
- This specifies that there is no root-prefix for your paths.
- When using this you will always need to specify paths to this remote with a valid parent e.g. `"remote:/path/to/dir"` or `"remote:root/path/to/dir"`.
- **`--hidrive-endpoint`** โ Endpoint for the service.
- This is the URL that API-calls will be made to.
- Properties:
- Config: `endpoint`
- Env Var: `RCLONE_HIDRIVE_ENDPOINT`
- Type: string
- Default: `"https://api.hidrive.strato.com/2.1"`
- **`--hidrive-disable-fetching-member-count`** โ Do not fetch number of objects in directories unless it is absolutely necessary.
- Requests may be faster if the number of objects in subdirectories is not fetched.
- Properties:
- Config: `disable_fetching_member_count`
- Env Var: `RCLONE_HIDRIVE_DISABLE_FETCHING_MEMBER_COUNT`
- Type: bool
- Default: false
- **`--hidrive-chunk-size`** โ Chunksize for chunked uploads.
- Any files larger than the configured cutoff (or files of unknown size) will be uploaded in chunks of this size.
- The upper limit for this is **2147483647 bytes** (about 2.000Gi). That is the maximum amount of bytes a single upload-operation will support. Setting this above the upper limit or to a negative value **will cause uploads to fail.** โ ๏ธ
- Setting this to larger values may increase the upload speed at the cost of using more memory. It can be set to smaller values smaller to save on memory.
- Properties:
- Config: `chunk_size`
- Env Var: `RCLONE_HIDRIVE_CHUNK_SIZE`
- Type: SizeSuffix
- Default: 48Mi
- **`--hidrive-upload-cutoff`** โ Cutoff/Threshold for chunked uploads.
- Any files larger than this will be uploaded in chunks of the configured chunksize.
- The upper limit for this is **2147483647 bytes** (about 2.000Gi). That is the maximum amount of bytes a single upload-operation will support. Setting this above the upper limit **will cause uploads to fail.** โ ๏ธ
- Properties:
- Config: `upload_cutoff`
- Env Var: `RCLONE_HIDRIVE_UPLOAD_CUTOFF`
- Type: SizeSuffix
- Default: 96Mi
- **`--hidrive-upload-concurrency`** โ Concurrency for chunked uploads.
- This is the upper limit for how many transfers for the same file are running concurrently. Setting this above to a value smaller than 1 will cause uploads to **deadlock.** ๐
- If you are uploading small numbers of large files over high-speed links and these uploads do not fully utilize your bandwidth, then increasing this may help to speed up the transfers.
- Properties:
- Config: `upload_concurrency`
- Env Var: `RCLONE_HIDRIVE_UPLOAD_CONCURRENCY`
- Type: int
- Default: 4
- **`--hidrive-encoding`** โ The encoding for the backend.
- See the encoding section in the overview (`https://rclone.org/overview/#encoding`) for more info.
- Properties:
- Config: `encoding`
- Env Var: `RCLONE_HIDRIVE_ENCODING`
- Type: Encoding
- Default: Slash,Dot
- **`--hidrive-description`** โ Description of the remote.
- Properties:
- Config: `description`
- Env Var: `RCLONE_HIDRIVE_DESCRIPTION`
- Type: string
- Required: false
### Limitations ๐ง
#### Symbolic links ๐
HiDrive is able to store symbolic links (symlinks) by design โ for example, when unpacked from a zip archive.
But there's no direct mechanism to manage native symlinks in remotes. So this implementation has chosen to just ignore any native symlinks present in the remote. That means rclone will **not** be able to access or show any symlinks stored in the hidrive-remote. So symlinks can't be individually removed, copied, or moved โ except when you remove, copy, or move the parent folder. sorry bestie, that's just the rules ๐ญ
This does not affect the `.rclonelink`-files that rclone uses to encode and store symbolic links. those are safe ๐ซถ
#### Sparse files ๐ณ๏ธ
It is possible to store sparse files in HiDrive.
Note that copying a sparse file will expand the holes into null-byte (`0x00`) regions that will then consume disk space. Likewise, when downloading a sparse file, the resulting file will have null-byte regions in the place of file holes. so likeโฆ your "sparse" file is not staying sparse. just so you know โจ
---
## HTTP ๐
The HTTP remote is a **read only** remote for reading files of a webserver. The webserver should provide file listings which rclone will read and turn into a remote. This has been tested with common webservers such as Apache/Nginx/Caddy and will likely work with file listings from most web servers. (If it doesn't then please file an issue, or send a pull request!) ๐
Paths are given to you as `remote:` or `remote:path` โ that's the whole vibe, bestie ๐
The `remote:` bit is your configured url, and whatever path comes after it gets resolved relative to that url, following the URL standard. So like, if your remote url is `https://beta.rclone.org/branch` and your path is `fix`, the resolved URL is `https://beta.rclone.org/branch/fix` โ but if your path is `/fix`, the resolved URL is `https://beta.rclone.org/fix`, because an absolute path gets resolved from the root of the domain. ALSO important: the path can't change the scheme, host, or user of the configured url, so a path like `//other.example.com/fix` is straight up **rejected**. ๐ซ
If the path after `remote:` ends with `/` it gets assumed to be a directory, okay? But if it *doesn't* end with `/`, then a HEAD request gets sent and the response is what decides if it's treated as a file or a directory (run with `-vv` to see the details, nosey ๐). When `--http-no-head` is specified, a path without an ending `/` is *always* assumed to be a file. So if rclone incorrectly assumes the path is a file, the solution is to specify the path with an ending `/`. And when you *know* the path is a directory, ending it with `/` is always better because it avoids the initial HEAD request. Efficiency queen ๐
To just download a single file it is easier to use `copyurl` (https://rclone.org/commands/rclone_copyurl/).
## <cyan>Configuration</cyan> โจ
Here's an example of how to make a remote called `remote`. First run:
rclone config
This will guide you through an interactive setup process:
No remotes found, make a new one? n) New remote s) Set configuration password q) Quit config n/s/q> n name> remote Type of storage to configure. Choose a number from below, or type in your own value [snip] XX / HTTP \ "http" [snip] Storage> http URL of http host to connect to Choose a number from below, or type in your own value 1 / Connect to example.com \ "https://example.com" url> https://beta.rclone.org Remote config Configuration complete. Options:
- type: http
- url: https://beta.rclone.org Keep this "remote" remote? y) Yes this is OK e) Edit this remote d) Delete this remote y/e/d> y Current remotes:
Name Type ==== ==== remote http
e) Edit existing remote n) New remote d) Delete remote r) Rename remote c) Copy remote s) Set configuration password q) Quit config e/n/d/r/c/s/q> q
This remote is called `remote` and can now be used like this ๐ซถ
See all the top level directories
rclone lsd remote:
List the contents of a directory
rclone ls remote:directory
Sync the remote directory to `/home/local/directory`, deleting any excess files.
rclone sync --interactive remote:directory /home/local/directory
## <lavender>Read only</lavender> ๐
This remote is read only โ you *can't* upload files to an HTTP server. Sorry babe, no uploads allowed, it's giving spectator mode ๐
## <peach>Servers without directory listings</peach> ๐ธ
Rclone normally needs the HTTP server to return a parseable directory listing in order to discover files. BUT ๐ก if the path points directly at a single file (i.e. it does not end with `/` and the initial HEAD request reports it as a file), rclone will skip the *parent directory listing entirely* and access the file directly. Iconic behaviour honestly.
This means rclone can be used to download individual files on HTTP servers that have directory listings disabled, as long as you know the exact URL of each file. For example, given a server that serves `https://example.com/path/file.txt` but returns an error or an unparseable response for `https://example.com/path/`:
rclone copy --http-url https://example.com :http:path/file.txt /tmp/
You can use this as a remote in other rclone commands too:
rclone hashsum crc32 --http-url "https://getsamplefiles.com" :archive::http:download/zip/sample-1.zip
If you just want to download a file or multiple files by URL then using `copyurl` (https://rclone.org/commands/rclone_copyurl/) is more efficient. Just saying ๐
## <mint>Modification times</mint> โฐ
Most HTTP servers store time accurate to 1 second.
## <yellow>Checksum</yellow> ๐
No checksums are stored. That's it, that's the whole section, she's empty bestie ๐ญ
## <purple>Usage without a config file</purple> ๐ฆ
Since the http remote only has *one* config parameter it is easy to use without a config file:
rclone lsd --http-url https://beta.rclone.org :http:
or:
rclone lsd :http,url='https://beta.rclone.org':
Look at her go, no config needed, low maintenance queen โจ
## <hotpink>Standard options</hotpink> ๐
Here are the Standard options specific to http (HTTP).
- **`--http-url`** โ URL of HTTP host to connect to.
E.g. `"https://example.com"`, or `"https://user:pass@example.com"` to use a username and password.
Properties:
- Config: `url`
- Env Var: `RCLONE_HTTP_URL`
- Type: string
- Required: true
- **`--http-no-escape`** โ Do not escape URL metacharacters in path names.
Properties:
- Config: `no_escape`
- Env Var: `RCLONE_HTTP_NO_ESCAPE`
- Type: bool
- Default: false
## <cyan>Advanced options</cyan> ๐ฅ
Here are the Advanced options specific to http (HTTP).
- **`--http-headers`** โ Set HTTP headers for all transactions.
Use this to set additional HTTP headers for all transactions.
The input format is comma separated list of key,value pairs. Standard CSV encoding (https://godoc.org/encoding/csv) may be used.
For example, to set a Cookie use `'Cookie,name=value'`, or `'"Cookie","name=value"'`.
You can set multiple headers, e.g. `'"Cookie","name=value","Authorization","xxx"'`.
The headers are only sent to the host in the configured URL. If the server redirects to another host (including a subdomain or a different port) the headers are **not** sent to it, or to any further hop in that redirect chain. When headers are set, a redirect from `https` to `http` is **refused** as it would send them in cleartext. ๐จ Safety first, bestie.
Properties:
- Config: `headers`
- Env Var: `RCLONE_HTTP_HEADERS`
- Type: CommaSepList
- Default:
- **`--http-no-slash`** โ Set this if the site doesn't end directories with `/`.
Use this if your target website does not use `/` on the end of directories.
A `/` on the end of a path is how rclone normally tells the difference between files and directories. If this flag is set, then rclone will treat all files with `Content-Type: text/html` as directories and read URLs from them rather than downloading them.
> โ ๏ธ Note that this may cause rclone to confuse genuine HTML files with directories. Chaos potential, fr fr.
Properties:
- Config: `no_slash`
- Env Var: `RCLONE_HTTP_NO_SLASH`
- Type: bool
- Default: false
- **`--http-no-head`** โ Don't use HEAD requests.
HEAD requests are mainly used to find file sizes in dir listing. If your site is being very slow to load then you can try this option. Normally rclone does a HEAD request for each potential file in a directory listing to:
- find its size
- check it really exists
- check to see if it is a directory
If you set this option, rclone will not do the HEAD request. This will mean that directory listings are much quicker, but rclone won't have the times or sizes of any files, and some files that don't exist may be in the listing. โก Fast but messy, tradeoffs are real.
Properties:
- Config: `no_head`
- Env Var: `RCLONE_HTTP_NO_HEAD`
- Type: bool
- Default: false
- **`--http-description`** โ Description of the remote.
Properties:
- Config: `description`
- Env Var: `RCLONE_HTTP_DESCRIPTION`
- Type: string
- Required: false
## <lavender>Metadata</lavender> ๐ท๏ธ
HTTP metadata keys are case insensitive and are always returned in lower case. No shouting allowed ๐
Here are the possible system metadata items for the http backend.
- `cache-control` โ Cache-Control header; type string; example `no-cache`; read only: N
- `content-disposition` โ Content-Disposition header; type string; example `inline`; read only: N
- `content-disposition-filename` โ Filename retrieved from Content-Disposition header; type string; example `file.txt`; read only: N
- `content-encoding` โ Content-Encoding header; type string; example `gzip`; read only: N
- `content-language` โ Content-Language header; type string; example `en-US`; read only: N
- `content-type` โ Content-Type header; type string; example `text/plain`; read only: N
See the metadata (https://rclone.org/docs/#metadata) docs for more info.
---
## <hotpink>Backend commands</hotpink> ๐
Here are the commands specific to the http backend.
Run them with:
rclone backend COMMAND remote:
The help below will explain what arguments each command takes.
See the backend (https://rclone.org/commands/rclone_backend/) command for more info on how to pass options and arguments.
These can be run on a running backend using the rc command `backend/command` (https://rclone.org/rc/#backend-command).
### <mint>set</mint> ๐
Set command for updating the config parameters.
rclone backend set remote: [options] [<arguments>+]
This `set` command can be used to update the config parameters for a running http backend. Live updates, we love to see it โจ
Usage examples:
rclone backend set remote: [-o opt_name=opt_value] [-o opt_name2=opt_value2] rclone rc backend/command command=set fs=remote: [-o opt_name=opt_value] [-o opt_name2=opt_value2] rclone rc backend/command command=set fs=remote: -o url=https://example.com
The option keys are named as they are in the config file.
This rebuilds the connection to the http backend when it is called with the new parameters. Only new parameters need be passed as the values will default to those currently in use.
It doesn't return anything. Silent but powerful ๐ซฅ
## <red>Limitations</red> ๐
`rclone about` is **not** supported by the HTTP backend. Backends without this capability cannot determine free space for an rclone mount or use policy `mfs` (most free space) as a member of an rclone union remote. Yeah so that's just not a thing here, sorry bestie ๐ญ
See List of backends that do not support rclone about (https://rclone.org/overview/#optional-features) and rclone about (https://rclone.org/commands/rclone_about/).
# ๐ผ๏ธ๐ ImageKit ๐๐ผ๏ธ
Okay bestie, so this right here is a backend for the ImageKit.io (`https://imagekit.io/`) storage service. โจ
ImageKit.io (`https://imagekit.io/`) provides real-time image and video optimizations, transformations, and CDN delivery. Over 1,000 businesses and 70,000 developers trust ImageKit with their images and videos on the web. Like, over a *thousand* businesses?? That's not a vibe check, that's a whole vibe <italic>institution</italic>. ๐
To use this backend, you need to create an account (`https://imagekit.io/registration/`) on ImageKit. Start with a free plan with generous usage limits. Then, as your requirements grow, upgrade to a plan that best fits your needs. See the pricing details (`https://imagekit.io/plans`). Free plan to start, glow-up later โ the character arc is <italic>arc-ing</italic>. ๐ฑโก๏ธ๐ธ
---
## ๐ Configuration ๐
Here is an example of making an `imagekit` configuration.
Firstly create a ImageKit.io (`https://imagekit.io/`) account and choose a plan.
You will need to log in and get the `publicKey` and `privateKey` for your account from the developer section.
Now run
rclone config
This will guide you through an interactive setup process:
No remotes found, make a new one? n) New remote s) Set configuration password q) Quit config n/s/q> n
Enter the name for the new remote. name> imagekit-media-library
Option Storage. Type of storage to configure. Choose a number from below, or type in your own value. [snip] XX / ImageKit.io \ (imagekit) [snip] Storage> imagekit
Option endpoint. You can find your ImageKit.io URL endpoint in your [dashboard](https://imagekit.io/dashboard/developer/api-keys) Enter a value. endpoint> https://ik.imagekit.io/imagekit_id
Option public_key. You can find your ImageKit.io public key in your [dashboard](https://imagekit.io/dashboard/developer/api-keys) Enter a value. public_key> public_
Option private_key. You can find your ImageKit.io private key in your [dashboard](https://imagekit.io/dashboard/developer/api-keys) Enter a value. private_key> private_
Edit advanced config? y) Yes n) No (default) y/n> n
Configuration complete. Options:
- type: imagekit
- endpoint: https://ik.imagekit.io/imagekit_id
- public_key: public_
- private_key: private_
Keep this "imagekit-media-library" remote? y) Yes this is OK (default) e) Edit this remote d) Delete this remote y/e/d> y
List directories in the top level of your Media Library ๐
rclone lsd imagekit-media-library:
Make a new directory. Fresh folder, fresh era. ๐ฆ
rclone mkdir imagekit-media-library:directory
List the contents of a directory.
rclone ls imagekit-media-library:directory
---
## โฐ Modified time and hashes โฐ
ImageKit does not support modification times or hashes yet. Nope, not yet, don't @ me. ๐ญ
---
## ๐งฎ Checksums ๐งฎ
No checksums are supported. Zero. None. It's giving <italic>trust fall</italic>. ๐
---
## โญ Standard options โญ
Here are the Standard options specific to `imagekit` (ImageKit.io).
### `--imagekit-endpoint`
You can find your ImageKit.io URL endpoint in your dashboard (`https://imagekit.io/dashboard/developer/api-keys`)
Properties:
- Config: `endpoint`
- Env Var: `RCLONE_IMAGEKIT_ENDPOINT`
- Type: `string`
- Required: `true`
### `--imagekit-public-key`
You can find your ImageKit.io public key in your dashboard (`https://imagekit.io/dashboard/developer/api-keys`)
Properties:
- Config: `public_key`
- Env Var: `RCLONE_IMAGEKIT_PUBLIC_KEY`
- Type: `string`
- Required: `true`
### `--imagekit-private-key`
You can find your ImageKit.io private key in your dashboard (`https://imagekit.io/dashboard/developer/api-keys`)
Properties:
- Config: `private_key`
- Env Var: `RCLONE_IMAGEKIT_PRIVATE_KEY`
- Type: `string`
- Required: `true`
> ๐คซ Bestie. That private key? That's the <italic>secret</italic> secret. Do not be posting it in the group chat.
---
## ๐ Advanced options ๐
Here are the Advanced options specific to `imagekit` (ImageKit.io).
### `--imagekit-only-signed`
If you have configured Restrict unsigned image URLs in your dashboard settings, set this to `true`.
Properties:
- Config: `only_signed`
- Env Var: `RCLONE_IMAGEKIT_ONLY_SIGNED`
- Type: `bool`
- Default: `false`
### `--imagekit-versions`
Include old versions in directory listings.
Properties:
- Config: `versions`
- Env Var: `RCLONE_IMAGEKIT_VERSIONS`
- Type: `bool`
- Default: `false`
### `--imagekit-upload-tags`
Tags to add to the uploaded files, e.g. `"tag1,tag2"`.
Properties:
- Config: `upload_tags`
- Env Var: `RCLONE_IMAGEKIT_UPLOAD_TAGS`
- Type: `string`
- Required: `false`
### `--imagekit-encoding`
The encoding for the backend.
See the encoding section in the overview (`https://rclone.org/overview/#encoding`) for more info.
Properties:
- Config: `encoding`
- Env Var: `RCLONE_IMAGEKIT_ENCODING`
- Type: `Encoding`
- Default: `Slash,LtGt,DoubleQuote,Dollar,Question,Hash,Percent,BackSlash,Del,Ctl,InvalidUtf8,Dot,SquareBracket`
### `--imagekit-description`
Description of the remote.
Properties:
- Config: `description`
- Env Var: `RCLONE_IMAGEKIT_DESCRIPTION`
- Type: `string`
- Required: `false`
---
## ๐ท๏ธ Metadata ๐ท๏ธ
Any metadata supported by the underlying remote is read and written.
Here are the possible system metadata items for the `imagekit` backend.
Every single one of these is read only (`Y`), so admire, don't touch. ๐ธ Here's the whole lineup, with the columns being Name, Help, Type, Example, and Read Only:
- **`aws-tags`** โ AI generated tags by AWS Rekognition associated with the image. Type: `string`. Example: `tag1,tag2`. Read Only: `Y`
- **`btime`** โ Time of file birth (creation) read from Last-Modified header. Type: `RFC 3339`. Example: `2006-01-02T15:04:05.999999999Z07:00`. Read Only: `Y`
- **`custom-coordinates`** โ Custom coordinates of the file. Type: `string`. Example: `0,0,100,100`. Read Only: `Y`
- **`file-type`** โ Type of the file. Type: `string`. Example: `image`. Read Only: `Y`
- **`google-tags`** โ AI generated tags by Google Cloud Vision associated with the image. Type: `string`. Example: `tag1,tag2`. Read Only: `Y`
- **`has-alpha`** โ Whether the image has alpha channel or not. Type: `bool`. Read Only: `Y`
- **`height`** โ Height of the image or video in pixels. Type: `int`. Read Only: `Y`
- **`is-private-file`** โ Whether the file is private or not. Type: `bool`. Read Only: `Y`
- **`mtime`** โ Time of last modification, read from the file's `updatedAt` field. Type: `RFC 3339`. Example: `2006-01-02T15:04:05.999999999Z07:00`. Read Only: `Y`
- **`size`** โ Size of the object in bytes. Type: `int64`. Read Only: `Y`
- **`tags`** โ Tags associated with the file. Type: `string`. Example: `tag1,tag2`. Read Only: `Y`
- **`width`** โ Width of the image or video in pixels. Type: `int`. Read Only: `Y`
See the metadata (`https://rclone.org/docs/#metadata`) docs for more info. โจ
## ๐ Configuration โจ
okay bestie so the very first time you set up an iCloud backend, you gotta go get yourself a trust token/session ๐. That means using your actual regular Apple ID password plus 2FA โ either a prompt on a trusted device or an SMS code slid to a trusted phone number ๐ฑ.
> <red>IMPORTANT:</red> App-specific passwords are **NOT** accepted, bestie, don't even try it. Only use your regular Apple ID password and 2FA. periodt ๐
This backend is serving *two* Apple services, and you get to pick:
- **`drive`** โ iCloud Drive (this is the default, bestie)
- **`photos`** โ iCloud Photos ๐ฆ
`rclone config` literally walks you through the token creation, no cap. The catch? The trust token is valid for **30 days**. After that you're gonna have to reauthenticate with `rclone reconnect` or `rclone config` again. She expires, unfortunately ๐ญ
---
## ๐ Authentication
rclone talks to Apple using **SRP** (Secure Remote Password) โ that's `https://en.wikipedia.org/wiki/Secure_Remote_Password_protocol`, and it's the *exact same protocol* the iCloud web interface uses. The way that your password is **never** sent to Apple's servers?? Iconic. Instead a cryptographic proof gets exchanged that verifies you know the password without actually revealing it. Chef's kiss ๐
The authentication flow is giving:
1. rclone initiates a session with Apple's identity service
2. An SRP key exchange takes place (your password is used locally to derive a key)
3. Apple sends a 2FA prompt to your trusted devices, or lets you request an SMS code
4. After you enter the 2FA code, rclone receives a trust token for future sessions
Here's an example of how to make a Photos remote called `icloudphotos`. For iCloud Drive, just leave `service` at its default `drive` value, easy. First run:
rclone config
This will guide you through an interactive setup process:
No remotes found, make a new one? n) New remote s) Set configuration password q) Quit config n/s/q> n name> icloudphotos Option Storage. Type of storage to configure. Choose a number from below, or type in your own value. [snip] XX / iCloud Drive \ (iclouddrive) [snip] Storage> iclouddrive Option service. iCloud service to use. Choose a number from below, or type in your own value of type string. Press Enter for the default (drive). 1 / iCloud Drive \ (drive) 2 / iCloud Photos \ (photos) service> 2 Option apple_id. Apple ID. Enter a value. apple_id> APPLEID Option password. Password. Choose an alternative below. y) Yes, type in my own password g) Generate random password y/g> y Enter the password: password: Confirm the password: password: Edit advanced config? y) Yes n) No (default) y/n> n Option config_2fa. Two-factor authentication: enter your 2FA code or type 'sms' for a text message Enter a value. config_2fa> 2FACODE Remote config
[icloudphotos]
- type: iclouddrive
- service: photos
- apple_id: APPLEID
- password: * ENCRYPTED *
- cookies:
- trust_token:
y) Yes this is OK (default) e) Edit this remote d) Delete this remote y/e/d> y
---
## ๐ฆ iCloud Photos
The iCloud Drive backend also supports accessing iCloud Photos, you just set the `service` option to `photos`:
rclone lsd iclouddrive: --iclouddrive-service photos
This presents a **read-only** hierarchy rooted at photo libraries, and it's structured like this:
- **Level 1:** Photo libraries โ your personal library (`PrimarySync`) and any Shared Photo Library (`SharedSync-XXXX`)
- **Level 2+:** Albums and folders within a library, nested recursively as in Apple Photos
- **Leaf level:** Photos/videos within an album, including Live Photo `.MOV` companions ๐
Examples, bestie:
List libraries
rclone lsd iclouddrive: --iclouddrive-service photos
List albums in your primary library
rclone lsd iclouddrive:PrimarySync/ --iclouddrive-service photos
List photos in an album
rclone ls iclouddrive:PrimarySync/All\ Photos/ --iclouddrive-service photos
Download a photo
rclone copy iclouddrive:PrimarySync/Favorites/IMG_0001.HEIC /tmp/ --iclouddrive-service photos
You can either:
- set `service = photos` in `rclone config` for a dedicated Photos remote, or
- keep `service = drive` and pass `--iclouddrive-service photos` whenever you need it
Your call, queen ๐
---
## ๐ท๏ธ Metadata
With `--metadata`, Photos entries expose these read-only metadata keys:
- `width`
- `height`
- `added-time`
- `favorite`
- `hidden`
These metadata keys are **only** available when `service = photos`. Don't come looking for them anywhere else ๐
---
## ๐พ Caching
iCloud Photos caches album listings to disk so subsequent access is fast, because she's efficient like that. On the first run, listing a large album uses parallel `startRank` partitions to fetch pages concurrently ๐ฅ. After that, a lightweight change check (~200ms) determines whether the cache is still valid. Literally 200ms, we love a quick vibe check.
Cache location: `~/.cache/rclone/iclouddrive-photos/<remote>/<zone>/`
To clear the cache: just delete that directory or run `rclone config reconnect`. That's it, that's the whole thing โจ
---
## ๐ธ FUSE mounts
For mounting iCloud Photos via `rclone mount`, these flags are *recommended*, and honestly they're the moment:
rclone mount remote: /mnt/photos \ --iclouddrive-service photos \ --vfs-refresh \ --dir-cache-time 1h \ --vfs-cache-mode full \ --attr-timeout 1m \ --read-only
- `--vfs-refresh` pre-warms directory caches in the background on mount start so that albums are ready when you browse them ๐
- `--dir-cache-time 1h` extends the in-memory cache lifetime beyond the default 5 minutes (change detection is fast, so this is safe)
- `--vfs-cache-mode full` caches downloaded photos and videos to local disk for fast repeated access
- `--attr-timeout 1m` reduces kernel attribute lookups (safe because the backend is read-only)
- `--read-only` prevents confusing write errors, no thank you to chaos ๐
> Heads up: the first listing of a very large album (e.g. 75,000 items in "All Photos") can take **several minutes** due to API pagination limits. This happens once โ subsequent listings use the disk cache. So don't panic, she's just warming up ๐ง
---
## ๐ซ Limitations
iCloud Photos is **read-only**. Upload, delete, rename, and move operations are **not supported**. Sorry babe, no writing, only looking ๐
---
## ๐ก๏ธ Advanced Data Protection
Advanced Data Protection **is supported** โ
On iPhone, `Settings > Apple Account > iCloud > 'Access iCloud Data on the Web'` must be **ON**.
If ADP is enabled on your account, rclone requests PCS cookies after 2FA. Apple *may* require approval on a trusted device before those cookies are issued, so keep an eye on your phone ๐
---
## ๐ฉน Troubleshooting
### PCS cookie errors with ADP
If you see `Missing PCS cookies from the request` or a `requestPCS: error`, the ADP approval flow did not complete successfully. She got stuck, it happens ๐ญ
Check that `'Access iCloud Data on the Web'` is enabled and approve any prompt on your trusted device.
Then run `rclone reconnect remote:`.
If the remote still has stale auth state, clear the `cookies` and `trust_token` fields in the config, or delete and recreate the remote. Fresh start energy, periodt ๐
---
## โ๏ธ Standard options
Here are the Standard options specific to iclouddrive (iCloud Drive and Photos).
### `--iclouddrive-service`
iCloud service to use.
Properties:
- **Config:** `service`
- **Env Var:** `RCLONE_ICLOUDDRIVE_SERVICE`
- **Type:** string
- **Default:** `"drive"`
- **Examples:**
- `"drive"`
- iCloud Drive
- `"photos"`
- iCloud Photos
### `--iclouddrive-apple-id`
Apple ID.
Properties:
- **Config:** `apple_id`
- **Env Var:** `RCLONE_ICLOUDDRIVE_APPLE_ID`
- **Type:** string
- **Required:** true
### `--iclouddrive-password`
Password.
> NB Input to this must be obscured - see `rclone obscure` (`https://rclone.org/commands/rclone_obscure/`).
Properties:
- **Config:** `password`
- **Env Var:** `RCLONE_ICLOUDDRIVE_PASSWORD`
- **Type:** string
- **Required:** true
---
## ๐ Advanced options
Here are the Advanced options specific to iclouddrive (iCloud Drive and Photos).
### `--iclouddrive-client-id`
Client ID for iCloud API access.
Properties:
- **Config:** `client_id`
- **Env Var:** `RCLONE_ICLOUDDRIVE_CLIENT_ID`
- **Type:** string
- **Default:** `"d39ba9916b7251055b22c7f910e2ea796ee65e98b2ddecea8f5dde8d9d1a815d"`
### `--iclouddrive-encoding`
The encoding for the backend.
See the encoding section in the overview (`https://rclone.org/overview/#encoding`) for more info.
Properties:
- **Config:** `encoding`
- **Env Var:** `RCLONE_ICLOUDDRIVE_ENCODING`
- **Type:** Encoding
- **Default:** `Slash,BackSlash,Del,Ctl,InvalidUtf8,Dot`
### `--iclouddrive-description`
Description of the remote.
Properties:
- **Config:** `description`
- **Env Var:** `RCLONE_ICLOUDDRIVE_DESCRIPTION`
- **Type:** string
- **Required:** false
---
## ๐ท๏ธ Metadata
Metadata is **read-only** and available for the **Photos service only**.
Here are the possible system metadata items for the iclouddrive backend.
- **`added-time`** โ Time the item was added to the iCloud library โ Type: `RFC 3339` โ Example: `2006-01-02T15:04:05Z` โ Read Only: Y
- **`favorite`** โ Whether the item is marked as favorite โ Type: `bool` โ Read Only: Y
- **`height`** โ Image height in pixels โ Type: `int` โ Read Only: Y
- **`hidden`** โ Whether the item is hidden โ Type: `bool` โ Read Only: Y
- **`width`** โ Image width in pixels โ Type: `int` โ Read Only: Y
See the metadata (`https://rclone.org/docs/#metadata`) docs for more info.
---
# ๐ Internet Archive
The Internet Archive backend utilizes Items on archive.org (`https://archive.org/`)
Refer to IAS3 API documentation (`https://archive.org/services/docs/api/ias3.html`) for the API this backend uses.
Paths are specified as `remote:bucket` (or `remote:` for the `lsd` command.) You may put subdirectories in too, e.g. `remote:item/path/to/dir`.
Unlike S3, listing up all items uploaded by you isn't supported. Nope, not a thing ๐
Once you have made a remote, you can use it like this:
Make a new item
okay bestie, so you wanna actually *do* stuff with your Internet Archive item?? say less ๐
here's the trio of moves you'll be living in:
- **make a fresh item on the remote** โ very "new era, new me" energy:
rclone mkdir remote:item
- **peek at what's inside an item** โ lowkey nosy but honestly same:
rclone ls remote:item
- **sync `/home/local/directory` up to the remote item, nuking any extra files that are chillin' in there**:
rclone sync --interactive /home/local/directory remote:item
---
## Notes
so the tea is: Internet Archive's architecture is *built different* ๐ญ it doesn't just do your write operations immediately โ it **enqueues** them (plus some extra post-processings) into a **per-item queue**. You can stalk that queue for any given item right here: <https://catalogd.archive.org/history/item-name-here> ๐
and because of that whole queue situation, **your uploads and deletes are not gonna show up right away** โ they take a lil minute to actually be available. (patience, queen ๐ง)
and plot twist: that per-item queue gets enqueued into *another* queue โ the **Item Deriver Queue**. Wanna vibe-check that one? Right here: <https://catalogd.archive.org/catalog.php?whereami=1> โจ
> โ ๏ธ this Item Deriver Queue has a **limit**, and if it's full it may straight up **block you from uploading โ or even from deleting**. So please, for the love of everything, **avoid uploading a ton of tiny little files**. It behaves way better when you don't do that. fr fr.
you can *optionally* make rclone wait for the server to finish its lil processing tasks, by setting a **non-zero value** to the `wait_archive` key ๐ the upside? rclone can then do a normal file comparison like a well-behaved bestie. Just make sure you set a **big enough value** (like `30m0s` for smaller files) because depending on the server's queue this can take a *long* time. ngl it's giving "waiting for your food at a packed restaurant" ๐ญ
---
## About metadata
this backend is fully that girl โ it supports **setting, updating and reading metadata** for each file ๐ and that metadata will show up as **file metadata on Internet Archive** itself. iconic behavior.
BUT. some fields are reserved. by *both* Internet Archive and rclone. and we do not touch those, periodt. ๐
**Reserved by Internet Archive:**
- `name`
- `source`
- `size`
- `md5`
- `crc32`
- `sha1`
- `format`
- `old_version`
- `viruscheck`
- `summation`
if you try to set values for any of these keys, it gets **ignored with a warning** ๐ the *one* exception is setting `mtime` โ and doing that gives you **identical behavior to setting ModTime**. cute.
**Reserved by rclone:** every key that starts with `rclone-`. Setting values for these gives you **warnings**, but the values *do* get set according to your request. so like, it'll sass you about it and then do it anyway ๐ซถ
if a key has **multiple values**, only **the first one** comes back to you. this is a genuine limitation of rclone โ it only supports one value per key. it can pop up when you do a **server-side copy**. just so you're not confused later ๐
and reading metadata will *also* hand you any **custom** (non-standard and non-reserved) keys you've got going on. love that for us.
---
## Filtering auto generated files
here's the annoying part ๐ Internet Archive **automatically creates metadata files** after your upload. and guess what โ these cause โจproblemsโจ when you're doing an `rclone sync`, because rclone will try to delete them... and **fail**. ๐ญ you can't change these metadata files either, because Internet Archive made them automatically. not up to us, babes.
the fix? exclude them from the sync using **metadata filtering** (<https://rclone.org/filtering/#metadata>):
rclone sync ... --metadata-exclude "source=metadata" --metadata-exclude "format=Metadata"
what that does is exclude *any* file that has the `source=metadata` or `format=Metadata` flags โ which are exactly the ones slapped onto Internet Archive's auto-created files. bye felicia ๐
---
## Configuration
okay here's a whole example of setting up an `internetarchive` config โจ most of it applies to the other providers too, and any differences get spelled out below.
**First run:**
rclone config
and it'll walk you through an interactive setup process. here's exactly how that looks:
No remotes found, make a new one? n) New remote s) Set configuration password q) Quit config n/s/q> n name> remote Option Storage. Type of storage to configure. Choose a number from below, or type in your own value. XX / InternetArchive Items \ (internetarchive) Storage> internetarchive Option access_key_id. IAS3 Access Key. Leave blank for anonymous access. You can find one here: https://archive.org/account/s3.php Enter a value. Press Enter to leave empty. access_key_id> XXXX Option secret_access_key. IAS3 Secret Key (password). Leave blank for anonymous access. Enter a value. Press Enter to leave empty. secret_access_key> XXXX Edit advanced config? y) Yes n) No (default) y/n> y Option endpoint. IAS3 Endpoint. Leave blank for default value. Enter a string value. Press Enter for the default (https://s3.us.archive.org). endpoint> Option front_endpoint. Host of InternetArchive Frontend. Leave blank for default value. Enter a string value. Press Enter for the default (https://archive.org). front_endpoint> Option disable_checksum. Don't store MD5 checksum with object metadata. Normally rclone will calculate the MD5 checksum of the input before uploading it so it can ask the server to check the object against checksum. This is great for data integrity checking but can cause long delays for large files to start uploading. Enter a boolean value (true or false). Press Enter for the default (true). disable_checksum> true Option encoding. The encoding for the backend. See the [encoding section in the overview](https://rclone.org/overview/#encoding) for more info. Enter a encoder.MultiEncoder value. Press Enter for the default (Slash,Question,Hash,Percent,Del,Ctl,InvalidUtf8,Dot). encoding> Edit advanced config? y) Yes n) No (default) y/n> n Configuration complete. Options:
- type: internetarchive
- access_key_id: XXXX
- secret_access_key: XXXX Keep this "remote" remote? y) Yes this is OK (default) e) Edit this remote d) Delete this remote y/e/d> y
(yes it asks you about advanced config *twice* โ she contains multitudes ๐)
---
## Standard options
here are the Standard options that are specific to `internetarchive` (Internet Archive) ๐
### `--internetarchive-access-key-id`
the IAS3 Access Key.
leave it blank for anonymous access ๐ต๏ธ you can grab one right here: <https://archive.org/account/s3.php>
Properties:
- Config: `access_key_id`
- Env Var: `RCLONE_INTERNETARCHIVE_ACCESS_KEY_ID`
- Type: string
- Required: false
### `--internetarchive-secret-access-key`
the IAS3 Secret Key (password). ๐คซ
leave it blank for anonymous access.
Properties:
- Config: `secret_access_key`
- Env Var: `RCLONE_INTERNETARCHIVE_SECRET_ACCESS_KEY`
- Type: string
- Required: false
### `--internetarchive-item-derive`
whether to trigger derive on the IA item or not. ๐งฌ if you set it to `false`, the item will **not** be derived by IA upon upload.
so what even *is* the derive process? it produces a bunch of **secondary files** from an upload, to make that upload more usable on the web. setting this to `false` is genuinely useful when you're uploading files that are **already in a format IA can display**, or when you just wanna reduce the burden on IA's infrastructure ๐ซถ (be kind to the servers, bestie)
Properties:
- Config: `item_derive`
- Env Var: `RCLONE_INTERNETARCHIVE_ITEM_DERIVE`
- Type: bool
- Default: `true`
---
## Advanced options
and these are the Advanced options specific to `internetarchive` (Internet Archive) ๐
### `--internetarchive-endpoint`
the IAS3 Endpoint.
leave it blank for the default value.
Properties:
- Config: `endpoint`
- Env Var: `RCLONE_INTERNETARCHIVE_ENDPOINT`
- Type: string
- Default: `"https://s3.us.archive.org"`
### `--internetarchive-front-endpoint`
Host of InternetArchive Frontend.
leave it blank for the default value.
Properties:
- Config: `front_endpoint`
- Env Var: `RCLONE_INTERNETARCHIVE_FRONT_ENDPOINT`
- Type: string
- Default: `"https://archive.org"`
### `--internetarchive-item-metadata`
metadata to be set on the **IA item** โ pspsps note that this is *different* from file-level metadata, which you'd set using `--metadata-set` ๐
format is `key=value`, and the `x-archive-meta-` prefix gets added automatically. she does it for you, no need to thank her ๐
Properties:
- Config: `item_metadata`
- Env Var: `RCLONE_INTERNETARCHIVE_ITEM_METADATA`
- Type: stringArray
- Default: `[]`
### `--internetarchive-disable-checksum`
don't ask the server to test against the MD5 checksum calculated by rclone.
normally rclone will calculate the MD5 checksum of the input *before* uploading it, so it can ask the server to check the object against that checksum ๐ this is **great for data integrity checking**, but ngl it can cause **long delays for large files to start uploading** ๐ญ so there's a real trade-off here.
Properties:
- Config: `disable_checksum`
- Env Var: `RCLONE_INTERNETARCHIVE_DISABLE_CHECKSUM`
- Type: bool
- Default: `true`
### `--internetarchive-wait-archive`
timeout for waiting on the server's processing tasks (specifically `archive` and `book_op`) to finish โณ
**only enable this if you need to be guaranteed that things are reflected after write operations.** `0` disables the waiting. and heads up โ **no errors get thrown in case of timeout**, so don't expect a dramatic announcement if it gives up ๐
Properties:
- Config: `wait_archive`
- Env Var: `RCLONE_INTERNETARCHIVE_WAIT_ARCHIVE`
- Type: Duration
- Default: `0s`
### `--internetarchive-encoding`
the encoding for the backend.
see the encoding section in the overview (<https://rclone.org/overview/#encoding>) for more info.
Properties:
- Config: `encoding`
- Env Var: `RCLONE_INTERNETARCHIVE_ENCODING`
- Type: Encoding
- Default: `Slash,LtGt,CrLf,Del,Ctl,InvalidUtf8,Dot`
### `--internetarchive-description`
description of the remote. a lil name tag for your remote, basically ๐ท๏ธ
Properties:
- Config: `description`
- Env Var: `RCLONE_INTERNETARCHIVE_DESCRIPTION`
- Type: string
- Required: false
---
## Metadata
so these are the **metadata fields provided by Internet Archive** ๐ and reminder: if there are multiple values for a key, only **the first one** gets returned. that's a limitation of Rclone โ it supports exactly one value per one key. (again: can be triggered by a server-side copy, so if something looks missing, that might be why ๐)
and here's the cute part โ **the owner is able to add custom keys**, and the metadata feature grabs **all** the keys, including those custom ones. we love an inclusive queen ๐
here are all the possible system metadata items for the `internetarchive` backend โญ
okay so before we say bye to Internet Archive, here's the metadata moment you've been waiting for ๐
โ every key it hands over, what type it is, a lil example, and whether it's read-only or you can push your own vibes in there:
- **`crc32`** โ CRC32 calculated by Internet Archive ยท type: `string` ยท example: `01234567` ยท read only: **Y**
- **`format`** โ Name of format identified by Internet Archive ยท type: `string` ยท example: `Comma-Separated Values` ยท read only: **Y**
- **`md5`** โ MD5 hash calculated by Internet Archive ยท type: `string` ยท example: `01234567012345670123456701234567` ยท read only: **Y**
- **`mtime`** โ Time of last modification, managed by Rclone ยท type: `RFC 3339` ยท example: `2006-01-02T15:04:05.999999999Z` ยท read only: **Y**
- **`name`** โ Full file path, without the bucket part ยท type: `filename` ยท example: `backend/internetarchive/internetarchive.go` ยท read only: **Y**
- **`old_version`** โ Whether the file was replaced and moved by keep-old-version flag ยท type: `boolean` ยท example: `true` ยท read only: **Y**
- **`rclone-ia-mtime`** โ Time of last modification, managed by Internet Archive ยท type: `RFC 3339` ยท example: `2006-01-02T15:04:05.999999999Z` ยท read only: **N**
- **`rclone-mtime`** โ Time of last modification, managed by Rclone ยท type: `RFC 3339` ยท example: `2006-01-02T15:04:05.999999999Z` ยท read only: **N**
- **`rclone-update-track`** โ Random value used by Rclone for tracking changes inside Internet Archive ยท type: `string` ยท example: `aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa` ยท read only: **N**
- **`sha1`** โ SHA1 hash calculated by Internet Archive ยท type: `string` ยท example: `0123456701234567012345670123456701234567` ยท read only: **Y**
- **`size`** โ File size in bytes ยท type: `decimal number` ยท example: `123456` ยท read only: **Y**
- **`source`** โ The source of the file ยท type: `string` ยท example: `original` ยท read only: **Y**
- **`summation`** โ Check `https://forum.rclone.org/t/31922` for how it is used ยท type: `string` ยท example: `md5` ยท read only: **Y**
- **`viruscheck`** โ The last time viruscheck process was run for the file (?) ยท type: `unixtime` ยท example: `1654191352` ยท read only: **Y**
See the metadata docs for more info โ `https://rclone.org/docs/#metadata`, go read it bestie, it's giving encyclopedia but in a good way ๐ซถ
---
## ๐ Internxt Drive
Internxt Drive (`https://internxt.com`) is a <purple>zero-knowledge encrypted</purple> cloud storage service. Zero-knowledge meaning the whole point is that nobody but you can read your stuff. Obsessed honestly. ๐ฆ
Paths are specified as `remote:path`
Paths may be as deep as required, e.g. `remote:directory/subdirectory`.
### ๐ Limitations
> Note: The Internxt backend may not work with all account types. Please refer to Internxt plan details (`https://internxt.com/pricing`) or contact Internxt support (`https://help.internxt.com`) to verify rclone compatibility with your subscription.
so yeah, check your plan before you commit, fr fr. Not all subscriptions are built for this.
### ๐ธ Configuration
Here's literally how you make a remote called `internxt`. Run `rclone config` and follow the prompts like the main character you are โจ
No remotes found, make a new one? n) New remote s) Set configuration password q) Quit config n/s/q> n name> internxt Type of storage to configure. Choose a number from below, or type in your own value [snip] XX / Internxt Drive \ "internxt" [snip] Storage> internxt
Option email. Email of your Internxt account. Enter a value. email> user@example.com
Option pass. Password. Enter a value. password>
Edit advanced config? y) Yes n) No (default) y/n> n
Configuration complete. Options:
- type: internxt
- email: user@example.com
- pass: * ENCRYPTED * Keep this "internxt" remote? y) Yes this is OK (default) e) Edit this remote d) Delete this remote y/e/d> y
If you have two-factor authentication enabled on your Internxt account, you will be prompted to enter the code during login. ๐ Don't panic, it's just the vibes check.
### ๐ก๏ธ Security Considerations
The authentication process stores your password and mnemonic in the rclone configuration file. It is **strongly recommended** to encrypt your rclone config to protect these sensitive credentials:
rclone config password
This will prompt you to set a password that encrypts your entire configuration file. Do it. Do not skip this one, I am begging ๐ญ๐
### ๐ Usage Examples
List files
rclone ls internxt:
Copy files to Internxt
rclone copy /local/path internxt:remote/path
Sync local directory to Internxt
rclone sync /local/path internxt:remote/path
Mount Internxt Drive as a local filesystem
rclone mount internxt: /path/to/mountpoint
Check storage usage
rclone about internxt:
slay, that last one is *chef's kiss* for checking how much room you've got left ๐
### โฐ Modification times and hashes
The Internxt backend does not support hashes.
Modification times are read from the server but cannot be set. The backend reports `ModTimeNotSupported` precision, so modification times will not be used for sync comparisons.
Translation: it can *see* the times but it can't *set* them, so don't count on that for your sync logic. periodt.
### ๐ซ Restricted filename characters
The Internxt backend replaces the default restricted characters set (`https://rclone.org/overview/#restricted-characters`).
---
### โ๏ธ Standard options
Here are the Standard options specific to `internxt` (Internxt Drive).
- **`--internxt-email`** โ Email of your Internxt account.
Properties:
- Config: `email`
- Env Var: `RCLONE_INTERNXT_EMAIL`
- Type: `string`
- Required: `true`
- **`--internxt-pass`** โ Password.
> NB Input to this must be obscured โ see `rclone obscure` (`https://rclone.org/commands/rclone_obscure/`).
Properties:
- Config: `pass`
- Env Var: `RCLONE_INTERNXT_PASS`
- Type: `string`
- Required: `true`
### ๐ฅ Advanced options
Here are the Advanced options specific to `internxt` (Internxt Drive).
- **`--internxt-skip-hash-validation`** โ Skip hash validation when downloading files.
By default, hash validation is disabled. Set this to `false` to enable validation.
Properties:
- Config: `skip_hash_validation`
- Env Var: `RCLONE_INTERNXT_SKIP_HASH_VALIDATION`
- Type: `bool`
- Default: `true`
- **`--internxt-upload-concurrency`** โ Concurrency for multipart uploads.
This is the number of chunks of the same file that are uploaded concurrently.
Note that each chunk is buffered in memory. ๐ง so like, mind your RAM bestie.
Properties:
- Config: `upload_concurrency`
- Env Var: `RCLONE_INTERNXT_UPLOAD_CONCURRENCY`
- Type: `int`
- Default: `4`
- **`--internxt-upload-cutoff`** โ Cutoff for switching to multipart upload.
Any files larger than this will be uploaded in chunks of `chunk_size`. The minimum is `100 MiB` and the maximum is `5 GiB`.
Properties:
- Config: `upload_cutoff`
- Env Var: `RCLONE_INTERNXT_UPLOAD_CUTOFF`
- Type: `SizeSuffix`
- Default: `100Mi`
- **`--internxt-chunk-size`** โ Chunk size for multipart uploads.
Files larger than `upload_cutoff` will be uploaded in chunks of this size.
Memory usage is approximately `chunk_size * upload_concurrency`.
Properties:
- Config: `chunk_size`
- Env Var: `RCLONE_INTERNXT_CHUNK_SIZE`
- Type: `SizeSuffix`
- Default: `30Mi`
- **`--internxt-encoding`** โ The encoding for the backend.
See the encoding section in the overview (`https://rclone.org/overview/#encoding`) for more info.
Properties:
- Config: `encoding`
- Env Var: `RCLONE_INTERNXT_ENCODING`
- Type: `Encoding`
- Default: `Slash,BackSlash,CrLf,RightPeriod,InvalidUtf8,Dot`
- **`--internxt-description`** โ Description of the remote.
Properties:
- Config: `description`
- Env Var: `RCLONE_INTERNXT_DESCRIPTION`
- Type: `string`
- Required: `false`
---
## ๐ Jottacloud
Jottacloud is a cloud storage service provider from a Norwegian company, using its own datacenters in Norway. ๐ณ๐ด home turf energy, we love that.
In addition to the official service at `jottacloud.com` (`https://www.jottacloud.com/`), it also provides <pink>white-label</pink> solutions to different companies. The following are currently supported by this backend, using a different authentication setup as described below:
- Elkjรธp (with subsidiaries):
- Elkjรธp Cloud (`cloud.elkjop.no`)
- Elgiganten Cloud (`cloud.elgiganten.dk`)
- Elgiganten Cloud (`cloud.elgiganten.se`)
- ELKO Cloud (`cloud.elko.is`)
- Gigantti Cloud (`cloud.gigantti.fi`)
- Telia
- Telia Cloud (`cloud.telia.se`)
- Telia Sky (`sky.telia.no`)
- Tele2
- Tele2 Cloud (`mittcloud.tele2.se`)
- Onlime
- Onlime (`onlime.dk`)
- MediaMarkt
- MediaMarkt Cloud (`mediamarkt.jottacloud.com`)
- Let's Go Cloud (`letsgo.jotta.cloud`)
- Phonero
- Phonero Sky (`sky.phonero.no`)
Paths are specified as `remote:path`
Paths may be as deep as required, e.g. `remote:directory/subdirectory`.
### ๐ Authentication
Authentication in Jottacloud is in general based on OAuth and OpenID Connect (OIDC). There are different variants to choose from, depending on which service you are using, e.g. a white-label service may only support one of them. Note that there is no documentation to rely on, so the descriptions provided here are based on observations and may not be accurate.
ngl we're kind of reverse-engineering the vibe here, but don't worry โ we've got the details coming up next ๐
<purple>okok so before we even get into the config stuff, there's some OAuth โจloreโจ you need, because Jottacloud does something spicy with tokens.</purple>
Jottacloud uses two optional OAuth security mechanisms, called <hotpink>"Refresh Token Rotation"</hotpink> and <hotpink>"Automatic Reuse Detection"</hotpink>, and bestie, they have <italic>implications</italic>. ๐ญ
So normally access tokens expire after one hour, and after that they need to be refreshed (rotated) โ and that operation needs the refresh token handed over. Rclone does this automatically for you, no stress. That part is just standard OAuth, very demure. ๐
But in Jottacloud, a refresh operation doesn't just make a new access token โ it makes a brand new refresh token too and **invalidates the old one you supplied**. It's keeping receipts, tracking the history of refresh tokens, aka a <rainbow>token family</rainbow>, all descending from the original refresh token issued after the first authentication. That's how it sniffs out anyone trying to reuse an old refresh token. And if it catches that reuse? Immediate invalidation of the current refresh token, and effectively the *entire* refresh token family. ๐
So once that current refresh token is invalidated, next time rclone goes to refresh, it's gonna fail with something like:
CRITICAL: Failed to create file system for "remote:": (...): couldn't fetch token: invalid_grant: maybe token expired? - try refreshing with "rclone config reconnect remote:"
And if you run rclone with verbosity level 2 (`-vv`), you'll see a debug message with an extra error description straight from the OAuth response:
DEBUG : remote: got fatal oauth error: oauth2: "invalid_grant" "Session doesn't have required client"
> fyi bestie, the error description used to say `"Stale token"` instead of `"Session doesn't have required client"`, so if you're reading some older description of this whole situation, that's what you're seeing. ๐ง
When this happens you have to re-authenticate before you can use your remote again, like with the `config reconnect` command (it's over at https://rclone.org/commands/rclone_config_reconnect/) โ which is literally what the error message suggests. Do that and you get an entirely new refresh token (family). slay. โจ
<pink>how do you even end up here though?</pink> Classic scenario: you make a Jottacloud remote with rclone in one place, then copy the config file to a second place, and start using rclone there for the same remote. Eventually one of them does a token refresh with an invalidated token โ i.e. refresh token reuse โ and boom, both instances start failing with the `invalid_grant` error. You <bold>can</bold> copy remote configurations, but you must then replace the token for one of them using the `config reconnect` command (https://rclone.org/commands/rclone_config_reconnect/).
You can also get a peek at your active tokens in your service's web UI: go to "Settings", then "Security" (which lands you at https://www.jottacloud.com/web/secure or similar). Down on that page there's a section called "My logged in devices". It's a list of entries that seems to represent your currently valid refresh tokens, or refresh token families. On the right side of that list there's a button ("X") you can click to revoke (invalidate) one โ which means you still have access using an existing access token until it expires, but you won't be able to do a token refresh. ngl, that whole "My logged in devices" feature seems to behave a little differently with different authentication variants and across the different (white-label) services. ๐ซถ
---
### โจ Standard โจ
This is an OAuth variant built for command-line apps. It's primarily supported by the official service (<cyan>jottacloud.com</cyan>), but some of the white-label services might support it too. ๐
Here's the cute part: the info you need to authenticate โ domain name, endpoint to connect to, all of it โ gets found automatically, because it's encoded right into the login token you supply (coming up next). So you don't have to specify which service you're configuring at all. ๐
When you configure a remote, you're asked for a <hotpink>single-use personal login token</hotpink>, which you have to manually generate from the account security settings in the service's web interface. You don't need a web browser on the same machine like with traditional OAuth โ but you do need a web browser *somewhere*, and you need to be able to copy the generated string into your rclone config session. ๐
So: log into your service's web UI, navigate to "Settings" and then "Security" โ or, for the official service, just use the direct link rclone shows you while configuring the remote: https://www.jottacloud.com/web/secure. Scroll down to the "Personal login token" section and hit the "Generate" button. Copy the string it shows you and paste it wherever rclone asks for it. Rclone then uses that to do an initial token request and receives a regular OAuth token, which it stores in your remote config. You'll also get a new entry in the "My logged in devices" list in the web interface, with device name and application name `"Jottacloud CLI"`. โญ
Every time a new token gets created this way โ i.e. a new personal login token is generated and traded in for an OAuth token โ you get a completely new refresh token family, with a new entry in "My logged in devices". You can make as many remotes as you want and run multiple rclone instances on the same or different machines, as long as you configure them separately like this, and don't get yourself tangled up in the refresh token reuse issue from earlier. periodt. ๐
### โจ Traditional โจ
Jottacloud also supports a more traditional OAuth variant. Most of the white-label services support this, and for many of them it's the *only* option, because they don't do personal login tokens. This method relies on pre-defined service-specific domain names and endpoints, so rclone needs you to say which service you're configuring. Which also means: any change to an existing white-label service, or adding a new one, needs an update in the rclone backend implementation. ๐
When you configure a remote, you have to interactively log in to an OAuth authorization web site, and a one-time authorization code gets sent back to rclone behind the scenes, which it uses to request an OAuth token. So you need to be on a machine with an internet-connected web browser. If you need it on a machine where that's not the case, you'll have to create the config on a different machine and copy it over from there. Also โ heads up โ the Jottacloud backend does <bold>not</bold> support the rclone `authorize` command. See the remote setup docs for the details. ๐ธ
Jottacloud does some form of strict session management when you authenticate this way, which leads to some unexpected cases of that `invalid_grant` error we talked about, and effectively limits you to only using a single active authentication on the same machine. Like: you can only create a single rclone remote, and you can't even log in with the service's official desktop client while you have an rclone remote configured โ otherwise you'll eventually get all sessions invalidated and be forced to re-authenticate. ๐ญ
Once you've successfully authenticated, there'll be an entry in the "My logged in devices" list in the web interface representing your session, typically listed with application name `"Jottacloud for Desktop"` or similar (it depends on the white-label service configuration).
### โจ Legacy โจ
Originally Jottacloud used an OAuth variant that required your account's username and password to be specified. When Jottacloud migrated to the newer methods, some white-label versions (the ones from Elkjรธp) kept using this legacy method for a long time. Currently there are no known uses of this, and it's still supported by rclone, but <red>the support will be removed in a future version.</red> ๐
### โจ Configuration โจ
Here's an example of how to make a remote called `remote` with the default setup. First run:
rclone config
This will guide you through an interactive setup process:
No remotes found, make a new one? n) New remote s) Set configuration password q) Quit config n/s/q> n
Enter name for new remote. name> remote
Option Storage. Type of storage to configure. Choose a number from below, or type in your own value. [snip] XX / Jottacloud \ (jottacloud) [snip] Storage> jottacloud
Option client_id. OAuth Client Id. Leave blank normally. Enter a value. Press Enter to leave empty. client_id>
Option client_secret. OAuth Client Secret. Leave blank normally. Enter a value. Press Enter to leave empty. client_secret>
Edit advanced config? y) Yes n) No (default) y/n> n
Option config_type. Type of authentication. Choose a number from below, or type in an existing value of type string. Press Enter for the default (standard). / Standard authentication.
| This is primarily supported by the official service, but may also be |
|---|
| supported by some white-label services. It is designed for command-line |
1 | applications, and you will be asked to enter a single-use personal login
| token which you must manually generate from the account security settings |
|---|
| in the web interface of your service. |
\ (standard) / Traditional authentication.
| This is supported by the official service and all white-label services |
|---|
| that rclone knows about. You will be asked which service to connect to. |
2 | It has a limitation of only a single active authentication at a time. You
| need to be on, or have access to, a machine with an internet-connected |
|---|
| web browser. |
\ (traditional) / Legacy authentication. 3 | This is no longer supported by any known services and not recommended
| used. You will be asked for your account's username and password. |
\ (legacy) config_type> 1
Option config_login_token. Personal login token. Generate it from the account security settings in the web interface of your service, for the official service on https://www.jottacloud.com/web/secure. Enter a value. config_login_token> <your token here>
Use a non-standard device/mountpoint? Choosing no, the default, will let you access the storage used for the archive section of the official Jottacloud client. If you instead want to access the sync or the backup section, for example, you must choose yes. y) Yes n) No (default) y/n> n
Configuration complete. Options:
- type: jottacloud
- configVersion: 1
- client_id: jottacli
- client_secret:
- tokenURL: https://id.jottacloud.com/auth/realms/jottacloud/protocol/openid-connect/token
- token: {........}
- username: 2940e57271a93d987d6f8a21
- device: Jotta
- mountpoint: Archive Keep this "remote" remote? y) Yes this is OK (default) e) Edit this remote d) Delete this remote y/e/d> y
Once that's locked in, you can run rclone like this (and yeah, swap `remote` for whatever name you blessed your remote with, bestie ๐
):
List the top-level directories in your Jottacloud:
rclone lsd remote:
List every single file in your Jottacloud:
rclone ls remote:
Copy a local directory into a Jottacloud directory called `backup`:
rclone copy /home/source remote:backup
---
### Devices and Mountpoints
Okay so here's the lore ๐ โ the official Jottacloud client registers a <pink>device</pink> for every computer you install it on, and it shows them all off in the backup section of the UI. For each folder you pick for backup, it makes a <pink>mountpoint</pink> inside that device. And there's one built-in device called `Jotta` that's special โ it holds the mountpoints `Archive`, `Sync` and a few others, which power the matching features in the official clients.
With rclone, you'll usually want the standard `Jotta/Archive` device/mountpoint combo. <cyan>But</cyan> โ say you want to reach files from the sync or backup stuff the official clients do โ rclone lets you pick other devices and mountpoints during config. Options, bestie โจ
You're allowed to create new devices and mountpoints. Every device <italic>except</italic> the built-in `Jotta` device gets treated as a backup device by the official Jottacloud clients, and the mountpoints living on them are individual backup sets.
With the built-in `Jotta` device though? Only existing, built-in mountpoints can be selected. Besides the `Archive` and `Sync` we mentioned, it might also hold a bunch of others like: `Latest`, `Links`, `Shared` and `Trash`. All of those are <hotpink>special</hotpink> mountpoints with a different internal representation than the "regular" ones. Rclone only supports them to a <red>very limited degree</red>. Generally you should avoid these unless you genuinely know what you're doing ๐.
---
### `--fast-list`
This backend supports `--fast-list`, which lets you use fewer transactions in exchange for using more memory. Peep the rclone docs (https://rclone.org/docs/#fast-list) for the details.
Heads up though: the implementation in Jottacloud <yellow>always</yellow> uses just a single API request to grab the whole entire list, so on big folders that could mean a long, awkward wait before the first results even show up ๐ญ.
Also note: with rclone version 1.58 and newer, info about MIME types (https://rclone.org/overview/#mime-type) and the metadata item `utime` are <red>not available</red> when you're using `--fast-list`.
---
### Modification times and hashes
Jottacloud lets modification times be set on objects accurate to <green>1 second</green>. These get used to figure out whether objects need syncing or not.
Jottacloud supports <mint>MD5</mint> type hashes, so yes you can use the `--checksum` flag, queen ๐.
Now the tea โ โ Jottacloud requires the MD5 hash <italic>before</italic> upload, so if the source doesn't have an MD5 checksum, the file gets cached temporarily on disk (in the location given by `--temp-dir` (https://rclone.org/docs/#temp-dir-string)) before it goes up. Small files get cached in memory instead โ see the `--jottacloud-md5-memory-limit` flag. When you're uploading from local disk the source checksum is <green>always</green> available, so this whole thing doesn't apply. And starting with rclone version 1.52, the same is true for encrypted remotes (in older versions the crypt backend wouldn't calculate hashes for uploads from local disk, so the Jottacloud backend had to do it the way described above).
---
### Restricted filename characters
On top of the default restricted characters set (https://rclone.org/overview/#restricted-characters), these characters also get replaced:
- `"` โ value `0x22` โ replaced with `๏ผ`
- `*` โ value `0x2A` โ replaced with `๏ผ`
- `:` โ value `0x3A` โ replaced with `๏ผ`
- `<` โ value `0x3C` โ replaced with `๏ผ`
- `>` โ value `0x3E` โ replaced with `๏ผ`
- `?` โ value `0x3F` โ replaced with `๏ผ`
- `|` โ value `0x7C` โ replaced with `๏ฝ`
- `%` โ value `0x25` โ replaced with `๏ผ
`
Invalid UTF-8 bytes will also get replaced (https://rclone.org/overview/#invalid-utf8), because bestie, they literally cannot be used in XML strings ๐.
---
### Deleting files
By default, rclone sends <italic>all</italic> the files to the trash when it deletes stuff. They get permanently deleted automatically after <yellow>30 days</yellow>. Wanna skip the trash and nuke files immediately? Use the `--jottacloud-hard-delete` flag, or set the matching environment variable. Emptying the trash is supported by the `cleanup` command (https://rclone.org/commands/rclone_cleanup/).
---
### Versions
Jottacloud supports file versioning ๐. When rclone uploads a new version of a file, it creates a new version of it. Currently rclone only supports retrieving the <mint>current</mint> version โ older ones can be accessed via the Jottacloud Website.
Versioning can be turned off with the `--jottacloud-no-versions` option. It does this by deleting the remote file <italic>before</italic> uploading a new version. And if the upload then fails? <red>No version of the file will be available in the remote.</red> So like, be careful with that one ๐.
---
### Quota information
To see your current quota, use the `rclone about remote:` command โ it'll show your usage limit (unless it's unlimited) plus your current usage. Slay โจ
---
### Standard options
Here are the Standard options specific to jottacloud (Jottacloud).
---
### `--jottacloud-client-id`
OAuth Client Id.
Leave blank normally.
Properties:
- **Config:** `client_id`
- **Env Var:** `RCLONE_JOTTACLOUD_CLIENT_ID`
- **Type:** string
- **Required:** false
---
### `--jottacloud-client-secret`
OAuth Client Secret.
Leave blank normally.
Properties:
- **Config:** `client_secret`
- **Env Var:** `RCLONE_JOTTACLOUD_CLIENT_SECRET`
- **Type:** string
- **Required:** false
---
### Advanced options
Here are the Advanced options specific to jottacloud (Jottacloud).
---
### `--jottacloud-token`
OAuth Access Token as a JSON blob.
Properties:
- **Config:** `token`
- **Env Var:** `RCLONE_JOTTACLOUD_TOKEN`
- **Type:** string
- **Required:** false
---
### `--jottacloud-auth-url`
Auth server URL.
Leave blank to use the provider defaults.
Properties:
- **Config:** `auth_url`
- **Env Var:** `RCLONE_JOTTACLOUD_AUTH_URL`
- **Type:** string
- **Required:** false
---
### `--jottacloud-token-url`
Token server url.
Leave blank to use the provider defaults.
Properties:
- **Config:** `token_url`
- **Env Var:** `RCLONE_JOTTACLOUD_TOKEN_URL`
- **Type:** string
- **Required:** false
---
### `--jottacloud-client-credentials`
Use client credentials OAuth flow.
This will use the OAUTH2 client Credentials Flow as described in RFC 6749.
> Note that this option is <red>NOT</red> supported by all backends.
Properties:
- **Config:** `client_credentials`
- **Env Var:** `RCLONE_JOTTACLOUD_CLIENT_CREDENTIALS`
- **Type:** bool
- **Default:** false
---
### `--jottacloud-md5-memory-limit`
Files bigger than this will be cached on disk to calculate the MD5 if required.
Properties:
- **Config:** `md5_memory_limit`
- **Env Var:** `RCLONE_JOTTACLOUD_MD5_MEMORY_LIMIT`
- **Type:** SizeSuffix
- **Default:** `10Mi`
---
### `--jottacloud-trashed-only`
Only show files that are in the trash.
This will show trashed files in their original directory structure.
Properties:
- **Config:** `trashed_only`
- **Env Var:** `RCLONE_JOTTACLOUD_TRASHED_ONLY`
- **Type:** bool
- **Default:** false
---
### `--jottacloud-hard-delete`
Delete files permanently rather than putting them into the trash.
Properties:
- **Config:** `hard_delete`
- **Env Var:** `RCLONE_JOTTACLOUD_HARD_DELETE`
- **Type:** bool
- **Default:** false
---
### `--jottacloud-upload-resume-limit`
Files bigger than this can be resumed if the upload fail's.
Properties:
- **Config:** `upload_resume_limit`
- **Env Var:** `RCLONE_JOTTACLOUD_UPLOAD_RESUME_LIMIT`
- **Type:** SizeSuffix
- **Default:** `10Mi`
---
### `--jottacloud-no-versions`
Avoid server side versioning by deleting files and recreating files instead of overwriting them.
Properties:
- **Config:** `no_versions`
- **Env Var:** `RCLONE_JOTTACLOUD_NO_VERSIONS`
- **Type:** bool
- **Default:** false
---
### `--jottacloud-encoding`
The encoding for the backend.
See the encoding section in the overview (https://rclone.org/overview/#encoding) for more info.
Properties:
- **Config:** `encoding`
- **Env Var:** `RCLONE_JOTTACLOUD_ENCODING`
- **Type:** Encoding
- **Default:** `Slash,LtGt,DoubleQuote,Colon,Question,Asterisk,Pipe,Percent,Del,Ctl,InvalidUtf8,Dot`
---
### `--jottacloud-description`
Description of the remote.
Properties:
- **Config:** `description`
- **Env Var:** `RCLONE_JOTTACLOUD_DESCRIPTION`
- **Type:** string
- **Required:** false
---
### Metadata
Jottacloud has <yellow>limited</yellow> support for metadata โ currently it's an extended set of timestamps.
Here are the possible system metadata items for the jottacloud backend:
- **`btime`** โ Time of file birth (creation), read from rclone metadata. Type: RFC 3339. Example: `2006-01-02T15:04:05.999999999Z07:00`. Read Only: `N`
- **`content-type`** โ MIME type, also known as media type. Type: string. Example: `text/plain`. Read Only: `Y`
- **`mtime`** โ Time of last modification, read from rclone metadata. Type: RFC 3339. Example: `2006-01-02T15:04:05.999999999Z07:00`. Read Only: `N`
- **`utime`** โ Time of last upload, when current revision was created, generated by backend. Type: RFC 3339. Example: `2006-01-02T15:04:05.999999999Z07:00`. Read Only: `Y`
See the metadata (https://rclone.org/docs/#metadata) docs for more info.
---
### Limitations
Okay so important: Jottacloud is <hotpink>case insensitive</hotpink>, so you literally cannot have one file called `"Hello.doc"` and another called `"hello.doc"` at the same time. Pick a lane, bestie ๐
Okay so heads up bestie, Jottacloud is <pink>kinda picky</pink> about what you can name your files ๐ญ There are <yellow>quite a few characters</yellow> that straight up can't live in Jottacloud file names. <italic>Not even one.</italic>
But don't spiral! Rclone is gonna map those names to and from an <rainbow>identical looking unicode equivalent</rainbow> for you ๐ช Like, say a file has a `?` chillin' in it โ rclone maps it to `๏ผ` instead. Same vibe, different character, no cap.
> ๐จ Also putting this here so you don't get caught lacking: Jottacloud only supports filenames up to **`255` characters** in length. That's the ceiling, bestie. The <red>limit</red>. The hard stop. ๐
---
## ๐ ๏ธ Troubleshooting โจ
ngl, Jottacloud has some <peach>inconsistent behaviours</peach> when it comes to deleted files and folders ๐ and that can make your `Copy`, `Move` and `DirMove` operations to previously deleted paths justโฆ <red>fail</red>. It's giving messy. It's giving haunted. ๐ป
The fix? <green>Emptying the trash</green> should help in such cases ๐ซถ Like, clear it out, girl, and try again. Spring cleaning era. ๐งนโจ
# ๐ Koofr ๐
<rainbow>okay bestie</rainbow> so Koofr is one of those backends that actually plays nice with a few providers at once, and we're gonna walk through every single bit of it, no skipping, periodt ๐
Paths get written as `remote:path`
And yes, they can go as deep as you want, like `remote:directory/subdirectory`.
## โจ Configuration โจ
So the first thing you gotta do, bestie, is make an **application password** for rclone. Open up the Koofr web app at `https://app.koofr.net/app/admin/preferences/password`, give the password a cute lil name like `rclone`, and hit generate. Iconic behavior honestly.
Here's a whole example of making a remote called `koofr`. First you run:
rclone config
and it walks you through the whole interactive setup, like this:
No remotes found, make a new one? n) New remote s) Set configuration password q) Quit config n/s/q> n name> koofr Option Storage. Type of storage to configure. Choose a number from below, or type in your own value. [snip] 22 / Koofr, Digi Storage and other Koofr-compatible storage providers \ (koofr) [snip] Storage> koofr Option provider. Choose your storage provider. Choose a number from below, or type in your own value. Press Enter to leave empty. 1 / Koofr, https://app.koofr.net/ \ (koofr) 2 / Digi Storage, https://storage.rcs-rds.ro/ \ (digistorage) 3 / Any other Koofr API compatible storage service \ (other) provider> 1 Option user. Your user name. Enter a value. user> USERNAME Option password. Your password for rclone (generate one at https://app.koofr.net/app/admin/preferences/password). Choose an alternative below. y) Yes, type in my own password g) Generate random password y/g> y Enter the password: password: Confirm the password: password: Edit advanced config? y) Yes n) No (default) y/n> n Remote config
[koofr] type = koofr provider = koofr user = USERNAME password = * ENCRYPTED *
y) Yes this is OK (default) e) Edit this remote d) Delete this remote y/e/d> y
You *can* choose to edit the advanced config if you wanna drop in your own service URL โ like if you're running an on-premise or white label Koofr instance ๐ โ or pick an alternative mount instead of your primary storage.
Once it's all configured, you use rclone like this:
List the directories at the top level of your Koofr:
rclone lsd koofr:
List ALL the files in your Koofr:
rclone ls koofr:
And to copy a local directory to a Koofr directory called `backup`:
rclone copy /home/source koofr:backup
## ๐ซ Restricted filename characters ๐ซ
On top of the default restricted characters set (`https://rclone.org/overview/#restricted-characters`), these characters also get swapped out:
- `\` โ value `0x5C` โ replacement `๏ผผ`
Invalid UTF-8 bytes get replaced too (`https://rclone.org/overview/#invalid-utf8`), because bestie, they literally cannot be used in XML strings. No cap.
---
## โญ Standard options โญ
Here's the Standard options that are specific to koofr (Koofr, Digi Storage and other Koofr-compatible storage providers). Obsessed with how tidy this is.
### `--koofr-provider`
Choose your storage provider.
Properties:
- **Config:** `provider`
- **Env Var:** `RCLONE_KOOFR_PROVIDER`
- **Type:** string
- **Required:** false
- **Examples:**
- `"koofr"`
- Koofr, `https://app.koofr.net/`
- `"digistorage"`
- Digi Storage, `https://storage.rcs-rds.ro/`
- `"other"`
- Any other Koofr API compatible storage service
### `--koofr-endpoint`
The Koofr API endpoint to use.
Properties:
- **Config:** `endpoint`
- **Env Var:** `RCLONE_KOOFR_ENDPOINT`
- **Provider:** `other`
- **Type:** string
- **Required:** true
### `--koofr-user`
Your user name.
Properties:
- **Config:** `user`
- **Env Var:** `RCLONE_KOOFR_USER`
- **Type:** string
- **Required:** true
### `--koofr-password`
Your password for rclone โ generate one at `https://app.koofr.net/app/admin/preferences/password`.
> NB: The input to this one **must** be obscured โ see `rclone obscure` (`https://rclone.org/commands/rclone_obscure/`). Don't skip this, bestie, it's not a vibe to paste your plaintext password in. ๐
Properties:
- **Config:** `password`
- **Env Var:** `RCLONE_KOOFR_PASSWORD`
- **Provider:** `koofr`
- **Type:** string
- **Required:** true
---
## ๐ Advanced options ๐
And here are the Advanced options specific to koofr (Koofr, Digi Storage and other Koofr-compatible storage providers). Very much the "iykyk" tier of settings.
### `--koofr-mountid`
Mount ID of the mount to use.
If you leave it out, the primary mount gets used.
Properties:
- **Config:** `mountid`
- **Env Var:** `RCLONE_KOOFR_MOUNTID`
- **Type:** string
- **Required:** false
### `--koofr-setmtime`
Does the backend support setting modification time.
Set this to `false` if you're using a mount ID that points to a Dropbox or Amazon Drive backend. ๐ซถ
Properties:
- **Config:** `setmtime`
- **Env Var:** `RCLONE_KOOFR_SETMTIME`
- **Type:** bool
- **Default:** true
### `--koofr-encoding`
The encoding for the backend.
See the encoding section in the overview (`https://rclone.org/overview/#encoding`) for more info.
Properties:
- **Config:** `encoding`
- **Env Var:** `RCLONE_KOOFR_ENCODING`
- **Type:** Encoding
- **Default:** `Slash,BackSlash,Del,Ctl,InvalidUtf8,Dot`
### `--koofr-description`
Description of the remote.
Properties:
- **Config:** `description`
- **Env Var:** `RCLONE_KOOFR_DESCRIPTION`
- **Type:** string
- **Required:** false
---
## ๐ญ Limitations ๐ญ
Real talk: Koofr is **case insensitive**, so you literally cannot have one file called `"Hello.doc"` and another one called `"hello.doc"`. Pick a lane, babe.
---
# ๐ Providers ๐
## Koofr
This is the original Koofr (`https://koofr.eu`) storage provider โ the main example, the one we literally just described in the configuration section above. Main character energy tbh.
## Digi Storage
Digi Storage (`https://www.digi.ro/servicii/online/digi-storage`) is a cloud storage service run by Digi.ro (`https://www.digi.ro/`) that provides a Koofr API. Slay.
Here's an example of how to make a remote called `ds`. First run:
rclone config
and it'll guide you through the setup like so:
No remotes found, make a new one? n) New remote s) Set configuration password q) Quit config n/s/q> n name> ds Option Storage. Type of storage to configure. Choose a number from below, or type in your own value. [snip] 22 / Koofr, Digi Storage and other Koofr-compatible storage providers \ (koofr) [snip] Storage> koofr Option provider. Choose your storage provider. Choose a number from below, or type in your own value. Press Enter to leave empty. 1 / Koofr, https://app.koofr.net/ \ (koofr) 2 / Digi Storage, https://storage.rcs-rds.ro/ \ (digistorage) 3 / Any other Koofr API compatible storage service \ (other) provider> 2 Option user. Your user name. Enter a value. user> USERNAME Option password. Your password for rclone (generate one at https://storage.rcs-rds.ro/app/admin/preferences/password). Choose an alternative below. y) Yes, type in my own password g) Generate random password y/g> y Enter the password: password: Confirm the password: password: Edit advanced config? y) Yes n) No (default) y/n> n
[ds] type = koofr provider = digistorage user = USERNAME password = * ENCRYPTED *
y) Yes this is OK (default) e) Edit this remote d) Delete this remote y/e/d> y
## Other
You might also wanna hook up some other public or private storage provider that runs a Koofr API compatible service โ you just gotta provide the base URL to connect to. That's it, that's the whole vibe. โจ
Here's an example of how to make a remote called `other`. First run:
rclone config
and it'll guide you through it like:
No remotes found, make a new one? n) New remote s) Set configuration password q) Quit config n/s/q> n name> other Option Storage. Type of storage to configure. Choose a number from below, or type in your own value. [snip] 22 / Koofr, Digi Storage and other Koofr-compatible storage providers \ (koofr) [snip] Storage> koofr Option provider. Choose your storage provider. Choose a number from below, or type in your own value. Press Enter to leave empty. 1 / Koofr, https://app.koofr.net/ \ (koofr) 2 / Digi Storage, https://storage.rcs-rds.ro/ \ (digistorage) 3 / Any other Koofr API compatible storage service \ (other) provider> 3 Option endpoint. The Koofr API endpoint to use. Enter a value. endpoint> https://koofr.other.org Option user. Your user name. Enter a value. user> USERNAME Option password. Your password for rclone (generate one at your service's settings page). Choose an alternative below. y) Yes, type in my own password g) Generate random password y/g> y Enter the password: password: Confirm the password: password: Edit advanced config? y) Yes n) No (default) y/n> n
[other] type = koofr provider = other endpoint = https://koofr.other.org user = USERNAME password = * ENCRYPTED *
y) Yes this is OK (default) e) Edit this remote d) Delete this remote y/e/d> y
and that's the whole Koofr saga bestie, more coming, don't go anywhere ๐
## <pink>Linkbox</p> ๐
Linkbox is a private cloud drive, and you can find it at https://linkbox.to/. It's giving "your own lil corner of the internet" energy. ๐
### <purple>Configuration</purple>
Okay bestie, here's literally how you make a remote for Linkbox:
You're gonna need:
- An API token from https://www.linkbox.to/admin/account
- The email and password for your Linkbox account
> **Note:** As of v1.74, email and password are required in addition to the API token. The API token is used for uploads and modifications, while email/password authentication is used for listing and downloading files. If you have an existing Linkbox remote, you will need to reconfigure it with `rclone config` to edit the remote and add the email and password. ๐
First run this:
rclone config
It'll hold your hand through the whole interactive setup, like this:
No remotes found, make a new one? n) New remote s) Set configuration password q) Quit config n/s/q> n
Enter name for new remote. name> remote
Option Storage. Type of storage to configure. Choose a number from below, or type in your own value. XX / Linkbox \ (linkbox) Storage> XX
Option token. Token from https://www.linkbox.to/admin/account Enter a value. token> YOUR_API_TOKEN
Option email. Email for login Enter a value. email> your@email.com
Option password. Password for login Enter a value. password> YOUR_PASSWORD
Configuration complete. Options:
- type: linkbox
- token: XXXXXXXXXXX
- email: your@email.com
- password: * ENCRYPTED * Keep this "linkbox" remote? y) Yes this is OK (default) e) Edit this remote d) Delete this remote y/e/d> y
### <cyan>Standard options</cyan>
Here are the Standard options specific to linkbox (Linkbox). ๐
### --linkbox-token
Token from https://www.linkbox.to/admin/account
Properties:
- Config: token
- Env Var: `RCLONE_LINKBOX_TOKEN`
- Type: string
- Required: true
### --linkbox-email
Email for login
Properties:
- Config: email
- Env Var: `RCLONE_LINKBOX_EMAIL`
- Type: string
- Required: true
### --linkbox-password
Password for login
> **NB** Input to this must be obscured โ see rclone obscure (https://rclone.org/commands/rclone_obscure/). ๐
Properties:
- Config: password
- Env Var: `RCLONE_LINKBOX_PASSWORD`
- Type: string
- Required: true
### <mint>Advanced options</mint>
Here are the Advanced options specific to linkbox (Linkbox).
### --linkbox-description
Description of the remote.
Properties:
- Config: description
- Env Var: `RCLONE_LINKBOX_DESCRIPTION`
- Type: string
- Required: false
### <yellow>Limitations</yellow>
Invalid UTF-8 bytes will also be replaced (https://rclone.org/overview/#invalid-utf8), as they can't be used in JSON strings. No cap. ๐ญ
---
## <hotpink>Mail.ru Cloud</hotpink> ๐ฆ
Mail.ru Cloud (https://cloud.mail.ru/) is a cloud storage provided by a Russian internet company, Mail.Ru Group (https://mail.ru). The official desktop client is Disk-O: (https://disk-o.cloud/en), and it's available on Windows and Mac OS. โจ
### <purple>Features highlights</purple>
- Paths may be as deep as required, e.g. `remote:directory/subdirectory`
- Files have a last modified time property, directories don't
- Deleted files are by default moved to the trash
- Files and directories can be shared via public links
- Partial uploads or streaming are not supported, file size must be known before upload
- Maximum file size is limited to 2G for a free account, unlimited for paid accounts
- Storage keeps hash for all files and performs transparent deduplication, the hash algorithm is a modified SHA1
- If a particular file is already present in storage, one can quickly submit file hash instead of long file upload (this optimization is supported by rclone)
### <cyan>Configuration</cyan>
Here's an example of making a mailru configuration. ๐
First create a Mail.ru Cloud account and choose a tariff.
You will need to log in and create an app password for rclone. Rclone will not work with your normal username and password โ it will give an error like `oauth2: server response missing access_token`. ๐
- Click on your user icon in the top right
- Go to Security / "ะะฐัะพะปั ะธ ะฑะตะทะพะฟะฐัะฝะพััั"
- Click password for apps / "ะะฐัะพะปะธ ะดะปั ะฒะฝะตัะฝะธั
ะฟัะธะปะพะถะตะฝะธะน"
- Add the password โ give it a name โ eg "rclone"
- Select the permissions level. For some reason just "Full access to Cloud" (WebDav) doesn't work for Rclone currently. You have to select "Full access to Mail, Cloud and Calendar" (all protocols). (thread on forum.rclone.org (https://forum.rclone.org/t/failed-to-create-file-system-for-mailru-failed-to-authorize-oauth2-invalid-username-or-password-username-or-password-is-incorrect/49298))
- Copy the password and use this password below โ your normal login password won't work.
Now run:
rclone config
This will guide you through an interactive setup process:
No remotes found, make a new one? n) New remote s) Set configuration password q) Quit config n/s/q> n name> remote Type of storage to configure. Type of storage to configure. Enter a string value. Press Enter for the default (""). Choose a number from below, or type in your own value [snip] XX / Mail.ru Cloud \ "mailru" [snip] Storage> mailru User name (usually email) Enter a string value. Press Enter for the default (""). user> username@mail.ru Password
This must be an app password - rclone will not work with your normal password. See the Configuration section in the docs for how to make an app password. y) Yes type in my own password g) Generate random password y/g> y Enter the password: password: Confirm the password: password: Skip full upload if there is another file with same data hash. This feature is called "speedup" or "put by hash". It is especially efficient in case of generally available files like popular books, video or audio clips [snip] Enter a boolean value (true or false). Press Enter for the default ("true"). Choose a number from below, or type in your own value 1 / Enable \ "true" 2 / Disable \ "false" speedup_enable> 1 Edit advanced config? (y/n) y) Yes n) No y/n> n Remote config Configuration complete. Options:
- type: mailru
- user: username@mail.ru
- pass: * ENCRYPTED *
- speedup_enable: true Keep this "remote" remote? y) Yes this is OK e) Edit this remote d) Delete this remote y/e/d> y
Configuration of this backend does not require a local web browser. You can use the configured backend as shown below. ๐ซถ
See top level directories:
rclone lsd remote:
Make a new directory:
rclone mkdir remote:directory
List the contents of a directory:
rclone ls remote:directory
Sync `/home/local/directory` to the remote path, deleting any excess files in the path:
rclone sync --interactive /home/local/directory remote:directory
### <mint>Modification times and hashes</mint>
Files support a modification time attribute with up to 1 second precision. Directories do not have a modification time, which is shown as "Jan 1 1970". ๐
File hashes are supported, with a custom Mail.ru algorithm based on SHA1. If file size is less than or equal to the SHA1 block size (20 bytes), its hash is simply its data right-padded with zero bytes. Hashes of a larger file is computed as a SHA1 of the file data bytes concatenated with a decimal representation of the data length. ๐ฅ
### <yellow>Emptying Trash</yellow>
Removing a file or directory actually moves it to the trash, which is not visible to rclone but can be seen in a web browser. The trashed file still occupies part of total quota. If you wish to empty your trash and free some quota, you can use the `rclone cleanup remote:` command, which will permanently delete all your trashed files. This command does not take any path arguments. โ ๏ธ
### <peach>Quota information</peach>
To view your current quota you can use the `rclone about remote:` command which will display your usage limit (quota) and the current usage.
### <lavender>Restricted filename characters</lavender>
In addition to the default restricted characters set (https://rclone.org/overview/#restricted-characters) the following characters are also replaced:
- `"` โ Value 0x22 โ Replacement ๏ผ
- `*` โ Value 0x2A โ Replacement ๏ผ
- `:` โ Value 0x3A โ Replacement ๏ผ
- `<` โ Value 0x3C โ Replacement ๏ผ
- `>` โ Value 0x3E โ Replacement ๏ผ
- `?` โ Value 0x3F โ Replacement ๏ผ
- `\` โ Value 0x5C โ Replacement ๏ผผ
- `|` โ Value 0x7C โ Replacement ๏ฝ
Invalid UTF-8 bytes will also be replaced (https://rclone.org/overview/#invalid-utf8), as they can't be used in JSON strings. ๐ญ
### <cyan>Standard options</cyan>
Here are the Standard options specific to mailru (Mail.ru Cloud).
### --mailru-client-id
OAuth Client Id.
Leave blank normally.
Properties:
- Config: client_id
- Env Var: `RCLONE_MAILRU_CLIENT_ID`
- Type: string
- Required: false
### --mailru-client-secret
OAuth Client Secret.
Leave blank normally.
Properties:
- Config: client_secret
- Env Var: `RCLONE_MAILRU_CLIENT_SECRET`
- Type: string
- Required: false
### --mailru-user
User name (usually email).
Properties:
- Config: user
- Env Var: `RCLONE_MAILRU_USER`
- Type: string
- Required: true
### --mailru-pass
Password.
This must be an app password โ rclone will not work with your normal password. See the Configuration section in the docs for how to make an app password.
> **NB** Input to this must be obscured โ see rclone obscure (https://rclone.org/commands/rclone_obscure/). ๐
Properties:
- Config: pass
- Env Var: `RCLONE_MAILRU_PASS`
- Type: string
- Required: true
### --mailru-speedup-enable
Skip full upload if there is another file with same data hash.
This feature is called **"speedup"** or **"put by hash"**. It is <green>especially</green> efficient in case of generally available files like popular books, video or audio clips, because files are searched by hash in <pink>all accounts of all mailru users</pink>. It is meaningless and ineffective if source file is unique or encrypted. ๐ซถ
Please note that rclone may need local memory and disk space to calculate content hash in advance and decide whether full upload is required. Also, if rclone does not know file size in advance (e.g. in case of streaming or partial uploads), it will <red>not even try</red> this optimization. ๐ญ
Properties:
- Config: `speedup_enable`
- Env Var: `RCLONE_MAILRU_SPEEDUP_ENABLE`
- Type: bool
- Default: `true`
- Examples:
- `"true"`
- Enable
- `"false"`
- Disable
---
## โจ Advanced options โจ
Here are the Advanced options specific to mailru (Mail.ru Cloud). bestie these are the deep-cuts, the iykyk settings ๐
---
### `--mailru-token`
OAuth Access Token as a JSON blob. ๐
Properties:
- Config: `token`
- Env Var: `RCLONE_MAILRU_TOKEN`
- Type: string
- Required: false
---
### `--mailru-auth-url`
Auth server URL.
Leave blank to use the provider defaults.
Properties:
- Config: `auth_url`
- Env Var: `RCLONE_MAILRU_AUTH_URL`
- Type: string
- Required: false
---
### `--mailru-token-url`
Token server url.
Leave blank to use the provider defaults.
Properties:
- Config: `token_url`
- Env Var: `RCLONE_MAILRU_TOKEN_URL`
- Type: string
- Required: false
---
### `--mailru-client-credentials`
Use client credentials OAuth flow. ๐
This will use the OAUTH2 client Credentials Flow as described in RFC 6749.
Note that this option is **NOT supported by all backends.** โ ๏ธ
Properties:
- Config: `client_credentials`
- Env Var: `RCLONE_MAILRU_CLIENT_CREDENTIALS`
- Type: bool
- Default: `false`
---
### `--mailru-speedup-file-patterns`
Comma separated list of file name patterns eligible for speedup (put by hash). ๐
Patterns are case insensitive and can contain `'*'` or `'?'` meta characters.
Properties:
- Config: `speedup_file_patterns`
- Env Var: `RCLONE_MAILRU_SPEEDUP_FILE_PATTERNS`
- Type: string
- Default: `.mkv,.avi,.mp4,.mp3,.zip,.gz,.rar,.pdf`
- Examples:
- `""`
- Empty list completely disables speedup (put by hash).
- `"*"`
- All files will be attempted for speedup.
- `.mkv,.avi,.mp4,.mp3`
- Only common audio/video files will be tried for put by hash.
- `.zip,.gz,.rar,.pdf`
- Only common archives or PDF books will be tried for speedup.
---
### `--mailru-speedup-max-disk`
This option allows you to disable speedup (put by hash) for large files.
Reason is that preliminary hashing can exhaust your RAM or disk space. ๐ like bestie it will EAT your resources
Properties:
- Config: `speedup_max_disk`
- Env Var: `RCLONE_MAILRU_SPEEDUP_MAX_DISK`
- Type: SizeSuffix
- Default: `3Gi`
- Examples:
- `"0"`
- Completely disable speedup (put by hash).
- `"1G"`
- Files larger than 1Gb will be uploaded directly.
- `"3G"`
- Choose this option if you have less than 3Gb free on local disk.
---
### `--mailru-speedup-max-memory`
Files larger than the size given below will always be hashed on disk.
Properties:
- Config: `speedup_max_memory`
- Env Var: `RCLONE_MAILRU_SPEEDUP_MAX_MEMORY`
- Type: SizeSuffix
- Default: `32Mi`
- Examples:
- `"0"`
- Preliminary hashing will always be done in a temporary disk location.
- `"32M"`
- Do not dedicate more than 32Mb RAM for preliminary hashing.
- `"256M"`
- You have at most 256Mb RAM free for hash calculations.
---
### `--mailru-check-hash`
What should copy do if file checksum is mismatched or invalid. ๐ณ
Properties:
- Config: `check_hash`
- Env Var: `RCLONE_MAILRU_CHECK_HASH`
- Type: bool
- Default: `true`
- Examples:
- `"true"`
- Fail with error.
- `"false"`
- Ignore and continue.
---
### `--mailru-encoding`
The encoding for the backend.
See the encoding section in the overview (https://rclone.org/overview/#encoding) for more info.
Properties:
- Config: `encoding`
- Env Var: `RCLONE_MAILRU_ENCODING`
- Type: Encoding
- Default: `Slash,LtGt,DoubleQuote,Colon,Question,Asterisk,Pipe,BackSlash,Del,Ctl,InvalidUtf8,Dot`
---
### `--mailru-description`
Description of the remote. ๐ธ
Properties:
- Config: `description`
- Env Var: `RCLONE_MAILRU_DESCRIPTION`
- Type: string
- Required: false
---
## ๐ฆ Limitations ๐ฆ
File size limits depend on your account. A single file size is limited by `2G` for a free account and **unlimited** for paid tariffs. Please refer to the Mail.ru site for the total uploaded size limits.
> Note that Mailru is <hotpink>case insensitive</hotpink> so you can't have a file called `"Hello.doc"` and one called `"hello.doc"`. ๐ pick a lane bestie, the server will fr fr just see them as the same thing
# ๐ฆ Mega ๐ฆ
Okay bestie, listen. <pink>Mega</pink> (`https://mega.nz/`) is a cloud storage and file hosting service that's <italic>famous</italic> for its security vibe โ like, literally all your files get encrypted <rainbow>locally</rainbow> before they ever get uploaded. Which means nobody (and I mean <bold>nobody</bold>, not even the Mega employees themselves) can peek at your files without knowing the key used for that encryption. Iconic behavior honestly. ๐โจ
This here is the rclone backend for Mega, and it supports all the file transfer features of Mega using that exact same client side encryption. Chef's kiss. ๐
> Heads up queen: <bold>MEGA S4 Object Storage</bold>, which is an S3 compatible object store, also works with rclone โ and that's the one recommended for new projects. Just so you know. ๐
Paths are specified as `remote:path`
Paths may be as deep as required, e.g. `remote:directory/subdirectory`.
---
## ๐ธ Configuration ๐ธ
Here's a lil example of how to make a remote called `remote`. First run:
rclone config
This will guide you through an interactive setup process, no cap:
No remotes found, make a new one? n) New remote s) Set configuration password q) Quit config n/s/q> n name> remote Type of storage to configure. Choose a number from below, or type in your own value [snip] XX / Mega \ "mega" [snip] Storage> mega User name user> you@example.com Password. y) Yes type in my own password g) Generate random password n) No leave this optional password blank y/g/n> y Enter the password: password: Confirm the password: password: Remote config Configuration complete. Options:
- type: mega
- user: you@example.com
- pass: * ENCRYPTED * Keep this "remote" remote? y) Yes this is OK e) Edit this remote d) Delete this remote y/e/d> y
> <hotpink>NOTE:</hotpink> the encryption keys need to have been already generated after a regular login via the browser, otherwise attempting to use the credentials in rclone will <bold>fail</bold>. So go log in on the website first, bestie. ๐
Once configured you can then use rclone like this (replace `remote` with the name you gave your remote, duh):
List directories in top level of your Mega
rclone lsd remote:
List all the files in your Mega
rclone ls remote:
To copy a local directory to an Mega directory called `backup`
rclone copy /home/source remote:backup
---
## โฐ Modification times and hashes โฐ
Mega does not support modification times or hashes yet. That's it, that's the whole section. ๐ญ
---
## ๐ค Restricted filename characters ๐ค
- `NUL` โ `0x00` โ replaced with `โ`
- `/` โ `0x2F` โ replaced with `๏ผ`
Invalid UTF-8 bytes will also be replaced (see `https://rclone.org/overview/#invalid-utf8`), because they literally can't be used in JSON strings. Not our fault, take it up with JSON. ๐
---
## ๐ฏ Duplicated files ๐ฏ
Mega can have two files with <italic>exactly</italic> the same name and path โ unlike a normal file system, which could never. ๐
Duplicated files cause problems with the syncing and you will see messages in the log about duplicates.
Use `rclone dedupe` to fix duplicated files. Slay and clean up your mess. โจ
---
## ๐ต Failure to log-in ๐ต
### ๐ Object not found ๐
If you are connecting to your Mega remote for the first time, to test access and synchronization, you may receive an error such as
Failed to create file system for "my-mega-remote:": couldn't login: Object (typically, node or user) not found
The diagnostic steps often recommended in the rclone forum (`https://forum.rclone.org/search?q=mega`) start with the `MEGAcmd` utility. Note that this refers to the official C++ command from `https://github.com/meganz/MEGAcmd` and <bold>not</bold> the go language built command from `t3rm1n4l/megacmd` that is no longer maintained. Don't mix them up bestie, they are not the same girl. ๐
Follow the instructions for installing `MEGAcmd` and try accessing your remote as they recommend. You can establish whether or not you can log in using `MEGAcmd`, and obtain diagnostic information to help you, and search or work with others in the forum.
MEGA CMD> login me@example.com Password: Fetching nodes ... Loading transfers from local cache Login complete as me@example.com me@example.com:/$
Note that some have found issues with passwords containing special characters. If you can not log on with rclone, but `MEGAcmd` logs on just fine, then consider changing your password temporarily to pure alphanumeric characters, in case that helps. Like, sometimes the drama is the punctuation. ๐ญ
### ๐ซ Repeated commands blocks access ๐ซ
Mega remotes seem to get blocked (reject logins) under "heavy use". We haven't worked out the exact blocking rules but it seems to be related to fast paced, successive rclone commands.
For example, executing this command 90 times in a row `rclone link remote:file` will cause the remote to become "blocked". This is not an abnormal situation, for example if you wish to get the public links of a directory with hundred of files... After more or less a week, the remote will remote accept rclone logins normally again.
You can mitigate this issue by mounting the remote it with `rclone mount`. This will log-in when mounting and a log-out when unmounting only. You can also run `rclone rcd` and then use `rclone rc` to run the commands over the API to avoid logging in each time.
Rclone does not currently close mega sessions (you can see them in the web interface), however closing the sessions does not solve the issue.
If you space rclone commands by 3 seconds it will avoid blocking the remote. We haven't identified the exact blocking rules, so perhaps one could execute the command 80 times without waiting and avoid blocking by waiting 3 seconds, then continuing...
> Note that this has been observed by trial and error and might not be set in stone. Lowkey still under investigation fr fr. ๐ฌ
Other tools seem not to produce this blocking effect, as they use a different working approach (state-based, using sessionIDs instead of log-in) which isn't compatible with the current stateless rclone approach.
Note that once blocked, the use of other tools (such as `megacmd`) is not a sure workaround: following `megacmd` login times have been observed in succession for blocked remote: 7 minutes, 20 min, 30min, 30 min, 30min. Web access looks unaffected though.
Investigation is continuing in relation to workarounds based on timeouts, pacers, retrials and tpslimits โ if you discover something relevant, please post on the forum. Be the main character who cracks the case. ๐ต๏ธโโ๏ธ
So, if rclone was working nicely and suddenly you are unable to log-in and you are sure the user and the password are correct, likely you have got the remote blocked for a while. It's not you, it's the block. ๐
---
## โจ Standard options โจ
Here are the Standard options specific to mega (Mega).
- **`--mega-user`** โ User name.
Properties:
- Config: `user`
- Env Var: `RCLONE_MEGA_USER`
- Type: `string`
- Required: `true`
- **`--mega-pass`** โ Password.
NB Input to this must be obscured โ see `rclone obscure` (`https://rclone.org/commands/rclone_obscure/`).
Properties:
- Config: `pass`
- Env Var: `RCLONE_MEGA_PASS`
- Type: `string`
- Required: `true`
- **`--mega-2fa`** โ The 2FA code of your MEGA account if the account is set up with one
Properties:
- Config: `2fa`
- Env Var: `RCLONE_MEGA_2FA`
- Type: `string`
- Required: `false`
---
## ๐ฅ Advanced options ๐ฅ
Here are the Advanced options specific to mega (Mega).
- **`--mega-debug`** โ Output more debug from Mega.
If this flag is set (along with `-vv`) it will print further debugging information from the mega backend.
Properties:
- Config: `debug`
- Env Var: `RCLONE_MEGA_DEBUG`
- Type: `bool`
- Default: `false`
- **`--mega-hard-delete`** โ Delete files permanently rather than putting them into the trash.
Normally the mega backend will put all deletions into the trash rather than permanently deleting them. If you specify this then rclone will permanently delete objects instead. โ ๏ธ Like, gone gone. No undo button. Be careful bestie.
Properties:
- Config: `hard_delete`
- Env Var: `RCLONE_MEGA_HARD_DELETE`
- Type: `bool`
- Default: `false`
- **`--mega-use-https`** โ Use HTTPS for transfers.
MEGA uses plain text HTTP connections by default. Some ISPs throttle HTTP connections, this causes transfers to become very slow. Enabling this will force MEGA to use HTTPS for all transfers. HTTPS is normally not necessary since all data is already encrypted anyway. Enabling it will increase CPU usage and add network overhead.
Properties:
- Config: `use_https`
- Env Var: `RCLONE_MEGA_USE_HTTPS`
- Type: `bool`
- Default: `false`
- **`--mega-encoding`** โ The encoding for the backend.
See the encoding section in the overview (`https://rclone.org/overview/#encoding`) for more info.
Properties:
- Config: `encoding`
- Env Var: `RCLONE_MEGA_ENCODING`
- Type: `Encoding`
- Default: `Slash,InvalidUtf8,Dot`
- **`--mega-description`** โ Description of the remote.
Properties:
- Config: `description`
- Env Var: `RCLONE_MEGA_DESCRIPTION`
- Type: `string`
- Required: `false`
---
## ๐ Process killed ๐
On accounts with large files or something else, memory usage can significantly increase when executing list/sync instructions. When running on cloud providers (like AWS with EC2), check if the instance type has sufficient memory/CPU to execute the commands. Use the resource monitoring tools to inspect after sending the commands. Look at this issue (`https://forum.rclone.org/t/rclone-with-mega-appears-to-work-only-in-some-accounts/40233/4`). Not your fave moment, we know. ๐ญ
---
## ๐ Limitations ๐
This backend uses the `go-mega` go library (`https://github.com/t3rm1n4l/go-mega`) which is an opensource go library implementing the Mega API. There doesn't appear to be any documentation for the mega protocol beyond the mega C++ SDK (`https://github.com/meganz/sdk`) source code so there are likely quite a few errors still remaining in this library. It's giving โจ adventure โจ honestly.
Mega allows duplicate files which may confuse rclone. ๐
# ๐พ Memory
okay so bestie, the memory backend is literally just an in-RAM situation. It does **not** persist its data โ like, at all, it forgets everything the second you look away ๐ โ so if you want your files to actually survive, use the local backend for that instead.
The memory backend behaves like a bucket-based remote (think s3 energy ๐ชฃ, same shape). Because it has <pink>no parameters</pink> you can just use it with the `:memory:` remote name. iconic behavior, honestly.
---
## โ๏ธ Configuration
You can configure it as a remote like this with `rclone config` too if you want to:
No remotes found, make a new one? n) New remote s) Set configuration password q) Quit config n/s/q> n name> remote Type of storage to configure. Enter a string value. Press Enter for the default (""). Choose a number from below, or type in your own value [snip] XX / Memory \ "memory" [snip] Storage> memory ** See help for memory backend at: https://rclone.org/memory/ **
Remote config
Configuration complete. Options:
- type: memory Keep this "remote" remote? y) Yes this is OK (default) e) Edit this remote d) Delete this remote y/e/d> y
Because the memory backend isn't persistent it is most useful for testing or with an `rclone server` or `rclone mount`, e.g.
rclone mount :memory: /mnt/tmp rclone serve webdav :memory: rclone serve sftp :memory:
---
## โฑ๏ธ Modification times and hashes
The memory backend supports MD5 hashes and modification times accurate to `1 nS`. yes, nano-freaking-seconds. precise queen ๐
---
## ๐ซ Restricted filename characters
The memory backend replaces the default restricted characters set (https://rclone.org/overview/#restricted-characters).
---
## ๐ง Advanced options
Here are the Advanced options specific to memory (In memory object storage system.).
### `--memory-discard`
If set all writes will be discarded and reads will return an error
If set then when files are uploaded the contents not be saved. The files will appear to have been uploaded but will give an error on read. Files will have their MD5 sum calculated on upload which takes very little CPU time and allows the transfers to be checked.
This can be useful for testing performance.
Probably most easily used by using the connection string syntax:
:memory,discard:bucket
Properties:
- Config: `discard`
- Env Var: `RCLONE_MEMORY_DISCARD`
- Type: `bool`
- Default: `false`
### `--memory-description`
Description of the remote.
Properties:
- Config: `description`
- Env Var: `RCLONE_MEMORY_DESCRIPTION`
- Type: `string`
- Required: `false`
---
# ๐ Akamai NetStorage
Paths are specified as `remote:` You may put subdirectories in too, e.g. `remote:/path/to/dir`. If you have a CP code you can use that as the folder after the domain such as `<domain>/<cpcode>/<internal directories within cpcode>`.
For example, this is commonly configured with or without a CP code:
- With a CP code. `[your-domain-prefix]-nsu.akamaihd.net/123456/subdirectory/`
- Without a CP code. `[your-domain-prefix]-nsu.akamaihd.net`
### ๐ See all buckets
rclone lsd remote:
The initial setup for Netstorage involves getting an account and secret. Use `rclone config` to walk you through the setup process.
---
## โ๏ธ Configuration
Here's an example of how to make a remote called `ns1`.
1. To begin the interactive configuration process, enter this command:
rclone config
2. Type `n` to create a new remote.
n) New remote d) Delete remote q) Quit config e/n/d/q> n
3. For this example, enter `ns1` when you reach the `name>` prompt.
name> ns1
4. Enter `netstorage` as the type of storage to configure.
Type of storage to configure. Enter a string value. Press Enter for the default (""). Choose a number from below, or type in your own value XX / NetStorage \ "netstorage" Storage> netstorage
5. Select between the HTTP or HTTPS protocol. Most users should choose HTTPS, which is the default. HTTP is provided primarily for debugging purposes.
Enter a string value. Press Enter for the default (""). Choose a number from below, or type in your own value 1 / HTTP protocol \ "http" 2 / HTTPS protocol \ "https" protocol> 1
6. Specify your NetStorage host, CP code, and any necessary content paths using this format: `<domain>/<cpcode>/<content>/`
Enter a string value. Press Enter for the default (""). host> baseball-nsu.akamaihd.net/123456/content/
7. Set the netstorage account name
Enter a string value. Press Enter for the default (""). account> username
8. Set the Netstorage account secret/G2O key which will be used for authentication purposes. Select the `y` option to set your own password then enter your secret. Note: The secret is stored in the `rclone.conf` file with hex-encoded encryption.
y) Yes type in my own password g) Generate random password y/g> y Enter the password: password: Confirm the password: password:
9. View the summary and confirm your remote configuration.
[ns1] type = netstorage protocol = http host = baseball-nsu.akamaihd.net/123456/content/ account = username secret = * ENCRYPTED *
y) Yes this is OK (default) e) Edit this remote d) Delete this remote y/e/d> y
This remote is called `ns1` and can now be used. slay ๐
---
## โจ Example operations
Get started with `rclone` and NetStorage with these examples. For additional `rclone` commands, visit <https://rclone.org/commands/>.
### ๐ See contents of a directory in your project
rclone lsd ns1:/974012/testing/
### ๐ Sync the contents local with remote
rclone sync . ns1:/974012/testing/
### โฌ๏ธ Upload local content to remote
rclone copy notes.txt ns1:/974012/testing/
### ๐๏ธ Delete content on remote
rclone delete ns1:/974012/testing/notes.txt
### ๐ Move or copy content between CP codes
Your credentials must have access to two CP codes on the same remote. You can't perform operations between different remotes.
rclone move ns1:/974012/testing/notes.txt ns1:/974450/testing2/
---
## ๐ Features
### ๐ Symlink Support
The Netstorage backend changes the rclone `--links`, `-l` behavior. When uploading, instead of creating the `.rclonelink` file, use the "symlink" API in order to create the corresponding symlink on the remote. The `.rclonelink` file will not be created, the upload will be intercepted and only the symlink file that matches the source file name with no suffix will be created on the remote.
This will effectively allow commands like `copy/copyto`, `move/moveto` and `sync` to upload from local to remote and download from remote to local directories with symlinks. Due to internal rclone limitations, it is not possible to upload an individual symlink file to any remote backend. You can always use the "backend symlink" command to create a symlink on the NetStorage server, refer to "symlink" section below.
Individual symlink files on the remote can be used with the commands like "cat" to print the destination name, or "delete" to delete symlink, or `copy`, `copy/to` and `move/moveto` to download from the remote to local. Note: individual symlink files on the remote should be specified including the suffix `.rclonelink`.
> Note: No file with the suffix `.rclonelink` should ever exist on the server since it is not possible to actually upload/create a file with `.rclonelink` suffix with rclone, it can only exist if it is manually created through a non-rclone method on the remote. ๐ญ
### ๐ Implicit vs. Explicit Directories
With NetStorage, directories can exist in one of two forms:
1. **Explicit Directory**. This is an actual, physical directory that you have created in a storage group.
2. **Implicit Directory**. This refers to a directory within a path that has not been physically created. For example, during upload of a file, nonexistent subdirectories can be specified in the target path. NetStorage creates these as "implicit." While the directories aren't physically created, they exist implicitly and the noted path is connected with the uploaded file.
Rclone will intercept all file uploads and `mkdir` commands for the NetStorage remote and will explicitly issue the `mkdir` command for each directory in the uploading path. This will help with the interoperability with the other Akamai services such as SFTP and the Content Management Shell (CMShell). Rclone will not guarantee correctness of operations with implicit directories which might have been created as a result of using an upload API directly.
### โก `--fast-list` / ListR support
NetStorage remote supports the ListR feature by using the "list" NetStorage API action to return a lexicographical list of all objects within the specified CP code, recursing into subdirectories as they're encountered.
- Rclone will use the ListR method for some commands by default. Commands such as `lsf -R` will use ListR by default. To disable this, include the `--disable listR` option to use the non-recursive method of listing objects.
- Rclone will not use the ListR method for some commands. Commands such as `sync` don't use ListR by default. To force using the ListR method, include the `--fast-list` option.
There are pros and cons of using the ListR method, refer to rclone documentation (https://rclone.org/docs/#fast-list). In general, the `sync` command over an existing deep tree on the remote will run faster with the "--fast-list" flag but with extra memory usage as a side effect. It might also result in higher CPU utilization but the whole task can be completed faster.
> Note: There is a known limitation that "lsf -R" will display number of files in the directory and directory size as `-1` when ListR method is used. The workaround is to pass "--disable listR" flag if these numbers are important in the output. ๐
### ๐งน Purge
NetStorage remote supports the `purge` feature by using the "quick-delete" NetStorage API action. The quick-delete action is disabled by default for security reasons and can be enabled for the account through the Akamai portal. Rclone will first try to use quick-delete action for the purge command and if this functionality is disabled then will fall back to a standard delete method.
> ๐ bestie heads up: go read the **NetStorage Usage API** (https://learn.akamai.com/en-us/webhelp/netstorage/netstorage-http-api-developer-guide/GUID-15836617-9F50-405A-833C-EA2556756A30.html) for the deets on using `"quick-delete"`. In general? using `quick-delete` will **not** delete the tree immediately, and objects targeted for quick-delete may still be accessible. So likeโฆ don't assume it's gone-gone ๐
---
### โจ Standard options
Here are the Standard options specific to netstorage (Akamai NetStorage). โจ
#### `--netstorage-host`
Domain+path of NetStorage host to connect to.
Format should be `<domain>/<internal folders>`
Properties:
- Config: `host`
- Env Var: `RCLONE_NETSTORAGE_HOST`
- Type: `string`
- Required: `true`
#### `--netstorage-account`
Set the NetStorage account name
Properties:
- Config: `account`
- Env Var: `RCLONE_NETSTORAGE_ACCOUNT`
- Type: `string`
- Required: `true`
#### `--netstorage-secret`
Set the NetStorage account secret/G2O key for authentication.
Please choose the `'y'` option to set your own password then enter your secret.
> NB Input to this must be obscured โ see `rclone obscure` (https://rclone.org/commands/rclone_obscure/). ๐
Properties:
- Config: `secret`
- Env Var: `RCLONE_NETSTORAGE_SECRET`
- Type: `string`
- Required: `true`
---
### โจ Advanced options
Here are the Advanced options specific to netstorage (Akamai NetStorage). โจ
#### `--netstorage-protocol`
Select between HTTP or HTTPS protocol.
Most users should choose HTTPS, which is the default. HTTP is provided primarily for debugging purposes. ๐
Properties:
- Config: `protocol`
- Env Var: `RCLONE_NETSTORAGE_PROTOCOL`
- Type: `string`
- Default: `"https"`
- Examples:
- `"http"`
- HTTP protocol
- `"https"`
- HTTPS protocol
#### `--netstorage-description`
Description of the remote.
Properties:
- Config: `description`
- Env Var: `RCLONE_NETSTORAGE_DESCRIPTION`
- Type: `string`
- Required: `false`
---
### โจ Backend commands
Here are the commands specific to the netstorage backend. ๐ซถ
Run them with:
rclone backend COMMAND remote:
The help below will explain what arguments each command takes.
See the backend (https://rclone.org/commands/rclone_backend/) command for more info on how to pass options and arguments.
These can be run on a running backend using the rc command backend/command (https://rclone.org/rc/#backend-command).
#### `du`
Return disk usage information for a specified directory. ๐พ
rclone backend du remote: [options] [<arguments>+]
The usage information returned, includes the targeted directory as well as all files stored in any sub-directories that may exist.
#### `symlink`
You can create a symbolic link in ObjectStore with the symlink action. ๐ธ
rclone backend symlink remote: [options] [<arguments>+]
The desired path location (including applicable sub-directories) ending in the object that will be the target of the symlink (for example, `/links/mylink`). Include the file extension for the object, if applicable.
Usage example:
rclone backend symlink <src> <path>
---
## โ๏ธ Microsoft Azure Blob Storage
Paths are specified as `remote:container` (or `remote:` for the `lsd` command.) You may put subdirectories in too, e.g. `remote:container/path/to/dir`. ๐
### โจ Configuration
Here is an example of making a Microsoft Azure Blob Storage configuration. For a remote called `remote`. First run:
rclone config
This will guide you through an interactive setup process:
No remotes found, make a new one? n) New remote s) Set configuration password q) Quit config n/s/q> n name> remote Type of storage to configure. Choose a number from below, or type in your own value [snip] XX / Microsoft Azure Blob Storage \ "azureblob" [snip] Storage> azureblob Storage Account Name account> account_name Storage Account Key key> base64encodedkey== Endpoint for the service - leave blank normally. endpoint> Remote config Configuration complete. Options:
- type: azureblob
- account: account_name
- key: base64encodedkey==
- endpoint: Keep this "remote" remote? y) Yes this is OK e) Edit this remote d) Delete this remote y/e/d> y
See all containers
rclone lsd remote:
Make a new container
rclone mkdir remote:container
List the contents of a container
rclone ls remote:container
Sync `/home/local/directory` to the remote container, deleting any excess files in the container.
rclone sync --interactive /home/local/directory remote:container
### โจ `--fast-list`
This remote supports `--fast-list` which allows you to use fewer transactions in exchange for more memory. See the rclone docs (https://rclone.org/docs/#fast-list) for more details. ๐
### โจ Modification times and hashes
The modification time is stored as metadata on the object with the `mtime` key. It is stored using RFC3339 Format time with nanosecond precision. The metadata is supplied during directory listings so there is no performance overhead to using it. โฑ๏ธ
If you wish to use the Azure standard `LastModified` time stored on the object as the modified time, then use the `--use-server-modtime` flag. Note that rclone can't set `LastModified`, so using the `--update` flag when syncing is recommended if using `--use-server-modtime`.
MD5 hashes are stored with blobs. However blobs that were uploaded in chunks only have an MD5 if the source remote was capable of MD5 hashes, e.g. the local disk.
### โจ Metadata and tags
Rclone can map arbitrary metadata to Azure Blob headers, user metadata, and tags when `--metadata` is enabled (or when using `--metadata-set` / `--metadata-mapper`). ๐ท๏ธ
- **Headers**: Set these keys in metadata to map to the corresponding blob headers:
- `cache-control`, `content-disposition`, `content-encoding`, `content-language`, `content-type`.
- **User metadata**: Any other non-reserved keys are written as user metadata (keys are normalized to lowercase). Keys starting with `x-ms-` are reserved and are not stored as user metadata.
- **Tags**: Provide `x-ms-tags` as a comma-separated list of `key=value` pairs, e.g. `x-ms-tags=env=dev,team=sync`. These are applied as blob tags on upload and on server-side copies. Whitespace around keys/values is ignored.
- **Modtime override**: Provide `mtime` in RFC3339/RFC3339Nano format to override the stored modtime persisted in user metadata. If `mtime` cannot be parsed, rclone logs a debug message and ignores the override.
Notes: - Rclone ignores reserved `x-ms-*` keys (except `x-ms-tags`) for user metadata.
### โจ Performance
When uploading large files, increasing the value of `--azureblob-upload-concurrency` will increase performance at the cost of using more memory. The default of `16` is set quite conservatively to use less memory. It maybe be necessary raise it to `64` or higher to fully utilize a 1 GBit/s link with a single file transfer. ๐ฅ
### โจ Restricted filename characters
In addition to the default restricted characters set (https://rclone.org/overview/#restricted-characters) the following characters are also replaced:
- `/` โ value `0x2F` โ replacement `๏ผ`
- `\` โ value `0x5C` โ replacement `๏ผผ`
File names can also not end with the following characters. These only get replaced if they are the last character in the name:
- `.` โ value `0x2E` โ replacement `๏ผ`
Invalid UTF-8 bytes will also be replaced (https://rclone.org/overview/#invalid-utf8), as they can't be used in JSON strings. ๐ญ
### โจ Authentication
There are a number of ways of supplying credentials for Azure Blob Storage. Rclone tries them in the order of the sections below. ๐
### โจ Env Auth
If the `env_auth` config parameter is `true` then rclone will pull credentials from the environment or runtime.
It tries these authentication methods in this order:
1. Environment Variables
2. Managed Service Identity Credentials
3. Azure CLI credentials (as used by the `az` tool)
These are described in the following sections
### โจ Env Auth: 1. Environment Variables
If `env_auth` is set and environment variables are present rclone authenticates a service principal with a secret or certificate, or a user with a password, depending on which environment variable are set. It reads configuration from these variables, in the following order:
1. Service principal with client secret
- `AZURE_TENANT_ID`: ID of the service principal's tenant. Also called its `"directory"` ID.
- `AZURE_CLIENT_ID`: the service principal's client ID
- `AZURE_CLIENT_SECRET`: one of the service principal's client secrets
2. Service principal with certificate
- `AZURE_TENANT_ID`: ID of the service principal's tenant. Also called its `"directory"` ID.
- `AZURE_CLIENT_ID`: the service principal's client ID
- `AZURE_CLIENT_CERTIFICATE_PATH`: path to a PEM or PKCS12 certificate file including the private key.
- `AZURE_CLIENT_CERTIFICATE_PASSWORD`: (optional) password for the certificate file.
- `AZURE_CLIENT_SEND_CERTIFICATE_CHAIN`: (optional) Specifies whether an authentication request will include an x5c header to support subject name / issuer based authentication. When set to `"true"` or `"1"`, authentication requests include the x5c header.
3. User with username and password
- `AZURE_TENANT_ID`: (optional) tenant to authenticate in. Defaults to `"organizations"`.
- `AZURE_CLIENT_ID`: client ID of the application the user will authenticate to
- `AZURE_USERNAME`: a username (usually an email address)
- `AZURE_PASSWORD`: the user's password
4. Workload Identity
- `AZURE_TENANT_ID`: Tenant to authenticate in
- `AZURE_CLIENT_ID`: Client ID of the application the user will authenticate to
- `AZURE_FEDERATED_TOKEN_FILE`: Path to projected service account token file
- `AZURE_AUTHORITY_HOST`: Authority of an Azure Active Directory endpoint (default: `login.microsoftonline.com`).
### ๐ซ Env Auth: 2. Managed Service Identity Credentials ๐ซ
okay so when you're using Managed Service Identity, here's the whole vibe: if the VM(SS) that this program is running on has a system-assigned identity, that one gets used by default. and if the resource has **no** system-assigned identity but <hotpink>exactly one</hotpink> user-assigned identity, then that user-assigned identity gets used by default too. easy peasy. ๐ซถ
but bestie, if the resource has *multiple* user-assigned identities, you're gonna need to unset `env_auth` and set `use_msi` instead. go peek at the `use_msi` section, it's all there. ๐
and if you're operating in disconnected clouds, or private clouds like Azure Stack, you may want to set `disable_instance_discovery = true`. what does that do, you ask? it controls whether rclone requests Microsoft Entra instance metadata from `https://login.microsoft.com/` **before** authenticating. setting it to true skips that request entirely โ which means <red>you</red> are responsible for making sure the configured authority is valid and trustworthy. no pressure or anything. ๐
---
### ๐ Env Auth: 3. Azure CLI credentials (as used by the `az` tool)
Credentials that were created with the `az` tool can be picked up using `env_auth`. obsessed with the convenience honestly.
like, say you logged in with a service principal like this:
az login --service-principal -u XXX -p XXX --tenant XXX
then you could access rclone resources like this:
rclone lsf :azureblob,env_auth,account=ACCOUNT:CONTAINER
or, alternate route:
rclone lsf --azureblob-env-auth --azureblob-account=ACCOUNT :azureblob:CONTAINER
which is completely analogous to using the `az` tool like:
az storage blob list --container-name CONTAINER --account-name ACCOUNT --auth-mode login
### ๐ Account and Shared Key
This one is the most straight forward and the least flexible way. literally just fill in the `account` and `key` lines and leave the rest blank. that's the whole recipe, no notes. โจ
### ๐๏ธ SAS URL
This can be an **account level** SAS URL or a **container level** SAS URL.
to use it, leave `account` and `key` blank and fill in `sas_url`.
you can get an account level SAS URL or a container level SAS URL from the Azure portal or the Azure Storage Explorer. and for a *container level* SAS URL specifically, right click on a container in the Azure Blob explorer in the Azure portal. yes, right click. that's the move. ๐ฑ๏ธ
if you use a container level SAS URL, rclone operations are only permitted on that one particular container, e.g.
rclone ls azureblob:container
you can also list that single container from the root. this will only show the container specified by the SAS URL.
$ rclone lsd azureblob: container/
and note that you <red>can't</red> see or access any other containers โ this will fail:
rclone ls azureblob:othercontainer
container level SAS URLs are useful for temporarily letting third parties access a single container, or for putting credentials into an untrusted environment like a CI build server. so iconic for that use case honestly. ๐ฅ
### ๐ต๏ธ Service principal with client secret
if these variables are set, rclone will authenticate with a service principal with a client secret.
- `tenant`: ID of the service principal's tenant. also called its "directory" ID.
- `client_id`: the service principal's client ID
- `client_secret`: one of the service principal's client secrets
the credentials can also be placed in a file using the `service_principal_file` configuration option. cute, flexible, love that for you. ๐
### ๐ Service principal with certificate
if these variables are set, rclone will authenticate with a service principal with certificate.
- `tenant`: ID of the service principal's tenant. also called its "directory" ID.
- `client_id`: the service principal's client ID
- `client_certificate_path`: path to a PEM or PKCS12 certificate file including the private key.
- `client_certificate_password`: (optional) password for the certificate file.
- `client_send_certificate_chain`: (optional) Specifies whether an authentication request will include an x5c header to support subject name / issuer based authentication. When set to "true" or "1", authentication requests include the x5c header.
> NB `client_certificate_password` must be obscured โ see `rclone obscure` (https://rclone.org/commands/rclone_obscure/). don't skip that part bestie, it matters.
### ๐ง User with username and password
if these variables are set, rclone will authenticate with username and password.
- `tenant`: (optional) tenant to authenticate in. Defaults to "organizations".
- `client_id`: client ID of the application the user will authenticate to
- `username`: a username (usually an email address)
- `password`: the user's password
Microsoft doesn't recommend this kind of authentication, because it's less secure than other authentication flows. this method is also **not interactive**, so it isn't compatible with any form of multi-factor authentication, and the application must already have user or admin consent. on top of all that, this credential can only authenticate work and school accounts โ it can't authenticate Microsoft accounts. so like... know what you're getting into. ๐
> NB `password` must be obscured โ see `rclone obscure` (https://rclone.org/commands/rclone_obscure/).
### ๐ชช Managed Service Identity Credentials
if `use_msi` is set then managed service identity credentials are used. this authentication <hotpink>only</hotpink> works when running in an Azure service. and `env_auth` needs to be unset to use this.
however, if you have multiple user identities to choose from, these must be explicitly specified using **exactly one** of the `msi_object_id`, `msi_client_id`, or `msi_mi_res_id` parameters.
if none of `msi_object_id`, `msi_client_id`, or `msi_mi_res_id` is set, this is equivalent to using `env_auth`.
### ๐ค Federated Identity Credentials
if these variables are set, rclone will authenticate with federated identity.
- `tenant`: tenant ID of the storage
- `client_id`: client ID of the application the user will authenticate to storage
- `msi_client_id`: managed identity client ID of the application the user will authenticate to
by default `"api://AzureADTokenExchange"` is used as the scope for token retrieval over MSI. this token is then exchanged for the actual storage token using `'tenant'` and `'client_id'`. that's the whole handshake, slay. โญ
### ๐ฅ๏ธ Azure CLI tool az
if `use_az` is set, use the Azure CLI tool `az` (https://learn.microsoft.com/en-us/cli/azure/) as the **sole** means of authentication.
setting this can be useful if you wish to use the `az` CLI on a host with a System Managed Identity that you do not want to use.
> don't set `env_auth` at the same time. pick a lane bestie. ๐
### ๐ป Anonymous
if you want to access resources with public anonymous access then set `account` only. and you can do this without even making an rclone config:
rclone lsf :azureblob,account=ACCOUNT:CONTAINER
---
### ๐ Standard options
here are the Standard options specific to `azureblob` (Microsoft Azure Blob Storage). ๐
### `--azureblob-account`
Azure Storage Account Name.
set this to the Azure Storage Account Name in use.
leave blank to use SAS URL or Emulator, otherwise it needs to be set.
if this is blank and if `env_auth` is set it will be read from the environment variable `AZURE_STORAGE_ACCOUNT_NAME` if possible.
**Properties:**
- Config: `account`
- Env Var: `RCLONE_AZUREBLOB_ACCOUNT`
- Type: string
- Required: false
### `--azureblob-env-auth`
Read credentials from runtime (environment variables, CLI or MSI).
see the authentication docs for the full info.
**Properties:**
- Config: `env_auth`
- Env Var: `RCLONE_AZUREBLOB_ENV_AUTH`
- Type: bool
- Default: false
### `--azureblob-key`
Storage Account Shared Key.
leave blank to use SAS URL or Emulator.
**Properties:**
- Config: `key`
- Env Var: `RCLONE_AZUREBLOB_KEY`
- Type: string
- Required: false
### `--azureblob-sas-url`
SAS URL for container level access only.
leave blank if using account/key or Emulator.
**Properties:**
- Config: `sas_url`
- Env Var: `RCLONE_AZUREBLOB_SAS_URL`
- Type: string
- Required: false
### `--azureblob-connection-string`
Storage Connection String.
connection string for the storage. leave blank if using other auth methods.
**Properties:**
- Config: `connection_string`
- Env Var: `RCLONE_AZUREBLOB_CONNECTION_STRING`
- Type: string
- Required: false
### `--azureblob-tenant`
ID of the service principal's tenant. also called its directory ID.
set this if you're using:
- Service principal with client secret
- Service principal with certificate
- User with username and password
**Properties:**
- Config: `tenant`
- Env Var: `RCLONE_AZUREBLOB_TENANT`
- Type: string
- Required: false
### `--azureblob-client-id`
The ID of the client in use.
set this if you're using:
- Service principal with client secret
- Service principal with certificate
- User with username and password
**Properties:**
- Config: `client_id`
- Env Var: `RCLONE_AZUREBLOB_CLIENT_ID`
- Type: string
- Required: false
### `--azureblob-client-secret`
One of the service principal's client secrets
set this if you're using:
- Service principal with client secret
**Properties:**
- Config: `client_secret`
- Env Var: `RCLONE_AZUREBLOB_CLIENT_SECRET`
- Type: string
- Required: false
### `--azureblob-client-certificate-path`
Path to a PEM or PKCS12 certificate file including the private key.
set this if you're using:
- Service principal with certificate
**Properties:**
- Config: `client_certificate_path`
- Env Var: `RCLONE_AZUREBLOB_CLIENT_CERTIFICATE_PATH`
- Type: string
- Required: false
### `--azureblob-client-certificate-password`
Password for the certificate file (optional).
optionally set this if you're using:
- Service principal with certificate
and the certificate has a password.
> NB input to this must be obscured โ see `rclone obscure` (https://rclone.org/commands/rclone_obscure/).
**Properties:**
- Config: `client_certificate_password`
- Env Var: `RCLONE_AZUREBLOB_CLIENT_CERTIFICATE_PASSWORD`
- Type: string
- Required: false
---
### ๐ Advanced options
here are the Advanced options specific to `azureblob` (Microsoft Azure Blob Storage). ๐
### `--azureblob-client-send-certificate-chain`
Send the certificate chain when using certificate auth.
specifies whether an authentication request will include an x5c header to support subject name / issuer based authentication. when set to `true`, authentication requests include the x5c header.
optionally set this if you're using:
- Service principal with certificate
**Properties:**
- Config: `client_send_certificate_chain`
- Env Var: `RCLONE_AZUREBLOB_CLIENT_SEND_CERTIFICATE_CHAIN`
- Type: bool
- Default: false
### `--azureblob-username`
User name (usually an email address)
set this if you're using:
- User with username and password
**Properties:**
- Config: `username`
- Env Var: `RCLONE_AZUREBLOB_USERNAME`
- Type: string
- Required: false
### `--azureblob-password`
The user's password
set this if you're using:
- User with username and password
> NB input to this must be obscured โ see `rclone obscure` (https://rclone.org/commands/rclone_obscure/).
**Properties:**
- Config: `password`
and the rest of that `password` property rundown, because we're thorough like that ๐
:
- Env Var: `RCLONE_AZUREBLOB_PASSWORD`
- Type: string
- Required: false
---
- **`--azureblob-service-principal-file`** โ ๐ณ path to a file that's holding credentials for a <purple>service principal</purple>.
Leave it blank normally, bestie, fr fr. You only need this one if you wanna authenticate with a service principal instead of doing the whole interactive-login thing.
$ az ad sp create-for-rbac --name "<name>" \ --role "Storage Blob Data Owner" \ --scopes "/subscriptions/<subscription>/resourceGroups/<resource-group>/providers/Microsoft.Storage/storageAccounts/<storage-account>/blobServices/default/containers/<container>" \
azure-principal.json
Peep the "Create an Azure service principal" page at https://docs.microsoft.com/en-us/cli/azure/create-an-azure-service-principal-azure-cli and the "Assign an Azure role for access to blob data" page at https://docs.microsoft.com/en-us/azure/storage/common/storage-auth-aad-rbac-cli for all the extra deets โจ
Lowkey it might be way more convenient to just yeet the credentials straight into the rclone config file under the `client_id`, `tenant` and `client_secret` keys instead of setting `service_principal_file`.
Properties:
- Config: `service_principal_file`
- Env Var: `RCLONE_AZUREBLOB_SERVICE_PRINCIPAL_FILE`
- Type: string
- Required: false
---
- **`--azureblob-disable-instance-discovery`** โ ๐ skip requesting Microsoft Entra instance metadata.
Only set this to true if you're an application authenticating in disconnected clouds, or private clouds like <cyan>Azure Stack</cyan>.
It's the thing that decides whether rclone asks for Microsoft Entra instance metadata from https://login.microsoft.com/ before authenticating.
Setting this to true skips that request, which means <hotpink>you</hotpink> are now the one responsible for making sure the configured authority is actually valid and trustworthy. No pressure or anything ๐ญ
Properties:
- Config: `disable_instance_discovery`
- Env Var: `RCLONE_AZUREBLOB_DISABLE_INSTANCE_DISCOVERY`
- Type: bool
- Default: false
---
- **`--azureblob-use-msi`** โ ๐ชช use a managed service identity to authenticate (and heads up: this only works in Azure).
When true, use a managed service identity (https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/) to authenticate to Azure Storage instead of a SAS token or account key.
If the VM(SS) this program is running on has a system-assigned identity, that's the one that gets used by default. If the resource has no system-assigned one but has exactly one user-assigned identity, that user-assigned identity gets used by default. And if the resource has multiple user-assigned identities? Then you have to explicitly say which one to use with exactly one of the `msi_object_id`, `msi_client_id`, or `msi_mi_res_id` parameters. Pick one, bestie, not all three ๐
Properties:
- Config: `use_msi`
- Env Var: `RCLONE_AZUREBLOB_USE_MSI`
- Type: bool
- Default: false
---
- **`--azureblob-msi-object-id`** โ ๐ the Object ID of the user-assigned MSI to use, if any.
Leave it blank if you specified `msi_client_id` or `msi_mi_res_id`.
Properties:
- Config: `msi_object_id`
- Env Var: `RCLONE_AZUREBLOB_MSI_OBJECT_ID`
- Type: string
- Required: false
---
- **`--azureblob-msi-client-id`** โ ๐ the Object ID of the user-assigned MSI to use, if any. (yes it says Object ID, that's literally what it says, don't come for me ๐ธ)
Leave it blank if you specified `msi_object_id` or `msi_mi_res_id`.
Properties:
- Config: `msi_client_id`
- Env Var: `RCLONE_AZUREBLOB_MSI_CLIENT_ID`
- Type: string
- Required: false
---
- **`--azureblob-msi-mi-res-id`** โ ๐ the Azure resource ID of the user-assigned MSI to use, if any.
Leave it blank if you specified `msi_client_id` or `msi_object_id`.
Properties:
- Config: `msi_mi_res_id`
- Env Var: `RCLONE_AZUREBLOB_MSI_MI_RES_ID`
- Type: string
- Required: false
---
- **`--azureblob-use-emulator`** โ ๐งช uses the local storage emulator if you provide it as `'true'`.
Leave it blank if you're using a real Azure storage endpoint, obviously.
Properties:
- Config: `use_emulator`
- Env Var: `RCLONE_AZUREBLOB_USE_EMULATOR`
- Type: bool
- Default: false
---
- **`--azureblob-use-az`** โ ๐ฅ๏ธ use the Azure CLI tool `az` for authentication.
Set this to use the Azure CLI tool `az` (https://learn.microsoft.com/en-us/cli/azure/) as the <rainbow>sole</rainbow> means of authentication.
Setting it can be genuinely useful if you wanna use the `az` CLI on a host that has a System Managed Identity you do *not* want to use. Like, respect the boundaries, host.
Don't set `env_auth` at the same time. They're not friends.
Properties:
- Config: `use_az`
- Env Var: `RCLONE_AZUREBLOB_USE_AZ`
- Type: bool
- Default: false
---
- **`--azureblob-endpoint`** โ ๐ endpoint for the service.
Leave it blank normally.
Properties:
- Config: `endpoint`
- Env Var: `RCLONE_AZUREBLOB_ENDPOINT`
- Type: string
- Required: false
---
- **`--azureblob-upload-cutoff`** โ โ๏ธ cutoff for switching to chunked upload (`<= 256 MiB`) โ <red>deprecated</red>, bestie, it's giving legacy ๐ญ
Properties:
- Config: `upload_cutoff`
- Env Var: `RCLONE_AZUREBLOB_UPLOAD_CUTOFF`
- Type: string
- Required: false
---
- **`--azureblob-chunk-size`** โ ๐ฆ upload chunk size.
> Not me reminding you that this is stored in memory and there may be up to `--transfers` * `--azureblob-upload-concurrency` chunks stored at once in memory. Memory is not infinite, queen ๐
Properties:
- Config: `chunk_size`
- Env Var: `RCLONE_AZUREBLOB_CHUNK_SIZE`
- Type: SizeSuffix
- Default: `4Mi`
---
- **`--azureblob-upload-concurrency`** โ ๐ concurrency for multipart uploads.
This is how many chunks of the <hotpink>same file</hotpink> get uploaded at the same time.
If you're uploading a small number of big files over high-speed links and those uploads aren't fully using your bandwidth, bumping this up may legit speed up your transfers.
In tests, upload speed goes up almost linearly with upload concurrency. Like, to fill a gigabit pipe you might need to raise this to 64. Just know it'll eat more memory.
> And again: chunks are stored in memory, and there may be up to `--transfers` * `--azureblob-upload-concurrency` chunks stored at once in memory. Your RAM is the main character here, protect her ๐ซถ
Properties:
- Config: `upload_concurrency`
- Env Var: `RCLONE_AZUREBLOB_UPLOAD_CONCURRENCY`
- Type: int
- Default: 16
---
- **`--azureblob-copy-cutoff`** โ โ๏ธ cutoff for switching to multipart copy.
Any files bigger than this that need a server-side copy get copied in chunks of `chunk_size` using the put block list API.
Files smaller than this limit get copied with the Copy Blob API. Small file, simple life โจ
Properties:
- Config: `copy_cutoff`
- Env Var: `RCLONE_AZUREBLOB_COPY_CUTOFF`
- Type: SizeSuffix
- Default: `8Mi`
---
- **`--azureblob-copy-concurrency`** โ ๐ concurrency for multipart copy.
This is how many chunks of the same file get copied at the same time.
These chunks are <green>not</green> buffered in memory, and Microsoft recommends setting this value to greater than 1000 in the azcopy documentation.
https://learn.microsoft.com/en-us/azure/storage/common/storage-use-azcopy-optimize#increase-concurrency
In tests, copy speed increases almost linearly with copy concurrency. Iconic behaviour, honestly.
Properties:
- Config: `copy_concurrency`
- Env Var: `RCLONE_AZUREBLOB_COPY_CONCURRENCY`
- Type: int
- Default: 512
---
- **`--azureblob-copy-total-concurrency`** โ ๐๏ธ global concurrency limit for multipart copy chunks.
This caps the total number of multipart copy chunks running at once <purple>across all files</purple>.
Set it to `0` to disable this limiter entirely.
Properties:
- Config: `copy_total_concurrency`
- Env Var: `RCLONE_AZUREBLOB_COPY_TOTAL_CONCURRENCY`
- Type: int
- Default: 0
---
- **`--azureblob-use-copy-blob`** โ ๐ whether to use the Copy Blob API when copying to the same storage account.
If true (and true is the default), rclone uses the Copy Blob API for copies to the same storage account even when the size is above the `copy_cutoff`.
Rclone assumes that "the same storage account" means the same config, and it does <red>not</red> check for the same storage account across different configs. It's trusting like that ๐
There should be no need to change this value.
Properties:
- Config: `use_copy_blob`
- Env Var: `RCLONE_AZUREBLOB_USE_COPY_BLOB`
- Type: bool
- Default: true
---
- **`--azureblob-list-chunk`** โ ๐ size of blob list.
This sets how many blobs get requested in each listing chunk. Default is the maximum, 5000.
"List blobs" requests are permitted 2 minutes per megabyte to complete. If an operation is averaging longer than 2 minutes per megabyte, it will time out (source: https://docs.microsoft.com/en-us/rest/api/storageservices/setting-timeouts-for-blob-service-operations#exceptions-to-default-timeout-interval). So you can use this to limit how many blob items come back, to dodge that timeout.
Properties:
- Config: `list_chunk`
- Env Var: `RCLONE_AZUREBLOB_LIST_CHUNK`
- Type: int
- Default: 5000
---
- **`--azureblob-use-arrow-list`** โ ๐น use the Apache Arrow listing format.
If set, directory listings get fetched using the ListBlobs Apache Arrow response format instead of XML. Arrow responses are smaller and <green>much</green> cheaper to parse, which makes listing huge containers several times faster. Combine it with `list_parallelism` for the biggest gains ๐
"Blob Listing with Apache Arrow" is in public preview at Microsoft and is only supported on flat namespace accounts. On accounts with a hierarchical namespace (ADLS Gen2), or anywhere the feature isn't available, the server hands back XML and the listing transparently falls back to the normal XML path (logged at debug level). No drama, it just quietly pivots ๐
Properties:
- Config: `use_arrow_list`
- Env Var: `RCLONE_AZUREBLOB_USE_ARROW_LIST`
- Type: bool
- Default: false
---
- **`--azureblob-list-parallelism`** โ ๐งต number of parallel shards to list a directory with.
If you set this greater than 1, the blob name keyspace of each directory gets split into ranges which are listed concurrently using the Arrow `startFrom`/`endBefore` range parameters. This can <rainbow>dramatically</rainbow> speed up listing containers with millions of objects, for both recursive (ListR) and single directory listings. Speed keeps improving right up to a parallelism of around 30.
This does nothing unless `use_arrow_list` is also set, because Arrow is the only listing path that supports server-side name ranges. If the account doesn't support range listing (e.g. it has a hierarchical namespace) the listing falls back to sequential. The default of 0 (or 1) lists sequentially.
Properties:
- Config: `list_parallelism`
- Env Var: `RCLONE_AZUREBLOB_LIST_PARALLELISM`
- Type: int
- Default: 0
---
- **`--azureblob-access-tier`** โ ๐ง access tier of blob: `hot`, `cool`, `cold` or `archive`.
Archived blobs can be restored by setting access tier to `hot`, `cool` or `cold`. Leave blank if you intend to use the default access tier, which is set at account level
<pink>okay so</pink> if there is literally no "access tier" specified, rclone does <italic>not</italic> apply any tier at all. none. nada. ๐ซถ
rclone performs the "Set Tier" operation on blobs while uploading, so iykyk โ <purple>if objects are not modified, specifying "access tier" to a new one will have no effect.</purple> and here's the part you actually need to hear:
> ๐จ if blobs are sitting in the `archive tier` over on the remote, and you try to do data transfer operations *from* that remote, it will <red>not be allowed</red>. the user has to first restore by tiering the blob to `Hot`, `Cool`, or `Cold`. periodt.
**The stats ๐
:**
- **Config:** `access_tier`
- **Env Var:** `RCLONE_AZUREBLOB_ACCESS_TIER`
- **Type:** string
- **Required:** false
---
- **`--azureblob-archive-tier-delete`** โ delete archive tier blobs before overwriting.
archive tier blobs <hotpink>cannot</hotpink> be updated, like, ever. so without this flag, if you attempt to update an archive tier blob, rclone will hit you with this error:
can't update archive tier blob without --azureblob-archive-tier-delete
but with this flag set, then before rclone attempts to overwrite an archive tier blob, it will <pink>delete the existing blob first</pink> before uploading its replacement. and bestie, i need you to know this has the potential for **data loss** if the upload fails (unlike updating a normal blob) ๐ and it also may cost more since deleting archive tier blobs early may be chargable. so. yeah. be careful.
**The stats ๐
:**
- **Config:** `archive_tier_delete`
- **Env Var:** `RCLONE_AZUREBLOB_ARCHIVE_TIER_DELETE`
- **Type:** bool
- **Default:** false
---
- **`--azureblob-disable-checksum`** โ don't store MD5 checksum with object metadata.
normally rclone will calculate the MD5 checksum of the input before uploading it, so it can add it to the metadata on the object. this is <green>so slay</green> for data integrity checking but ngl it can cause long delays for large files to start uploading.
**The stats ๐
:**
- **Config:** `disable_checksum`
- **Env Var:** `RCLONE_AZUREBLOB_DISABLE_CHECKSUM`
- **Type:** bool
- **Default:** false
---
- **`--azureblob-encoding`** โ the encoding for the backend.
peep the encoding section in the overview (https://rclone.org/overview/#encoding) for more info. ๐
**The stats ๐
:**
- **Config:** `encoding`
- **Env Var:** `RCLONE_AZUREBLOB_ENCODING`
- **Type:** Encoding
- **Default:** `Slash,BackSlash,Del,Ctl,RightPeriod,InvalidUtf8`
---
- **`--azureblob-public-access`** โ public access level of a container: blob or container.
**The stats ๐
:**
- **Config:** `public_access`
- **Env Var:** `RCLONE_AZUREBLOB_PUBLIC_ACCESS`
- **Type:** string
- **Required:** false
- **The examples โจ:**
- `""`
- the container and its blobs can be accessed only with an authorized request.
- it's the default value.
- `"blob"`
- blob data within this container can be read via anonymous request.
- `"container"`
- allow full public read access for container and blob data.
---
- **`--azureblob-directory-markers`** โ upload an empty object with a trailing slash when a new directory is created.
empty folders are <red>unsupported</red> for bucket based remotes, so this option creates an empty object ending with `/`, to persist the folder. ๐ซถ
this object also has the metadata `hdi_isfolder = true` to conform to the Microsoft standard.
**The stats ๐
:**
- **Config:** `directory_markers`
- **Env Var:** `RCLONE_AZUREBLOB_DIRECTORY_MARKERS`
- **Type:** bool
- **Default:** false
---
- **`--azureblob-no-check-container`** โ if set, don't attempt to check the container exists or create it.
this can be useful when trying to minimise the number of transactions rclone does, if you already *know* the container exists. like, you got this, bestie, no need for the extra check ๐
**The stats ๐
:**
- **Config:** `no_check_container`
- **Env Var:** `RCLONE_AZUREBLOB_NO_CHECK_CONTAINER`
- **Type:** bool
- **Default:** false
---
- **`--azureblob-no-head-object`** โ if set, do not do HEAD before GET when getting objects.
**The stats ๐
:**
- **Config:** `no_head_object`
- **Env Var:** `RCLONE_AZUREBLOB_NO_HEAD_OBJECT`
- **Type:** bool
- **Default:** false
---
- **`--azureblob-delete-snapshots`** โ set to specify how to deal with snapshots on blob deletion.
**The stats ๐
:**
- **Config:** `delete_snapshots`
- **Env Var:** `RCLONE_AZUREBLOB_DELETE_SNAPSHOTS`
- **Type:** string
- **Required:** false
- **The choices ๐:**
- `""`
- by default, the delete operation <red>fails</red> if a blob has snapshots
- `"include"`
- specify `'include'` to remove the root blob **and** all its snapshots
- `"only"`
- specify `'only'` to remove only the snapshots but keep the root blob.
---
- **`--azureblob-decompress`** โ if set this will decompress gzip encoded objects.
it is possible to upload objects to Azure Blob Storage with `"Content-Encoding: gzip"` set. normally rclone will download these files as compressed objects.
but if this flag is set, then rclone will decompress these files with `"Content-Encoding: gzip"` as they are received. which means rclone <hotpink>can't check the size and hash</hotpink> โ but the file contents will be decompressed. so there's a tradeoff, iykyk. ๐ฆ
**The stats ๐
:**
- **Config:** `decompress`
- **Env Var:** `RCLONE_AZUREBLOB_DECOMPRESS`
- **Type:** bool
- **Default:** false
---
- **`--azureblob-description`** โ description of the remote.
**The stats ๐
:**
- **Config:** `description`
- **Env Var:** `RCLONE_AZUREBLOB_DESCRIPTION`
- **Type:** string
- **Required:** false
---
## ๐ธ Metadata ๐ธ
user metadata is stored as `x-ms-meta-` keys. Azure metadata keys are **case insensitive** and are always returned in <purple>lower case</purple>. no cap.
here are the possible system metadata items for the `azureblob` backend ๐
- **`cache-control`** โ Cache-Control header
- **Type:** string
- **Example:** `no-cache`
- **Read Only:** N
- **`content-disposition`** โ Content-Disposition header
- **Type:** string
- **Example:** `inline`
- **Read Only:** N
- **`content-encoding`** โ Content-Encoding header
- **Type:** string
- **Example:** `gzip`
- **Read Only:** N
- **`content-language`** โ Content-Language header
- **Type:** string
- **Example:** `en-US`
- **Read Only:** N
- **`content-type`** โ Content-Type header
- **Type:** string
- **Example:** `text/plain`
- **Read Only:** N
- **`mtime`** โ Time of last modification, read from rclone metadata
- **Type:** RFC 3339
- **Example:** `2006-01-02T15:04:05.999999999Z07:00`
- **Read Only:** N
- **`tier`** โ Tier of the object
- **Type:** string
- **Example:** `Hot`
- **Read Only:** Y
peep the metadata (https://rclone.org/docs/#metadata) docs for more info. ๐
---
## ๐ Custom upload headers ๐
you can set custom upload headers with the `--header-upload` flag. the glow-up list:
- `Cache-Control`
- `Content-Disposition`
- `Content-Encoding`
- `Content-Language`
- `Content-Type`
- `X-MS-Tags`
eg `--header-upload "Content-Type: text/potato"` or `--header-upload "X-MS-Tags: foo=bar"`. โจ
---
## ๐ Limitations ๐
MD5 sums are only uploaded with chunked files **if** the source has an MD5 sum. this will always be the case for a local to azure copy. lowkey convenient.
`rclone about` is <red>not supported</red> by the Microsoft Azure Blob storage backend. backends without this capability cannot determine free space for an rclone mount, or use policy `mfs` (most free space) as a member of an rclone union remote.
see List of backends that do not support rclone about (https://rclone.org/overview/#optional-features) and rclone about (https://rclone.org/commands/rclone_about/).
---
## ๐ง Azure Storage Emulator Support ๐ง
you can run rclone with the storage emulator (usually `azurite`). iconic.
to do this, just set up a new remote with `rclone config` following the instructions in the introduction, and set `use_emulator` in the advanced settings as `true`. you do **not** need to provide a default account name nor an account key. but you *can* override them in the account and key options. (Prior to v1.61 they were hard coded to azurite's `devstoreaccount1`.) ๐
also, if you want to access a storage emulator instance running on a different machine, you can override the `endpoint` parameter in the advanced settings, setting it to `http(s)://<host>:<port>/devstoreaccount1` (e.g. `http://10.254.2.5:10000/devstoreaccount1`).
---
# ๐ Microsoft Azure Files Storage ๐
paths are specified as `remote:` โ and yes bestie, you may put subdirectories in too, e.g. `remote:path/to/dir`. ๐
## ๐ Configuration ๐
here is an example of making a Microsoft Azure Files Storage configuration. for a remote called `remote`. first run:
rclone config
this will guide you through an interactive setup process:
No remotes found, make a new one? n) New remote s) Set configuration password q) Quit config n/s/q> n name> remote Type of storage to configure. Choose a number from below, or type in your own value [snip] XX / Microsoft Azure Files Storage \ "azurefiles" [snip]
Option account. Azure Storage Account Name. Set this to the Azure Storage Account Name in use. Leave blank to use SAS URL or connection string, otherwise it needs to be set. If this is blank and if env_auth is set it will be read from the environment variable AZURE_STORAGE_ACCOUNT_NAME if possible. Enter a value. Press Enter to leave empty. account> account_name
Option share_name. Azure Files Share Name. This is required and is the name of the share to access. Enter a value. Press Enter to leave empty. share_name> share_name
Option env_auth. Read credentials from runtime (environment variables, CLI or MSI). See the [authentication docs](/azurefiles#authentication) for full info. Enter a boolean value (true or false). Press Enter for the default (false). env_auth>
Option key. Storage Account Shared Key. Leave blank to use SAS URL or connection string. Enter a value. Press Enter to leave empty. key> base64encodedkey==
Option sas_url. SAS URL. Leave blank if using account/key or connection string. Enter a value. Press Enter to leave empty. sas_url>
Option connection_string. Azure Files Connection String. Enter a value. Press Enter to leave empty. connection_string> [snip]
Configuration complete. Options:
- type: azurefiles
- account: account_name
- share_name: share_name
- key: base64encodedkey== Keep this "remote" remote? y) Yes this is OK (default) e) Edit this remote d) Delete this remote y/e/d>
Once you've done all that config-ing, bestie, you can actually *use* rclone. Let's go ๐
See every file chilling at the top level:
rclone lsf remote:
Make a brand new directory in the root:
rclone mkdir remote:dir
Recursively list the contents:
rclone ls remote:
Sync `/home/local/directory` up to the remote directory, and <red>delete any excess files in the directory</red> (yes, it really deletes them, no cap, be careful ๐):
rclone sync --interactive /home/local/directory remote:dir
---
### Modified time ๐ฐ๏ธ
The modified time is stored as the SMB `LastWriteTime` property on files. It has a precision of `100 ns`. Like, it's *precise* precise โจ
---
### Performance ๐
When you're uploading large files, cranking up the value of `--azurefiles-upload-concurrency` will bump your performance โ at the cost of using more memory. The default of `16` is set quite conservatively so it uses less memory. It maybe be necessary raise it to `64` or higher to fully utilize a `1 GBit/s` link with a single file transfer.
> ngl, that "maybe be" is straight from the original, we're not fixing it, it's iconic ๐
---
### Restricted filename characters ๐ซ
On top of the default restricted characters set (`https://rclone.org/overview/#restricted-characters`), these characters also get swapped out:
- `"` โ value `0x22`, replaced with `๏ผ`
- `*` โ value `0x2A`, replaced with `๏ผ`
- `:` โ value `0x3A`, replaced with `๏ผ`
- `<` โ value `0x3C`, replaced with `๏ผ`
- `>` โ value `0x3E`, replaced with `๏ผ`
- `?` โ value `0x3F`, replaced with `๏ผ`
- `\` โ value `0x5C`, replaced with `๏ผผ`
- `|` โ value `0x7C`, replaced with `๏ฝ`
File names also can't *end* with the following character. These only get replaced if they are the last character in the name:
- `.` โ value `0x2E`, replaced with `๏ผ`
Invalid UTF-8 bytes will also be replaced (`https://rclone.org/overview/#invalid-utf8`), because they literally can't be used in JSON strings. Sorry babe ๐ธ
---
### Hashes ๐
MD5 hashes are stored with files. But not *all* files will have MD5 hashes, because these have to be uploaded along with the file.
---
### Authentication ๐ชช
There are a whole bunch of ways of supplying credentials for Azure Files Storage. Rclone tries them in the order of the sections below, so like, first one that works wins ๐
---
### Env Auth ๐ฑ
If the `env_auth` config parameter is `true` then rclone will pull credentials from the environment or runtime.
It tries these authentication methods in this order:
1. Environment Variables
2. Managed Service Identity Credentials
3. Azure CLI credentials (as used by the `az` tool)
These are described in the following sections ๐
---
### Env Auth: 1. Environment Variables ๐
If `env_auth` is set and environment variables are present, rclone authenticates a service principal with a secret or certificate, or a user with a password โ depends on which environment variables are set. It reads configuration from these variables, in the following order:
1. Service principal with client secret
- `AZURE_TENANT_ID`: ID of the service principal's tenant. Also called its "directory" ID.
- `AZURE_CLIENT_ID`: the service principal's client ID
- `AZURE_CLIENT_SECRET`: one of the service principal's client secrets
2. Service principal with certificate
- `AZURE_TENANT_ID`: ID of the service principal's tenant. Also called its "directory" ID.
- `AZURE_CLIENT_ID`: the service principal's client ID
- `AZURE_CLIENT_CERTIFICATE_PATH`: path to a PEM or PKCS12 certificate file including the private key.
- `AZURE_CLIENT_CERTIFICATE_PASSWORD`: (optional) password for the certificate file.
- `AZURE_CLIENT_SEND_CERTIFICATE_CHAIN`: (optional) Specifies whether an authentication request will include an x5c header to support subject name / issuer based authentication. When set to `"true"` or `"1"`, authentication requests include the x5c header.
3. User with username and password
- `AZURE_TENANT_ID`: (optional) tenant to authenticate in. Defaults to `"organizations"`.
- `AZURE_CLIENT_ID`: client ID of the application the user will authenticate to
- `AZURE_USERNAME`: a username (usually an email address)
- `AZURE_PASSWORD`: the user's password
4. Workload Identity
- `AZURE_TENANT_ID`: Tenant to authenticate in
- `AZURE_CLIENT_ID`: Client ID of the application the user will authenticate to
- `AZURE_FEDERATED_TOKEN_FILE`: Path to projected service account token file
- `AZURE_AUTHORITY_HOST`: Authority of an Azure Active Directory endpoint (default: `login.microsoftonline.com`).
---
### Env Auth: 2. Managed Service Identity Credentials ๐
When using Managed Service Identity, if the VM(SS) on which this program is running has a system-assigned identity, it will be used by default. If the resource has no system-assigned but exactly one user-assigned identity, that user-assigned identity will be used by default.
If the resource has multiple user-assigned identities you will need to unset `env_auth` and set `use_msi` instead. See the `use_msi` section.
If you're operating in disconnected clouds, or private clouds such as Azure Stack, you may want to set `disable_instance_discovery = true`. This determines whether rclone requests Microsoft Entra instance metadata from `https://login.microsoft.com/` before authenticating. Setting this to `true` skips that request โ which makes *you* responsible for making sure the configured authority is valid and trustworthy. ๐
---
### Env Auth: 3. Azure CLI credentials (as used by the `az` tool) ๐ฅ๏ธ
Credentials created with the `az` tool can be picked up using `env_auth`.
So for example, if you were to login with a service principal like this:
az login --service-principal -u XXX -p XXX --tenant XXX
Then you could access rclone resources like this:
rclone lsf :azurefiles,env_auth,account=ACCOUNT:
Or:
rclone lsf --azurefiles-env-auth --azurefiles-account=ACCOUNT :azurefiles:
---
### Account and Shared Key ๐
This is the most straight forward and least flexible way. Just fill in the `account` and `key` lines and leave the rest blank. Simple, clean, no drama โจ
---
### SAS URL ๐
To use it, leave `account`, `key` and `connection_string` blank and fill in `sas_url`.
---
### Connection String ๐งต
To use it, leave `account`, `key` and `"sas_url"` blank and fill in `connection_string`.
---
### Service principal with client secret ๐คซ
If these variables are set, rclone will authenticate with a service principal with a client secret.
- `tenant`: ID of the service principal's tenant. Also called its "directory" ID.
- `client_id`: the service principal's client ID
- `client_secret`: one of the service principal's client secrets
The credentials can also be placed in a file using the `service_principal_file` configuration option.
---
### Service principal with certificate ๐
If these variables are set, rclone will authenticate with a service principal with certificate.
- `tenant`: ID of the service principal's tenant. Also called its "directory" ID.
- `client_id`: the service principal's client ID
- `client_certificate_path`: path to a PEM or PKCS12 certificate file including the private key.
- `client_certificate_password`: (optional) password for the certificate file.
- `client_send_certificate_chain`: (optional) Specifies whether an authentication request will include an x5c header to support subject name / issuer based authentication. When set to `"true"` or `"1"`, authentication requests include the x5c header.
> <red>NB</red> `client_certificate_password` must be obscured โ see rclone obscure (`https://rclone.org/commands/rclone_obscure/`). Do not skip this bestie, fr fr ๐ญ
---
### User with username and password ๐โโ๏ธ
If these variables are set, rclone will authenticate with username and password.
- `tenant`: (optional) tenant to authenticate in. Defaults to `"organizations"`.
- `client_id`: client ID of the application the user will authenticate to
- `username`: a username (usually an email address)
- `password`: the user's password
Microsoft doesn't recommend this kind of authentication, because it's less secure than other authentication flows. This method is not interactive, so it isn't compatible with any form of multi-factor authentication, and the application must already have user or admin consent. This credential can only authenticate work and school accounts; it can't authenticate Microsoft accounts.
> <red>NB</red> `password` must be obscured โ see rclone obscure (`https://rclone.org/commands/rclone_obscure/`). ๐
---
### Managed Service Identity Credentials ๐ชช
If `use_msi` is set then managed service identity credentials are used. This authentication only works when running in an Azure service. `env_auth` needs to be unset to use this.
However, if you have multiple user identities to choose from, these must be explicitly specified using exactly one of the `msi_object_id`, `msi_client_id`, or `msi_mi_res_id` parameters.
If none of `msi_object_id`, `msi_client_id`, or `msi_mi_res_id` is set, this is equivalent to using `env_auth`.
---
### Federated Identity Credentials ๐ค
If these variables are set, rclone will authenticate with federated identity.
- `tenant`: tenant ID of the storage
- `client_id`: client ID of the application the user will authenticate to storage
- `msi_client_id`: managed identity client ID of the application the user will authenticate to
By default `"api://AzureADTokenExchange"` is used as scope for token retrieval over MSI. This token is then exchanged for actual storage token using `'tenant'` and `'client_id'`. Cute little token swap, we love to see it ๐ซถ
---
### Azure CLI tool az ๐ ๏ธ
If `use_az` is set, use Azure CLI tool `az` (`https://learn.microsoft.com/en-us/cli/azure/`) as the sole means of authentication.
Setting this can be useful if you wish to use the `az` CLI on a host with a System Managed Identity that you do *not* want to use.
> Don't set `env_auth` at the same time. Like, just don't ๐
---
### Standard options โญ
Here are the Standard options specific to `azurefiles` (Microsoft Azure Files).
---
#### `--azurefiles-account`
Azure Storage Account Name.
Set this to the Azure Storage Account Name in use.
Leave blank to use SAS URL or Emulator, otherwise it needs to be set.
If this is blank and if `env_auth` is set it will be read from the environment variable `AZURE_STORAGE_ACCOUNT_NAME` if possible.
Properties:
- Config: `account`
- Env Var: `RCLONE_AZUREFILES_ACCOUNT`
- Type: `string`
- Required: `false`
---
#### `--azurefiles-env-auth`
Read credentials from runtime (environment variables, CLI or MSI).
See the authentication docs for full info.
Properties:
- Config: `env_auth`
- Env Var: `RCLONE_AZUREFILES_ENV_AUTH`
- Type: bool
- Default: false
---
- **`--azurefiles-key`** โ the Storage Account Shared Key ๐ leave this blank if you're rolling with a SAS URL or the Emulator instead.
Properties:
- Config: `key`
- Env Var: `RCLONE_AZUREFILES_KEY`
- Type: string
- Required: false
- **`--azurefiles-sas-url`** โ SAS URL, and it's for <hotpink>container level access only</hotpink> bestie. Leave it blank if you're using account/key or the Emulator.
Properties:
- Config: `sas_url`
- Env Var: `RCLONE_AZUREFILES_SAS_URL`
- Type: string
- Required: false
- **`--azurefiles-connection-string`** โ the Storage Connection String. Like, connection string for the storage, periodt. Leave it blank if you're using other auth methods.
Properties:
- Config: `connection_string`
- Env Var: `RCLONE_AZUREFILES_CONNECTION_STRING`
- Type: string
- Required: false
- **`--azurefiles-tenant`** โ the ID of the service principal's tenant ๐ it's also called its directory ID. Set this if you're using:
- Service principal with client secret
- Service principal with certificate
- User with username and password
Properties:
- Config: `tenant`
- Env Var: `RCLONE_AZUREFILES_TENANT`
- Type: string
- Required: false
- **`--azurefiles-client-id`** โ the ID of the client you're using. Set this if you're using:
- Service principal with client secret
- Service principal with certificate
- User with username and password
Properties:
- Config: `client_id`
- Env Var: `RCLONE_AZUREFILES_CLIENT_ID`
- Type: string
- Required: false
- **`--azurefiles-client-secret`** โ one of the service principal's client secrets ๐คซ Set this if you're using:
- Service principal with client secret
Properties:
- Config: `client_secret`
- Env Var: `RCLONE_AZUREFILES_CLIENT_SECRET`
- Type: string
- Required: false
- **`--azurefiles-client-certificate-path`** โ path to a PEM or PKCS12 certificate file, private key included ๐ Set this if you're using:
- Service principal with certificate
Properties:
- Config: `client_certificate_path`
- Env Var: `RCLONE_AZUREFILES_CLIENT_CERTIFICATE_PATH`
- Type: string
- Required: false
- **`--azurefiles-client-certificate-password`** โ password for the certificate file (optional). Optionally set this if you're using:
- Service principal with certificate
And the certificate has a password, obviously ๐
> NB: input to this <red>must</red> be obscured โ see `rclone obscure` (`https://rclone.org/commands/rclone_obscure/`).
Properties:
- Config: `client_certificate_password`
- Env Var: `RCLONE_AZUREFILES_CLIENT_CERTIFICATE_PASSWORD`
- Type: string
- Required: false
- **`--azurefiles-share-name`** โ the Azure Files Share Name ๐ฆ this one is <hotpink>required</hotpink> and it's literally the name of the share you wanna access.
Properties:
- Config: `share_name`
- Env Var: `RCLONE_AZUREFILES_SHARE_NAME`
- Type: string
- Required: false
---
### โจ Advanced options โจ
Here are the Advanced options specific to azurefiles (Microsoft Azure Files) ๐
---
- **`--azurefiles-client-send-certificate-chain`** โ send the certificate chain when you're using certificate auth โ๏ธ it specifies whether an authentication request will include an x5c header to support subject name / issuer based authentication. When it's set to `true`, the auth requests include that x5c header.
Optionally set this if you're using:
- Service principal with certificate
Properties:
- Config: `client_send_certificate_chain`
- Env Var: `RCLONE_AZUREFILES_CLIENT_SEND_CERTIFICATE_CHAIN`
- Type: bool
- Default: false
- **`--azurefiles-username`** โ user name (usually an email address) ๐ง Set this if you're using:
- User with username and password
Properties:
- Config: `username`
- Env Var: `RCLONE_AZUREFILES_USERNAME`
- Type: string
- Required: false
- **`--azurefiles-password`** โ the user's password ๐ Set this if you're using:
- User with username and password
> NB: input to this <red>must</red> be obscured โ see `rclone obscure` (`https://rclone.org/commands/rclone_obscure/`).
Properties:
- Config: `password`
- Env Var: `RCLONE_AZUREFILES_PASSWORD`
- Type: string
- Required: false
- **`--azurefiles-service-principal-file`** โ path to a file containing credentials for use with a service principal. Leave it blank normally, you only need it if you wanna use a service principal instead of interactive login.
$ az ad sp create-for-rbac --name "<name>" \ --role "Storage Blob Data Owner" \ --scopes "/subscriptions/<subscription>/resourceGroups/<resource-group>/providers/Microsoft.Storage/storageAccounts/<storage-account>/blobServices/default/containers/<container>" \
azure-principal.json
Check out the "Create an Azure service principal" (`https://docs.microsoft.com/en-us/cli/azure/create-an-azure-service-principal-azure-cli`) and "Assign an Azure role for access to blob data" (`https://docs.microsoft.com/en-us/azure/storage/common/storage-auth-aad-rbac-cli`) pages for more deets ๐
Ngl it may be more convenient to just shove the credentials directly into the rclone config file under the `client_id`, `tenant` and `client_secret` keys instead of setting `service_principal_file` ๐
Properties:
- Config: `service_principal_file`
- Env Var: `RCLONE_AZUREFILES_SERVICE_PRINCIPAL_FILE`
- Type: string
- Required: false
- **`--azurefiles-disable-instance-discovery`** โ skip requesting Microsoft Entra instance metadata ๐ this should be set `true` *only* by applications authenticating in disconnected clouds, or private clouds such as Azure Stack.
It decides whether rclone requests Microsoft Entra instance metadata from `https://login.microsoft.com/` before authenticating.
Setting this to `true` will skip that request, which makes <red>you</red> responsible for making sure the configured authority is valid and trustworthy. No pressure bestie ๐ญ
Properties:
- Config: `disable_instance_discovery`
- Env Var: `RCLONE_AZUREFILES_DISABLE_INSTANCE_DISCOVERY`
- Type: bool
- Default: false
- **`--azurefiles-use-msi`** โ use a managed service identity to authenticate (only works in Azure, iykyk โ๏ธ). When `true`, use a managed service identity (`https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/`) to authenticate to Azure Storage instead of a SAS token or account key.
If the VM(SS) this program is running on has a system-assigned identity, it'll be used by default. If the resource has no system-assigned identity but has exactly *one* user-assigned identity, that user-assigned identity gets used by default. And if the resource has multiple user-assigned identities, the one to use must be explicitly specified using exactly one of the `msi_object_id`, `msi_client_id`, or `msi_mi_res_id` parameters.
Properties:
- Config: `use_msi`
- Env Var: `RCLONE_AZUREFILES_USE_MSI`
- Type: bool
- Default: false
- **`--azurefiles-msi-object-id`** โ Object ID of the user-assigned MSI to use, if any. Leave it blank if `msi_client_id` or `msi_mi_res_id` is specified.
Properties:
- Config: `msi_object_id`
- Env Var: `RCLONE_AZUREFILES_MSI_OBJECT_ID`
- Type: string
- Required: false
- **`--azurefiles-msi-client-id`** โ Object ID of the user-assigned MSI to use, if any. Leave it blank if `msi_object_id` or `msi_mi_res_id` is specified.
Properties:
- Config: `msi_client_id`
- Env Var: `RCLONE_AZUREFILES_MSI_CLIENT_ID`
- Type: string
- Required: false
- **`--azurefiles-msi-mi-res-id`** โ Azure resource ID of the user-assigned MSI to use, if any. Leave it blank if `msi_client_id` or `msi_object_id` is specified.
Properties:
- Config: `msi_mi_res_id`
- Env Var: `RCLONE_AZUREFILES_MSI_MI_RES_ID`
- Type: string
- Required: false
- **`--azurefiles-use-emulator`** โ uses the local storage emulator if you provide it as `'true'` ๐ฅ๏ธ Leave it blank if you're using a real azure storage endpoint.
Properties:
- Config: `use_emulator`
- Env Var: `RCLONE_AZUREFILES_USE_EMULATOR`
- Type: bool
- Default: false
- **`--azurefiles-use-az`** โ use the Azure CLI tool `az` for authentication โจ Set this to use the Azure CLI tool `az` (`https://learn.microsoft.com/en-us/cli/azure/`) as the *sole* means of authentication.
Setting this can be useful if you wanna use the `az` CLI on a host with a System Managed Identity that you do <italic>not</italic> want to use.
> Don't set `env_auth` at the same time, bestie โ that's not the vibe ๐
Properties:
- Config: `use_az`
- Env Var: `RCLONE_AZUREFILES_USE_AZ`
- Type: bool
- Default: false
- **`--azurefiles-endpoint`** โ endpoint for the service. Leave it blank normally, fr fr.
Properties:
- Config: `endpoint`
- Env Var: `RCLONE_AZUREFILES_ENDPOINT`
- Type: string
- Required: false
- **`--azurefiles-chunk-size`** โ the upload chunk size ๐งฉ heads up that this is stored in memory, so there may be up to `"--transfers"` * `"--azurefile-upload-concurrency"` chunks stored at once in memory. Plan accordingly, okay? ๐ญ
Properties:
- Config: `chunk_size`
- Env Var: `RCLONE_AZUREFILES_CHUNK_SIZE`
- Type: SizeSuffix
- Default: `4Mi`
- **`--azurefiles-upload-concurrency`** โ concurrency for multipart uploads ๐ฅ this is the number of chunks of the *same* file that get uploaded concurrently.
If you're uploading small numbers of large files over high-speed links and those uploads aren't fully using your bandwidth, then bumping this up may help speed up the transfers ๐
Note that chunks are stored in memory and there may be up to `"--transfers"` * `"--azurefile-upload-concurrency"` chunks stored at once in memory.
Properties:
- Config: `upload_concurrency`
- Env Var: `RCLONE_AZUREFILES_UPLOAD_CONCURRENCY`
- Type: int
- Default: `16`
- **`--azurefiles-max-stream-size`** โ max size for streamed files ๐ฆ Azure files needs to know in advance how big the file's gonna be. When rclone doesn't know, it uses this value instead.
This gets used when rclone is streaming data, and the most common uses are:
- Uploading files with `--vfs-cache-mode off` with `rclone mount`
- Using `rclone rcat`
- Copying files with unknown length
You'll need this much free space in the share, because the file will be this size temporarily ๐
Properties:
- Config: `max_stream_size`
- Env Var: `RCLONE_AZUREFILES_MAX_STREAM_SIZE`
- Type: SizeSuffix
- Default: `10Gi`
- **`--azurefiles-encoding`** โ the encoding for the backend ๐ see the encoding section in the overview (`https://rclone.org/overview/#encoding`) for more info.
Properties:
- Config: `encoding`
- Env Var: `RCLONE_AZUREFILES_ENCODING`
- Type: Encoding
- Default: `Slash,LtGt,DoubleQuote,Colon,Question,Asterisk,Pipe,BackSlash,Del,Ctl,RightPeriod,InvalidUtf8,Dot`
- **`--azurefiles-description`** โ description of the remote ๐ท๏ธ
Properties:
- Config: `description`
- Env Var: `RCLONE_AZUREFILES_DESCRIPTION`
- Type: string
- Required: false
## ๐ Custom upload headers
You can set custom upload headers with the `--header-upload` flag. Yes bestie, you get to decorate your uploads ๐
- Cache-Control
- Content-Disposition
- Content-Encoding
- Content-Language
- Content-Type
Example, she's serving potato: `--header-upload "Content-Type: text/potato"`
## ๐ซถ Limitations
MD5 sums are only uploaded with chunked files if the source has an MD5 sum. This will always be the case for a local to azure copy. That's just the way it is, no cap.
---
# ๐ Microsoft OneDrive
Paths are specified as `remote:path`
Paths may be as deep as required, e.g. `remote:directory/subdirectory`. Go as deep as your little heart desires, it does not care. ๐
## โจ Configuration
The initial setup for OneDrive involves getting a token from Microsoft which you need to do in your browser. `rclone config` walks you through it, hand in hand, like a good bestie. ๐ซถ
Here is an example of how to make a remote called `remote`. First run:
rclone config
This will guide you through an interactive setup process:
e) Edit existing remote n) New remote d) Delete remote r) Rename remote c) Copy remote s) Set configuration password q) Quit config e/n/d/r/c/s/q> n name> remote Type of storage to configure. Enter a string value. Press Enter for the default (""). Choose a number from below, or type in your own value [snip] XX / Microsoft OneDrive \ "onedrive" [snip] Storage> onedrive Microsoft App Client Id Leave blank normally. Enter a string value. Press Enter for the default (""). client_id> Microsoft App Client Secret Leave blank normally. Enter a string value. Press Enter for the default (""). client_secret> Edit advanced config? (y/n) y) Yes n) No y/n> n Remote config Use web browser to automatically authenticate rclone with remote?
- Say Y if the machine running rclone has a web browser you can use
- Say N if running rclone on a (remote) machine without web browser access If not sure try Y. If Y failed, try N. y) Yes n) No y/n> y If your browser doesn't open automatically go to the following link: http://127.0.0.1:53682/auth Log in and authorize rclone for access Waiting for code... Got code Choose a number from below, or type in an existing value 1 / OneDrive Personal or Business \ "onedrive" 2 / Sharepoint site \ "sharepoint" 3 / Type in driveID \ "driveid" 4 / Type in SiteID \ "siteid" 5 / Search a Sharepoint site \ "search" Your choice> 1 Found 1 drives, please select the one you want to use: 0: OneDrive (business) id=b!Eqwertyuiopasdfghjklzxcvbnm-7mnbvcxzlkjhgfdsapoiuytrewqk Chose drive to use:> 0 Found drive 'root' of type 'business', URL: https://org-my.sharepoint.com/personal/you/Documents Is that okay? y) Yes n) No y/n> y Configuration complete. Options:
- type: onedrive
- token: {"access_token":"youraccesstoken","token_type":"Bearer","refresh_token":"yourrefreshtoken","expiry":"2018-08-26T22:39:52.486512262+08:00"}
- drive_id: b!Eqwertyuiopasdfghjklzxcvbnm-7mnbvcxzlkjhgfdsapoiuytrewqk
- drive_type: business Keep this "remote" remote? y) Yes this is OK e) Edit this remote d) Delete this remote y/e/d> y
See the remote setup docs (https://rclone.org/remote_setup/) for how to set it up on a machine without an internet-connected web browser available. No browser, no problem, there's a whole guide. ๐
Note that rclone runs a webserver on your local machine to collect the token as returned from Microsoft. This only runs from the moment it opens your browser to the moment you get back the verification code. This is on `http://127.0.0.1:53682/` and this it may require you to unblock it temporarily if you are running a host firewall. Lowkey important, so peek at your firewall if things are acting weird. ๐ฅ
Once configured you can then use rclone like this (replace `remote` with the name you gave your remote):
List directories in top level of your OneDrive
rclone lsd remote:
List all the files in your OneDrive
rclone ls remote:
To copy a local directory to an OneDrive directory called `backup`
rclone copy /home/source remote:backup
## ๐ฆ Getting your own Client ID and Key
rclone uses a default Client ID when talking to OneDrive, unless a custom `client_id` is specified in the config. The default Client ID and Key are shared by all rclone users when performing requests. It's giving community pool energy. ๐
You may choose to create and use your own Client ID, in case the default one does not work well for you. For example, you might see throttling. If the shared one is being a hater, go make your own. ๐
## ๐ธ Creating Client ID for OneDrive Personal
To create your own Client ID, please follow these steps:
1. Open <https://portal.azure.com/?quickstart=true#view/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/~/Overview> and then under the Add menu click App registration.
- If you have not created an Azure account, you will be prompted to. This is free, but you need to provide a phone number, address, and credit card for identity verification.
2. Enter a name for your app, choose account type Accounts in any organizational directory (Any Azure AD directory - Multitenant) and personal Microsoft accounts (e.g. Skype, Xbox), select Web in Redirect URI, then type (do not copy and paste) `http://localhost:53682/` and click Register. Copy and keep the Application (client) ID under the app name for later use.
> <red>Do not copy and paste that redirect URI โ actually *type* it.</red> Microsoft is picky like that, sorry bestie. ๐ญ
3. Under manage select Certificates & secrets, click New client secret. Enter a description (can be anything) and set Expires to 24 months. Copy and keep that secret Value for later use (you won't be able to see this value afterwards). Screenshot it, write it on your hand, do whatever โ it's gone after. ๐
4. Under manage select API permissions, click Add a permission and select Microsoft Graph then select delegated permissions.
5. Search and select the following permissions: Files.Read, Files.ReadWrite, Files.Read.All, Files.ReadWrite.All, offline_access, User.Read and Sites.Read.All (if custom access scopes are configured, select the permissions accordingly). Once selected click Add permissions at the bottom.
Now the application is complete. Run `rclone config` to create or edit a OneDrive remote. Supply the app ID and password as Client ID and Secret, respectively. rclone will walk you through the remaining steps. Slay. ๐
The `access_scopes` option allows you to configure the permissions requested by rclone. See Microsoft Docs (https://docs.microsoft.com/en-us/graph/permissions-reference#files-permissions) for more information about the different scopes.
The `Sites.Read.All` permission is required if you need to search SharePoint sites when configuring the remote (https://github.com/rclone/rclone/pull/5883). However, if that permission is not assigned, you need to exclude `Sites.Read.All` from your access scopes or set `disable_site_permission` option to `true` in the advanced options. Pick your fighter, both work. โจ
## ๐ Creating Client ID for OneDrive Business
The steps for OneDrive Personal may or may not work for OneDrive Business, depending on the security settings of the organization. A common error is that the publisher of the App is not verified. It's not you, it's the org's security settings being extra. ๐
You may try to verify you account (https://docs.microsoft.com/en-us/azure/active-directory/develop/publisher-verification-overview), or try to limit the App to your organization only, as shown below.
1. Make sure to create the App with your business account.
2. Follow the steps above to create an App. However, we need a different account type here: Accounts in this organizational directory only (*** - Single tenant). Note that you can also change the account type after creating the App.
3. Find the tenant ID (https://docs.microsoft.com/en-us/azure/active-directory/fundamentals/active-directory-how-to-find-tenant) of your organization.
4. In the rclone config, set `auth_url` to `https://login.microsoftonline.com/YOUR_TENANT_ID/oauth2/v2.0/authorize`.
5. In the rclone config, set `token_url` to `https://login.microsoftonline.com/YOUR_TENANT_ID/oauth2/v2.0/token`.
Note: If you have a special region, you may need a different host in step 4 and 5. Here are some hints (https://github.com/rclone/rclone/blob/bc23bf11db1c78c6ebbf8ea538fbebf7058b4176/backend/onedrive/onedrive.go#L86). iykyk, the source code always knows. ๐
## ๐ Using OAuth Client Credential flow
OAuth Client Credential flow will allow rclone to use permissions directly associated with the Azure AD Enterprise application, rather that adopting the context of an Azure AD user account. Yeah, it's main character app energy instead of borrowing your user's whole personality. ๐
This flow can be enabled by following the steps below:
1. Create the Enterprise App registration in the Azure AD portal and obtain a Client ID and Client Secret as described above.
2. Ensure that the application has the appropriate permissions and they are assigned as Application Permissions
3. Configure the remote, ensuring that Client ID and Client Secret are entered correctly.
4. In the Advanced Config section, enter `true` for `client_credentials` and in the tenant section enter the tenant ID.
When it comes to choosing the type of the connection work with the client credentials flow. In particular the "onedrive" option does not work. You can use the "sharepoint" option or if that does not find the correct drive ID type it in manually with the "driveid" option. <red>Heads up: the `onedrive` option is a no-go here.</red>
To back up any user's data using this flow, grant your Azure AD application the necessary Microsoft Graph Application permissions (such as Files.Read.All, Sites.Read.All and/or Sites.Selected). With these permissions, rclone can access drives across the tenant, but it needs to know which user or drive you want. Supply a specific `drive_id` corresponding to that user's OneDrive, or a SharePoint site ID for SharePoint libraries. You can obtain a user's drive ID using Microsoft Graph (e.g. `/users/{userUPN}/drive`) and then configure it in rclone. Once the correct drive ID is provided, rclone will back up that user's data using the app-only token without requiring their credentials. Fr fr, no user login needed at all. ๐ณ
> <hotpink>NOTE</hotpink> Assigning permissions directly to the application means that anyone with the Client ID and Client Secret can access your OneDrive files. Take care to safeguard these credentials. <red>Seriously, guard them like your life depends on it โ that's the whole key to the castle.</red> ๐ซถ๐
### ๐ฆ Non-admin access to Business OneDrive ๐ฆ
Okay so bestie, if you do **not** have admin access to your org's OneDrive for Business, you can still slide in there โ you just have to manually hand over the SharePoint tenant URL and drive ID. How does that even work? It overrides the base API URL, swapping the standard Microsoft Graph endpoint out for the SharePoint v2.0 endpoint. Sneaky but effective, no cap. ๐
### ๐ Steps to manually obtain credentials ๐
1. Open your browser and navigate to `https://[your-tenant].sharepoint.com/`
2. Open Developer Tools (press <kbd>F12</kbd>) and go to the Network tab.
3. Search for `driveAccessToken` in the network requests.
4. Extract the following information from the response:
".driveUrl": "{tenant_url}/v2.0/drives/{drive_id}", ".driveAccessToken": "access_token={access_token}"
### โ๏ธ Rclone configuration โ๏ธ
Now take those extracted values and use them to configure your remote:
type = onedrive token = {"access_token":"{access_token}","token_type":"Bearer","refresh_token":"","expiry":"2045-12-31T23:59:59Z"} drive_id = {drive_id} tenant_url = {tenant_url} drive_type = business
Quick heads up: since the exact expiry time cannot be determined from web traffic, set the expiry to a future date. Fair warning though โ that token will eventually expire and you will need to repeat the whole process to obtain a new one. Annoying, I know. ๐ญ
### ๐ Modification times and hashes ๐
OneDrive allows modification times to be set on objects accurate to **1 second**. These will be used to detect whether objects need syncing or not.
OneDrive Personal, OneDrive for Business and Sharepoint Server support QuickXorHash (<https://docs.microsoft.com/en-us/onedrive/developer/code-snippets/quickxorhash>).
Before rclone `1.62` the default hash for Onedrive Personal was `SHA1`. For rclone `1.62` and above the default for all Onedrive backends is `QuickXorHash`. Glow up era. โจ
Starting from July 2023 `SHA1` support is being phased out in Onedrive Personal in favour of `QuickXorHash`. If necessary the `--onedrive-hash-type` flag (or `hash_type` config option) can be used to select `SHA1` during the transition period if this is important your workflow.
For all types of OneDrive you can use the `--checksum` flag.
### โก --fast-list โก
This remote supports `--fast-list` which allows you to use fewer transactions in exchange for more memory. See the rclone docs (<https://rclone.org/docs/#fast-list>) for more details.
This must be enabled with the `--onedrive-delta` flag (or `delta = true` in the config file) as it can cause performance degradation. โ ๏ธ
It does this by using the delta listing facilities of OneDrive which returns all the files in the remote very efficiently. This is much more efficient than listing directories recursively and is Microsoft's recommended way of reading all the file information from a drive. Iconic behaviour honestly. ๐
This can be useful with `rclone mount` and `rclone rc vfs/refresh recursive=true` (<https://rclone.org/rc/#vfs-refresh>)) to very quickly fill the mount with information about all the files.
The API used for the recursive listing (`ListR`) only supports listing from the root of the drive. This will become increasingly inefficient the further away you get from the root as rclone will have to discard files outside of the directory you are using. ๐ฅฒ
Some commands (like `rclone lsf -R`) will use `ListR` by default - you can turn this off with `--disable ListR` if you need to.
### ๐ซ Restricted filename characters ๐ซ
In addition to the default restricted characters set (<https://rclone.org/overview/#restricted-characters>) the following characters are also replaced:
- Character `"`, Value `0x22`, Replacement `๏ผ`
- Character `*`, Value `0x2A`, Replacement `๏ผ`
- Character `:`, Value `0x3A`, Replacement `๏ผ`
- Character `<`, Value `0x3C`, Replacement `๏ผ`
- Character `>`, Value `0x3E`, Replacement `๏ผ`
- Character `?`, Value `0x3F`, Replacement `๏ผ`
- Character `\`, Value `0x5C`, Replacement `๏ผผ`
- Character `|`, Value `0x7C`, Replacement `๏ฝ`
File names can also **not end** with the following characters. These only get replaced if they are the **last** character in the name:
- Character `SP`, Value `0x20`, Replacement `โ `
- Character `.`, Value `0x2E`, Replacement `๏ผ`
File names can also **not begin** with the following characters. These only get replaced if they are the **first** character in the name:
- Character `SP`, Value `0x20`, Replacement `โ `
- Character `~`, Value `0x7E`, Replacement `๏ฝ`
Invalid UTF-8 bytes will also be replaced (<https://rclone.org/overview/#invalid-utf8>), as they can't be used in JSON strings.
### ๐๏ธ Deleting files ๐๏ธ
Any files you delete with rclone will end up in the trash. Microsoft doesn't provide an API to permanently delete files, nor to empty the trash, so you will have to do that with one of Microsoft's apps or via the OneDrive website. Not me having to go through the actual website like it's 2012. ๐
---
### โจ Standard options โจ
Here are the Standard options specific to onedrive (Microsoft OneDrive).
- **`--onedrive-client-id`** โ OAuth Client Id.
Leave blank normally.
Properties:
- Config: `client_id`
- Env Var: `RCLONE_ONEDRIVE_CLIENT_ID`
- Type: string
- Required: false
- **`--onedrive-client-secret`** โ OAuth Client Secret.
Leave blank normally.
Properties:
- Config: `client_secret`
- Env Var: `RCLONE_ONEDRIVE_CLIENT_SECRET`
- Type: string
- Required: false
- **`--onedrive-region`** โ Choose national cloud region for OneDrive.
Properties:
- Config: `region`
- Env Var: `RCLONE_ONEDRIVE_REGION`
- Type: string
- Default: `"global"`
- Examples:
- `"global"`
- Microsoft Cloud Global
- `"us"`
- Microsoft Cloud for US Government
- `"de"`
- Microsoft Cloud Germany (deprecated - try global region first).
- `"cn"`
- Azure and Office 365 operated by Vnet Group in China
- **`--onedrive-tenant`** โ ID of the service principal's tenant. Also called its directory ID.
Set this if using - Client Credential flow
Properties:
- Config: `tenant`
- Env Var: `RCLONE_ONEDRIVE_TENANT`
- Type: string
- Required: false
---
### ๐ฅ Advanced options ๐ฅ
Here are the Advanced options specific to onedrive (Microsoft OneDrive).
- **`--onedrive-token`** โ OAuth Access Token as a JSON blob.
Properties:
- Config: `token`
- Env Var: `RCLONE_ONEDRIVE_TOKEN`
- Type: string
- Required: false
- **`--onedrive-auth-url`** โ Auth server URL.
Leave blank to use the provider defaults.
Properties:
- Config: `auth_url`
- Env Var: `RCLONE_ONEDRIVE_AUTH_URL`
- Type: string
- Required: false
- **`--onedrive-token-url`** โ Token server url.
Leave blank to use the provider defaults.
Properties:
- Config: `token_url`
- Env Var: `RCLONE_ONEDRIVE_TOKEN_URL`
- Type: string
- Required: false
- **`--onedrive-client-credentials`** โ Use client credentials OAuth flow.
This will use the OAUTH2 client Credentials Flow as described in RFC 6749.
Note that this option is **NOT** supported by all backends.
Properties:
- Config: `client_credentials`
- Env Var: `RCLONE_ONEDRIVE_CLIENT_CREDENTIALS`
- Type: bool
- Default: false
- **`--onedrive-upload-cutoff`** โ Cutoff for switching to chunked upload.
Any files larger than this will be uploaded in chunks of `chunk_size`.
This is disabled by default as uploading using single part uploads causes rclone to use twice the storage on Onedrive business as when rclone sets the modification time after the upload Onedrive creates a new version.
See: <https://github.com/rclone/rclone/issues/1716>
Properties:
- Config: `upload_cutoff`
- Env Var: `RCLONE_ONEDRIVE_UPLOAD_CUTOFF`
- Type: SizeSuffix
- Default: off
- **`--onedrive-tenant-url`** โ The tenant URL for non-admin OneDrive access.
Set this to your SharePoint tenant URL to use the SharePoint v2.0 API endpoint instead of the standard Microsoft Graph API. This allows accessing business OneDrive without admin consent.
The URL can be found in your browser's developer tools by searching for `"driveAccessToken"` in the network requests. Look for the `".driveUrl"` field which contains the tenant URL and drive ID.
Example: `https://your-tenant.sharepoint.com/_api`
Properties:
- Config: `tenant_url`
- Env Var: `RCLONE_ONEDRIVE_TENANT_URL`
- Type: string
- Required: false
- **`--onedrive-chunk-size`** โ Chunk size to upload files with - must be multiple of 320k (327,680 bytes).
Above this size files will be chunked - must be multiple of 320k (327,680 bytes) and should not exceed 250M (262,144,000 bytes) else you may encounter `"Microsoft.SharePoint.Client.InvalidClientQueryException: The request message is too big."` Note that the chunks will be buffered into memory.
Properties:
- Config: `chunk_size`
- Env Var: `RCLONE_ONEDRIVE_CHUNK_SIZE`
- Type: SizeSuffix
- Default: 10Mi
- **`--onedrive-drive-id`** โ The ID of the drive to use.
Properties:
- Config: `drive_id`
- Env Var: `RCLONE_ONEDRIVE_DRIVE_ID`
- Type: string
- Required: false
- **`--onedrive-drive-type`** โ The type of the drive (personal | business | documentLibrary).
Properties:
- Config: `drive_type`
- Env Var: `RCLONE_ONEDRIVE_DRIVE_TYPE`
- Type: string
- Required: false
- **`--onedrive-root-folder-id`** โ ID of the root folder.
This isn't normally needed, but in special circumstances you might know the folder ID that you wish to access but not be able to get there through a path traversal.
Properties:
- Config: `root_folder_id`
- Env Var: `RCLONE_ONEDRIVE_ROOT_FOLDER_ID`
- Type: string
- Required: false
- **`--onedrive-access-scopes`** โ Set scopes to be requested by rclone.
Choose or manually enter a custom space separated list with all scopes, that rclone should request.
Properties:
- Config: `access_scopes`
- Env Var: `RCLONE_ONEDRIVE_ACCESS_SCOPES`
- Type: SpaceSepList
- Default: `Files.Read Files.ReadWrite Files.Read.All Files.ReadWrite.All Sites.Read.All offline_access`
- Examples:
- `"Files.Read Files.ReadWrite Files.Read.All Files.ReadWrite.All Sites.Read.All offline_access"`
- Read and write access to all resources
- `"Files.Read Files.Read.All Sites.Read.All offline_access"`
- Read only access to all resources
- `"Files.Read Files.ReadWrite Files.Read.All Files.ReadWrite.All offline_access"`
- Read and write access to all resources, without the ability to browse SharePoint sites.
- Same as if `disable_site_permission` was set to true
- **`--onedrive-expose-onenote-files`** โ makes yr OneNote files actually show up in directory listings ๐
So by default rclone is lowkey hiding OneNote files from directory listings, bc operations like "Open" and "Update" just won't work on them. But that same behaviour can also stop you from **deleting** them ๐ญ. So if you wanna delete OneNote files, or just want them visible in listings for whatever reason, flip this on.
Properties:
- Config: `expose_onenote_files`
- Env Var: `RCLONE_ONEDRIVE_EXPOSE_ONENOTE_FILES`
- Type: bool
- Default: false
- **`--onedrive-server-side-across-configs`** โ <yellow>Deprecated: use `--server-side-across-configs` instead.</yellow>
Lets server-side operations (like, say, `copy`) work *across different* onedrive configs. Iconic, but conditional bestie.
It'll work if you're copying between two OneDrive Personal drives AND the files you're copying are already shared between them. It should also function for a user who has access permissions both between Onedrive for business and SharePoint under the same tenant, and between SharePoint and another SharePoint under the same tenant. In other cases tho, rclone falls back to a normal copy (which is slightly slower, ngl).
Properties:
- Config: `server_side_across_configs`
- Env Var: `RCLONE_ONEDRIVE_SERVER_SIDE_ACROSS_CONFIGS`
- Type: bool
- Default: false
- **`--onedrive-list-chunk`** โ the size of the listing chunk โจ
Properties:
- Config: `list_chunk`
- Env Var: `RCLONE_ONEDRIVE_LIST_CHUNK`
- Type: int
- Default: 1000
- **`--onedrive-no-versions`** โ removes all versions on modifying operations ๐๏ธ
Onedrive creates versions when rclone uploads new files overwriting an existing one, and also when it sets the modification time. And those versions eat up space out of your quota, which is giving storage goblin energy fr.
This flag checks for versions after file upload and after setting modification time, and removes all but the last version. Periodt.
Properties:
- Config: `no_versions`
- Env Var: `RCLONE_ONEDRIVE_NO_VERSIONS`
- Type: bool
- Default: false
- **`--onedrive-hard-delete`** โ permanently delete files on removal ๐
Normally files get sent to the recycle bin when you delete them. Setting this flag makes them get permanently deleted instead. **Use with care** bestie, there is no undo arc here.
This works with OneDrive for Business, SharePoint document libraries, and OneDrive personal accounts, including free accounts.
Properties:
- Config: `hard_delete`
- Env Var: `RCLONE_ONEDRIVE_HARD_DELETE`
- Type: bool
- Default: false
- **`--onedrive-link-scope`** โ sets the scope of the links created by the `link` command ๐
Properties:
- Config: `link_scope`
- Env Var: `RCLONE_ONEDRIVE_LINK_SCOPE`
- Type: string
- Default: `"anonymous"`
- Examples:
- `"anonymous"`
- Anyone with the link has access, without needing to sign in.
- This may include people outside of your organization.
- Anonymous link support may be disabled by an administrator.
- `"organization"`
- Anyone signed into your organization (tenant) can use the link to get access.
- Only available in OneDrive for Business and SharePoint.
- **`--onedrive-link-type`** โ sets the *type* of the links created by the `link` command ๐
Properties:
- Config: `link_type`
- Env Var: `RCLONE_ONEDRIVE_LINK_TYPE`
- Type: string
- Default: `"view"`
- Examples:
- `"view"`
- Creates a read-only link to the item.
- `"edit"`
- Creates a read-write link to the item.
- `"embed"`
- Creates an embeddable link to the item.
- Only available in OneDrive personal.
- **`--onedrive-link-password`** โ sets the password for links created by the `link` command ๐
At the time of writing, this works with OneDrive for Business and OneDrive personal paid accounts.
OneDrive personal free accounts can't set a password or an expiry time (with `--expire`) on links. Sorry to the free-tier girlies ๐
Properties:
- Config: `link_password`
- Env Var: `RCLONE_ONEDRIVE_LINK_PASSWORD`
- Type: string
- Required: false
- **`--onedrive-hash-type`** โ specify the hash in use for the backend ๐งฌ
This specifies the hash type in use. If set to `"auto"` it will use the default hash which is QuickXorHash.
Before rclone 1.62 an SHA1 hash was used by default for Onedrive Personal. For 1.62 and later the default is to use a QuickXorHash for all onedrive types. If an SHA1 hash is desired then set this option accordingly.
From July 2023 QuickXorHash will be the only available hash for both OneDrive for Business and OneDrive Personal.
This can be set to `"none"` to not use any hashes.
If the hash requested does not exist on the object, it will be returned as an empty string which is treated as a missing hash by rclone.
Properties:
- Config: `hash_type`
- Env Var: `RCLONE_ONEDRIVE_HASH_TYPE`
- Type: string
- Default: `"auto"`
- Examples:
- `"auto"`
- Rclone chooses the best hash
- `"quickxor"`
- QuickXor
- `"sha1"`
- SHA1
- `"sha256"`
- SHA256
- `"crc32"`
- CRC32
- `"none"`
- None - don't use any hashes
- **`--onedrive-av-override`** โ allows download of files the server thinks has a virus ๐ฆ
The onedrive/sharepoint server may check files uploaded with an Anti Virus checker. If it detects any potential viruses or malware it will block download of the file.
In this case you will see a message like this
server reports this file is infected with a virus - use --onedrive-av-override to download anyway: Infected (name of virus): 403 Forbidden:
If you are **100%** sure you want to download this file anyway then use the `--onedrive-av-override` flag, or `av_override = true` in the config file. (100% sure is a very high bar bestie, think about it first.)
When set, malware-flagged files are downloaded via Microsoft Graph beta APIs with `Prefer: forceInfectedDownload` (`contentStream`, then `/content`). Clean files continue to use the stable v1.0 endpoint.
> This is a beta API and may change. It works reliably with application permissions (`client_credentials`). With delegated (user) login on OneDrive for Business, Microsoft often still blocks the download. `tenant_url` configurations fall back to the legacy `AVOverride` query parameter.
Properties:
- Config: `av_override`
- Env Var: `RCLONE_ONEDRIVE_AV_OVERRIDE`
- Type: bool
- Default: false
- **`--onedrive-delta`** โ if set, rclone will use delta listing to implement recursive listings โก
If this flag is set the onedrive backend will advertise `ListR` support for recursive listings.
Setting this flag speeds up these things **greatly**:
rclone lsf -R onedrive: rclone size onedrive: rclone rc vfs/refresh recursive=true
However the delta listing API only works at the root of the drive. If you use it not at the root then it recurses from the root and discards all the data that is not under the directory you asked for. So it will be correct but may not be very efficient. Correct but wasteful, it's giving overachiever with bad time management ๐ญ
This is why this flag is not set as the default.
As a rule of thumb, if nearly all of your data is under rclone's root directory (the `root/directory` in `onedrive:root/directory`) then using this flag will be a big performance win. If your data is mostly not under the root then using this flag will be a big performance loss.
It is recommended if you are mounting your onedrive at the root (or near the root when using crypt) and using `rclone rc vfs/refresh`.
Properties:
- Config: `delta`
- Env Var: `RCLONE_ONEDRIVE_DELTA`
- Type: bool
- Default: false
- **`--onedrive-metadata-permissions`** โ control whether permissions should be read or written in metadata ๐
Reading permissions metadata from files can be done quickly, but it isn't always desirable to set the permissions from the metadata.
Properties:
- Config: `metadata_permissions`
- Env Var: `RCLONE_ONEDRIVE_METADATA_PERMISSIONS`
- Type: Bits
- Default: off
- Examples:
- `"off"`
- Do not read or write the value
- `"read"`
- Read the value only
- `"write"`
- Write the value only
- `"read,write"`
- Read and Write the value.
- `"failok"`
- If writing fails log errors only, don't fail the transfer
- **`--onedrive-encoding`** โ the encoding for the backend โจ
See the encoding section in the overview (https://rclone.org/overview/#encoding) for more info.
Properties:
- Config: `encoding`
- Env Var: `RCLONE_ONEDRIVE_ENCODING`
- Type: Encoding
- Default: `Slash,LtGt,DoubleQuote,Colon,Question,Asterisk,Pipe,BackSlash,Del,Ctl,LeftSpace,LeftTilde,RightSpace,RightPeriod,InvalidUtf8,Dot`
- **`--onedrive-description`** โ description of the remote ๐
Properties:
- Config: `description`
- Env Var: `RCLONE_ONEDRIVE_DESCRIPTION`
- Type: string
- Required: false
---
## ๐๏ธ Metadata ๐๏ธ
OneDrive supports **System Metadata** (not User Metadata, as of this writing) for both files and directories. Much of the metadata is read-only, and there are some differences between OneDrive Personal and Business (see table below for details).
Permissions are also supported, if `--onedrive-metadata-permissions` is set. The accepted values for `--onedrive-metadata-permissions` are `"read"`, `"write"`, `"read,write"`, and `"off"` (the default). `"write"` supports adding new permissions, updating the `"role"` of existing permissions, and removing permissions. Updating and removing require the Permission ID to be known, so it is recommended to use `"read,write"` instead of `"write"` if you wish to update/remove permissions. (iykyk โ know the ID or keep the read on ๐
)
Permissions are read/written in JSON format using the same schema as the OneDrive API (https://learn.microsoft.com/en-us/onedrive/developer/rest-api/resources/permission?view=odsp-graph-online), which differs slightly between OneDrive Personal and Business.
Example for OneDrive Personal:
[ { "id": "1234567890ABC!123", "grantedTo": { "user": { "id": "ryan@contoso.com" }, "application": {}, "device": {} }, "invitation": { "email": "ryan@contoso.com" }, "link": { "webUrl": "https://1drv.ms/t/s!1234567890ABC" }, "roles": [ "read" ], "shareId": "s!1234567890ABC" } ]
Example for OneDrive Business:
[ { "id": "48d31887-5fad-4d73-a9f5-3c356e68a038", "grantedToIdentities": [ { "user": { "displayName": "ryan@contoso.com" }, "application": {}, "device": {} } ], "link": { "type": "view", "scope": "users", "webUrl": "https://contoso.sharepoint.com/:w:/t/design/a577ghg9hgh737613bmbjf839026561fmzhsr85ng9f3hjck2t5s" }, "roles": [ "read" ], "shareId": "u!LKj1lkdlals90j1nlkascl" }, { "id": "5D33DD65C6932946", "grantedTo": { "user": { "displayName": "John Doe", "id": "efee1b77-fb3b-4f65-99d6-274c11914d12" }, "application": {}, "device": {} }, "roles": [ "owner" ], "shareId": "FWxc1lasfdbEAGM5fI7B67aB5ZMPDMmQ11U" } ]
<rainbow>okay so writing permissions??</rainbow> ๐
yeah bestie, you literally pass in a `"permissions"` metadata key using this exact same format. no cap. And the `--metadata-mapper` tool (over at https://rclone.org/docs/#metadata-mapper) is <hotpink>so</hotpink> helpful for this, fr fr.
When you're adding permissions, you can drop an email address in the `User.ID` or `DisplayName` properties of `grantedTo` or `grantedToIdentities`. Orrr you can hand over an `ObjectID` in `User.ID`. Either way: <yellow>at least one valid recipient must be provided</yellow> in order to add a permission for a user. โจ And creating a Public Link is also supported, if `Link.Scope` is set to `"anonymous"`.
Example request to add a `"read"` permission with `--metadata-mapper`:
{ "Metadata": { "permissions": "[{"grantedToIdentities":[{"user":{"id":"ryan@contoso.com"}}],"roles":["read"]}]" } }
> ๐ญ heads up bestie: adding a permission can <bold>fail</bold> if a conflicting permission already exists for the file/folder. rude, but that's the vibe.
To update an existing permission, include both the Permission ID *and* the new roles to be assigned. And listen โ `roles` is literally the **only** property that can be changed. periodt.
To remove permissions, pass in a blob containing only the permissions you wish to keep (which can be empty, to remove all of them ๐ซถ). Note that the `owner` role will be ignored, as it cannot be removed. iconic but untouchable, iykyk.
Also note that both reading *and* writing permissions require extra API calls, so if you don't need to read or write permissions it is recommended to omit `--onedrive-metadata-permissions`. save yourself the drama, babe.
Metadata and permissions are supported for Folders (directories) as well as Files. Note that setting the `mtime` or `btime` on a Folder requires one extra API call on OneDrive Business **only**.
OneDrive does not currently support User Metadata. When writing metadata, only writeable system properties will be written โ any read-only or unrecognized keys passed in will be ignored. ๐
TIP: to see the metadata and permissions for any file or folder, run:
rclone lsjson remote:path --stat -M --onedrive-metadata-permissions read
Here are the possible system metadata items for the onedrive backend. ๐
- **`btime`** โ Time of file birth (creation) with S accuracy. Type: RFC 3339. Example: `2006-01-02T15:04:05Z`. Read Only: **N**.
- **`content-type`** โ The MIME type of the file. Type: string. Example: `text/plain`. Read Only: **Y**.
- **`created-by-display-name`** โ Display name of the user that created the item. Type: string. Example: `John Doe`. Read Only: **Y**.
- **`created-by-id`** โ ID of the user that created the item. Type: string. Example: `48d31887-5fad-4d73-a9f5-3c356e68a038`. Read Only: **Y**.
- **`description`** โ A short description of the file. Max 1024 characters. No longer supported by Microsoft. Type: string. Example: `Contract for signing`. Read Only: **N**.
- **`id`** โ The unique identifier of the item within OneDrive. Type: string. Example: `01BYE5RZ6QN3ZWBTUFOFD3GSPGOHDJD36K`. Read Only: **Y**.
- **`last-modified-by-display-name`** โ Display name of the user that last modified the item. Type: string. Example: `John Doe`. Read Only: **Y**.
- **`last-modified-by-id`** โ ID of the user that last modified the item. Type: string. Example: `48d31887-5fad-4d73-a9f5-3c356e68a038`. Read Only: **Y**.
- **`malware-detected`** โ Whether OneDrive has detected that the item contains malware. Type: boolean. Example: `true`. Read Only: **Y**.
- **`mtime`** โ Time of last modification with S accuracy. Type: RFC 3339. Example: `2006-01-02T15:04:05Z`. Read Only: **N**.
- **`package-type`** โ If present, indicates that this item is a package instead of a folder or file. Packages are treated like files in some contexts and folders in others. Type: string. Example: `oneNote`. Read Only: **Y**.
- **`permissions`** โ Permissions in a JSON dump of OneDrive format. Enable with `--onedrive-metadata-permissions`. Properties: `id`, `grantedTo`, `grantedToIdentities`, `invitation`, `inheritedFrom`, `link`, `roles`, `shareId`. Type: JSON. Example: `{}`. Read Only: **N**.
- **`shared-by-id`** โ ID of the user that shared the item (if shared). Type: string. Example: `48d31887-5fad-4d73-a9f5-3c356e68a038`. Read Only: **Y**.
- **`shared-owner-id`** โ ID of the owner of the shared item (if shared). Type: string. Example: `48d31887-5fad-4d73-a9f5-3c356e68a038`. Read Only: **Y**.
- **`shared-scope`** โ If shared, indicates the scope of how the item is shared: `anonymous`, `organization`, or `users`. Type: string. Example: `users`. Read Only: **Y**.
- **`shared-time`** โ Time when the item was shared, with S accuracy. Type: RFC 3339. Example: `2006-01-02T15:04:05Z`. Read Only: **Y**.
- **`utime`** โ Time of upload with S accuracy. Type: RFC 3339. Example: `2006-01-02T15:04:05Z`. Read Only: **Y**.
See the metadata docs for more info: https://rclone.org/docs/#metadata ๐ธ
---
### Impersonate other users as Admin ๐
So unlike Google Drive and impersonating any domain user via service accounts, OneDrive requires you to authenticate as an <bold>admin account</bold>, and manually set up a remote per user you wish to impersonate. it's giving extra steps but we ball. ๐ง
1. In Microsoft 365 Admin Center (https://admin.microsoft.com), open each user you need to "impersonate" and go to the OneDrive section. There is a heading called "Get access to files", you need to click to create the link, this creates the link of the format `https://{tenant}-my.sharepoint.com/personal/{user_name_domain_tld}/` but also changes the permissions so you your admin user has access.
2. Then in powershell run the following commands:
Install-Module Microsoft.Graph -Scope CurrentUser -Repository PSGallery -Force Import-Module Microsoft.Graph.Files Connect-MgGraph -Scopes "Files.ReadWrite.All"
Follow the steps to allow access to your admin user
Then run this for each user you want to impersonate to get the Drive ID
Get-MgUserDefaultDrive -UserId '{emailaddress}'
This will give you output of the format:
Name Id DriveType CreatedDateTime
---- -- --------- ---------------
OneDrive b!XYZ123 business 14/10/2023 1:00:58 pm
3. Then in rclone add a onedrive remote type, and use the Type in driveID with the DriveID you got in the previous step. One remote per user. It will then confirm the drive ID, and hopefully give you a message of `Found drive "root" of type "business"` and then include the URL of the format `https://{tenant}-my.sharepoint.com/personal/{user_name_domain_tld}/Documents` ๐
### Limitations ๐ญ
If you don't use rclone for 90 days the refresh token will expire. This will result in authorization problems. This is easy to fix by running the `rclone config reconnect remote:` command to get a new token and refresh token. slay, problem solved.
### Naming ๐
Note that OneDrive is case insensitive so you can't have a file called `"Hello.doc"` and one called `"hello.doc"`. pick a lane bestie.
There are quite a few characters that can't be in OneDrive file names. These can't occur on Windows platforms, but on non-Windows platforms they are common. Rclone will map these names to and from an identical looking unicode equivalent. For example if a file has a `?` in it will be mapped to `๏ผ` instead. โจ๐ฆ
## File sizes ๐พ
Biggest file you can possibly yeet up in here? **250 GiB** โ same for both OneDrive Personal and OneDrive for Business (Updated 13 Jan 2021) (https://support.microsoft.com/en-us/office/invalid-file-names-and-file-types-in-onedrive-and-sharepoint-64883a5d-228e-48f5-b3d2-eb39e07630fa?ui=en-us&rs=en-us&ad=us#individualfilesize).
## Path length ๐
Okay so the **entire** path โ filename included โ has to be **fewer than 400 characters** for OneDrive, OneDrive for Business and SharePoint Online. And if you're out here encrypting file and folder names with rclone, bestie, pay attention to this one, because encrypted names are typically *longer* than the original ones and they will absolutely blow past that limit ๐
## Number of files ๐๏ธ
OneDrive seems to be OK with at least **50,000 files** in a folder, no cap. But at **100,000** rclone will get errors listing the directory like `couldn't list files: UnknownError:`. See #2707 (https://github.com/rclone/rclone/issues/2707) for more info.
An official document about the limitations for different types of OneDrive can be found here (https://support.office.com/en-us/article/invalid-file-names-and-file-types-in-onedrive-onedrive-for-business-and-sharepoint-64883a5d-228e-48f5-b3d2-eb39e07630fa).
## Versions ๐
Every single change in a file makes OneDrive go "new version, who dis" and create a fresh version of that file. And that counts against a user's quota, so it's not free real estate. For example, changing the modification time of a file creates a **second version**, so the file apparently uses *twice* the space. Not a vibe.
The `copy` command is affected by this too, because rclone copies the file and then afterwards sets the modification time to match the source file โ which uses another version. ๐ญ
You can use the `rclone cleanup` command (see below ๐) to remove all old versions.
Or you can set the `no_versions` parameter to `true` and rclone will remove versions after operations which create new versions. Heads up though: this takes extra transactions, so only enable it if you actually need it.
## Disabling versioning ๐
Starting October 2018, users will no longer be able to disable versioning by default. This is because Microsoft has brought an update (https://techcommunity.microsoft.com/t5/Microsoft-OneDrive-Blog/New-Updates-to-OneDrive-and-SharePoint-Team-Site-Versioning/ba-p/204390) to the mechanism. To change this new default setting, a PowerShell command is required to be run by a SharePoint admin. If you are an admin, you can run these commands in PowerShell to change that setting:
1. `Install-Module -Name Microsoft.Online.SharePoint.PowerShell` (in case you haven't installed this already)
2. `Import-Module Microsoft.Online.SharePoint.PowerShell -DisableNameChecking`
3. `Connect-SPOService -Url https://YOURSITE-admin.sharepoint.com -Credential YOU@YOURSITE.COM` (replacing `YOURSITE`, `YOU`, `YOURSITE.COM` with the actual values; this will prompt for your credentials)
4. `Set-SPOTenant -EnableMinimumVersionRequirement $False`
5. `Disconnect-SPOService` (to disconnect from the server)
Below are the steps for normal users to disable versioning. If you don't see the "No Versioning" option, make sure the above requirements are met.
User Weropol (https://github.com/Weropol) has found a method to disable versioning on OneDrive:
1. Open the settings menu by clicking on the gear symbol at the top of the OneDrive Business page.
2. Click **Site settings**.
3. Once on the Site settings page, navigate to **Site Administration** > **Site libraries and lists**.
4. Click **Customize "Documents"**.
5. Click **General Settings** > **Versioning Settings**.
6. Under **Document Version History** select the option **No versioning**. Note: This will disable the creation of new file versions, but will not remove any previous versions. Your documents are safe. ๐ซถ
7. Apply the changes by clicking **OK**.
8. Use rclone to upload or modify files. (I also use the `--no-update-modtime` flag)
9. Restore the versioning settings after using rclone. (Optional)
## Cleanup ๐งน
OneDrive supports `rclone cleanup`, which causes rclone to look through every file under the path supplied and delete all versions but the current version. Because this involves traversing all the files, then querying each file for versions, it can be quite slow, ngl. Rclone does `--checkers` tests in parallel, which helps. The command also supports `--interactive`/`-i` or `--dry-run`, which is a *great* way to see what it would do before you commit ๐
rclone cleanup --interactive remote:path/subdir # interactively remove all old version for path/subdir rclone cleanup remote:path/subdir # unconditionally remove all old version for path/subdir
## Troubleshooting ๐จ
### Excessive throttling or blocked on SharePoint
If you experience excessive throttling or is being blocked on SharePoint then it may help to set the user agent explicitly with a flag like this: `--user-agent "ISV|rclone.org|rclone/v1.55.1"`
The specific details can be found in the Microsoft document: Avoid getting throttled or blocked in SharePoint Online (https://docs.microsoft.com/en-us/sharepoint/dev/general-development/how-to-avoid-getting-throttled-or-blocked-in-sharepoint-online#how-to-decorate-your-http-traffic-to-avoid-throttling)
### Unexpected file size/hash differences on Sharepoint
It is a known (https://github.com/OneDrive/onedrive-api-docs/issues/935#issuecomment-441741631) issue that Sharepoint (**not** OneDrive or OneDrive for Business) silently modifies uploaded files, mainly Office files (`.docx`, `.xlsx`, etc.), causing file size and hash checks to fail. There are also other situations that will cause OneDrive to report inconsistent file sizes. To use rclone with such affected files on Sharepoint, you may disable these checks with the following command line arguments:
--ignore-checksum --ignore-size
Alternatively, if you have write access to the OneDrive files, it may be possible to fix this problem for certain files, by attempting the steps below. Open the web interface for OneDrive (https://onedrive.live.com) and find the affected files (which will be in the error messages/log for rclone). Simply click on each of these files, causing OneDrive to open them on the web. This will cause each file to be converted in place to a format that is functionally equivalent but which will no longer trigger the size discrepancy. Once all problematic files are converted you will no longer need the ignore options above. Slay โจ
### Replacing/deleting existing files on Sharepoint gets "item not found"
It is a known (https://github.com/OneDrive/onedrive-api-docs/issues/1068) issue that Sharepoint (**not** OneDrive or OneDrive for Business) may return "item not found" errors when users try to replace or delete uploaded files; this seems to mainly affect Office files (`.docx`, `.xlsx`, etc.) and web files (`.html`, `.aspx`, etc.). As a workaround, you may use the `--backup-dir <BACKUP_DIR>` command line argument so rclone moves the files to be replaced/deleted into a given backup directory (instead of directly replacing/deleting them). For example, to instruct rclone to move the files into the directory `rclone-backup-dir` on backend `mysharepoint`, you may use:
--backup-dir mysharepoint:rclone-backup-dir
### access_denied (AADSTS65005)
Error: access_denied Code: AADSTS65005 Description: Using application 'rclone' is currently not supported for your organization [YOUR_ORGANIZATION] because it is in an unmanaged state. An administrator needs to claim ownership of the company by DNS validation of [YOUR_ORGANIZATION] before the application rclone can be provisioned.
This means that rclone can't use the OneDrive for Business API with your account. You can't do much about it, maybe write an email to your admins. โ๏ธ
However, there are other ways to interact with your OneDrive account. Have a look at the WebDAV backend: <https://rclone.org/webdav/#sharepoint>
### invalid_grant (AADSTS50076)
Error: invalid_grant Code: AADSTS50076 Description: Due to a configuration change made by your administrator, or because you moved to a new location, you must use multi-factor authentication to access '...'.
If you see the error above after enabling multi-factor authentication for your account, you can fix it by refreshing your OAuth refresh token. To do that, run `rclone config`, and choose to edit your OneDrive backend. Then, you don't need to actually make any changes until you reach this question: `Token already configured - replace it?`. For this question, answer `y` and go through the process to refresh your token, just like the first time the backend is configured. After this, rclone should work again for this backend. Iconic behavior tbh ๐
### Invalid request when making public links
On Sharepoint and OneDrive for Business, `rclone link` may return an "Invalid request" error. A possible cause is that the organisation admin didn't allow public links to be made for the organisation/sharepoint library. To fix the permissions as an admin, take a look at the docs: 1 (https://docs.microsoft.com/en-us/sharepoint/turn-external-sharing-on-or-off), 2 (https://support.microsoft.com/en-us/office/set-up-and-manage-access-requests-94b26e0b-2822-49d4-929a-8455698654b3).
### Can not access Shared with me files
**Shared with me files** is not supported by rclone currently (https://github.com/rclone/rclone/issues/4062), but there is a workaround:
1. Visit https://onedrive.live.com (https://onedrive.live.com/)
2. Right click a item in **Shared**, then click **Add shortcut to My files** in the context [IMAGE: make_shortcut (https://user-images.githubusercontent.com/60313789/206118040-7e762b3b-aa61-41a1-8649-cc18889f3572.png)]
3. The shortcut will appear in **My files**, you can access it with rclone, it behaves like a normal folder/file. [IMAGE: in_my_files (https://i.imgur.com/0S8H3li.png)] [IMAGE: rclone_mount (https://i.imgur.com/2Iq66sW.png)]
Listing such a shortcut may still fail with
invalidRequest: The provided drive id appears to be malformed, or does not represent a valid drive.
as the drive it points to can't always be read with the drive ID the API supplies. Personal Vault is a shortcut of the same kind and fails to list in the same way, though it reports `invalidResourceId: ObjectHandle is Invalid`.
A normal listing reports the error for that folder and carries on, so the rest of the drive is still listed, and excluding the folder (for example with `--exclude "/Personal Vault/**"`) avoids the error.
A recursive listing with `--fast-list` stops at the first error, so listing the root of a drive which has one of these shortcuts in it will fail. Filters don't help here as the folder is listed by the backend before the filters are applied โ use `--disable ListR` (or don't use `--fast-list`) on such a drive.
## ๐ Live Photos uploaded from iOS (small video clips in .heic files) ๐
okay so back in 2020 the iOS OneDrive app introduced uploading and storing Live Photos (links: `https://techcommunity.microsoft.com/t5/microsoft-onedrive-blog/live-photos-come-to-onedrive/ba-p/1953452` and `https://support.apple.com/en-gb/HT207310`). And bestie, the <pink>usage and download</pink> of those uploaded Live Photos is *still* work-in-progress, which introduces several issues when copying, synchronising and mounting โ both in rclone and in the native OneDrive client on Windows. ๐ญ
The root cause is so easy to see. Locate one of your Live Photos in the OneDrive web interface, then download the photo from the web interface. The size of the downloaded `.heic` file is <hotpink>smaller</hotpink> than the size displayed in the web interface. Why? Because the downloaded file only contains a single frame (a still photo) extracted from the Live Photo (a movie) stored in OneDrive. it's giving scam but it's just Microsoft ๐
Those different sizes make rclone copy/sync repeatedly recopy unmodified photos, something like this:
DEBUG : 20230203_123826234_iOS.heic: Sizes differ (src 4470314 vs dst 1298667) DEBUG : 20230203_123826234_iOS.heic: sha1 = fc2edde7863b7a7c93ca6771498ac797f8460750 OK INFO : 20230203_123826234_iOS.heic: Copied (replaced existing)
You can work around these recopies by adding `--ignore-size`. <yellow>Please note</yellow> that this workaround only syncs the still-picture, <bold>not</bold> the movie clip, and it relies on modification dates being correctly updated on all files in all situations. ๐
The different sizes will also make `rclone check` report size errors, something like this:
ERROR : 20230203_123826234_iOS.heic: sizes differ
These check errors can be suppressed by adding `--ignore-size`.
The different sizes will also make `rclone mount` fail downloading with an error something like this:
ERROR : 20230203_123826234_iOS.heic: ReadFileHandle.Read error: low level retry 1/10: unexpected EOF
or like this when using `--cache-mode=full`:
INFO : 20230203_123826234_iOS.heic: vfs cache: downloader: error count now 1: vfs reader: failed to write to cache file: 416 Requested Range Not Satisfiable: ERROR : 20230203_123826234_iOS.heic: vfs cache: failed to download: vfs reader: failed to write to cache file: 416 Requested Range Not Satisfiable:
---
# ๐โจ OpenDrive โจ๐
Paths are specified as `remote:path`
Paths may be as deep as required, e.g. `remote:directory/subdirectory`.
## ๐ ๏ธ Configuration ๐ ๏ธ
Here's an example of how to make a remote called `remote`. First run:
rclone config
This will guide you through an interactive setup process:
n) New remote d) Delete remote q) Quit config e/n/d/q> n name> remote Type of storage to configure. Choose a number from below, or type in your own value [snip] XX / OpenDrive \ "opendrive" [snip] Storage> opendrive Username username> Password y) Yes type in my own password g) Generate random password y/g> y Enter the password: password: Confirm the password: password: Configuration complete. Options:
- type: opendrive
- username:
- password: * ENCRYPTED * Keep this "remote" remote? y) Yes this is OK e) Edit this remote d) Delete this remote y/e/d> y
List directories in top level of your OpenDrive
rclone lsd remote:
List all the files in your OpenDrive
rclone ls remote:
To copy a local directory to an OpenDrive directory called `backup`
rclone copy /home/source remote:backup
## โฐ Modification times and hashes โฐ
OpenDrive lets modification times be set on objects, accurate to 1 second. These will be used to detect whether objects need syncing or not. ๐
The <cyan>MD5</cyan> hash algorithm is supported. ๐
## ๐ซ Restricted filename characters ๐ซ
Character ยท Value ยท Replacement
- `NUL` โ `0x00` โ `โ`
- `/` โ `0x2F` โ `๏ผ`
- `"` โ `0x22` โ `๏ผ`
- `*` โ `0x2A` โ `๏ผ`
- `:` โ `0x3A` โ `๏ผ`
- `<` โ `0x3C` โ `๏ผ`
- `>` โ `0x3E` โ `๏ผ`
- `?` โ `0x3F` โ `๏ผ`
- `\` โ `0x5C` โ `๏ผผ`
- `|` โ `0x7C` โ `๏ฝ`
File names also <bold>can't begin or end</bold> with the following characters. These only get replaced if they are the first or last character in the name:
- `SP` โ `0x20` โ `โ `
- `HT` โ `0x09` โ `โ`
- `LF` โ `0x0A` โ `โ`
- `VT` โ `0x0B` โ `โ`
- `CR` โ `0x0D` โ `โ`
Invalid UTF-8 bytes will also be replaced (`https://rclone.org/overview/#invalid-utf8`), because they can't be used in JSON strings. periodt ๐
## โ๏ธ Standard options โ๏ธ
Here are the Standard options specific to `opendrive` (OpenDrive).
### `--opendrive-username`
Username.
Properties:
- Config: `username`
- Env Var: `RCLONE_OPENDRIVE_USERNAME`
- Type: `string`
- Required: `true`
### `--opendrive-password`
Password.
> NB input to this must be obscured โ see `rclone obscure` (`https://rclone.org/commands/rclone_obscure/`).
Properties:
- Config: `password`
- Env Var: `RCLONE_OPENDRIVE_PASSWORD`
- Type: `string`
- Required: `true`
## ๐ฅ Advanced options ๐ฅ
Here are the Advanced options specific to `opendrive` (OpenDrive).
### `--opendrive-encoding`
The encoding for the backend.
See the encoding section in the overview (`https://rclone.org/overview/#encoding`) for more info.
Properties:
- Config: `encoding`
- Env Var: `RCLONE_OPENDRIVE_ENCODING`
- Type: `Encoding`
- Default: `Slash,LtGt,DoubleQuote,Colon,Question,Asterisk,Pipe,BackSlash,LeftSpace,LeftCrLfHtVt,RightSpace,RightCrLfHtVt,InvalidUtf8,Dot`
### `--opendrive-chunk-size`
Files will be uploaded in chunks this size.
Note that these chunks are buffered in memory, so increasing them will increase memory use. ๐ง ๐ฅ
Properties:
- Config: `chunk_size`
- Env Var: `RCLONE_OPENDRIVE_CHUNK_SIZE`
- Type: `SizeSuffix`
- Default: `10Mi`
### `--opendrive-access`
Files and folders will be uploaded with this access permission (default private)
Properties:
- Config: `access`
- Env Var: `RCLONE_OPENDRIVE_ACCESS`
- Type: `string`
- Default: `"private"`
- Examples:
- `"private"`
- The file or folder access can be granted in a way that will allow select users to view, read or write what is absolutely essential for them.
- `"public"`
- The file or folder can be downloaded by anyone from a web browser. The link can be shared in any way,
- `"hidden"`
- The file or folder can be accessed has the same restrictions as Public if the user knows the URL of the file or folder link in order to access the contents
### `--opendrive-description`
Description of the remote.
Properties:
- Config: `description`
- Env Var: `RCLONE_OPENDRIVE_DESCRIPTION`
- Type: `string`
- Required: `false`
## ๐ฌ Limitations ๐ฌ
So OpenDrive is <red>case insensitive</red>, which means you can't have a file called `"Hello.doc"` and one called `"hello.doc"` at the same time. ngl, rude.
There are quite a few characters that can't be in OpenDrive file names. These can't occur on Windows platforms, but on non-Windows platforms they are common. Rclone will map these names to and from an identical looking unicode equivalent. For example, if a file has a `?` in it, it will be mapped to `๏ผ` instead. ๐
`rclone about` is <bold>not supported</bold> by the OpenDrive backend. Backends without this capability cannot determine free space for an rclone mount or use policy `mfs` (most free space) as a member of an rclone union remote. ๐ญ
See List of backends that do not support rclone about (`https://rclone.org/overview/#optional-features`) and `rclone about` (`https://rclone.org/commands/rclone_about/`).
---
# ๐ Oracle Object Storage ๐
Object Storage provided by the Oracle Cloud Infrastructure (OCI). Read more at `oracle.com`:
- Oracle Object Storage Overview (`https://docs.oracle.com/iaas/Content/Object/Concepts/objectstorageoverview.htm`)
- Oracle Object Storage FAQ (`https://www.oracle.com/cloud/storage/object-storage/faq/`)
Paths are specified as `remote:bucket` (or `remote:` for the `lsd` command). You may put subdirectories in too, e.g. `remote:bucket/path/to/dir`.
Sample command to transfer local artifacts to `remote:bucket` in oracle object storage:
rclone -vvv --progress --stats-one-line --max-stats-groups 10 --log-format date,time,UTC,longfile --fast-list --buffer-size 256Mi --oos-no-check-bucket --oos-upload-cutoff 10Mi --multi-thread-cutoff 16Mi --multi-thread-streams 3000 --transfers 3000 --checkers 64 --retries 2 --oos-chunk-size 10Mi --oos-upload-concurrency 10000 --oos-attempt-resume-upload --oos-leave-parts-on-error sync ./artifacts remote:bucket -vv
## ๐ ๏ธ Configuration ๐ ๏ธ
Here's an example of making an oracle object storage configuration. `rclone config` walks you through it. ๐
Here is an example of how to make a remote called `remote`. First run:
rclone config
This will guide you through an interactive setup process:
n) New remote d) Delete remote r) Rename remote c) Copy remote s) Set configuration password q) Quit config e/n/d/r/c/s/q> n
Enter name for new remote. name> remote
Option Storage. Type of storage to configure. Choose a number from below, or type in your own value. [snip] XX / Oracle Cloud Infrastructure Object Storage \ (oracleobjectstorage) Storage> oracleobjectstorage
`Option provider.`
Choose your Auth Provider
Choose a number from below, or type in your own string value.
Press Enter for the default (env_auth).
1 / automatically pickup the credentials from runtime(env), first one to provide auth wins
\ (env_auth)
/ use an OCI user and an API key for authentication.
2 | you'll need to put in a config file your tenancy OCID, user OCID, region, the path, fingerprint to an API key.
| https://docs.oracle.com/en-us/iaas/Content/API/Concepts/sdkconfig.htm
\ (user_principal_auth)
/ use instance principals to authorize an instance to make API calls.
3 | each instance has its own identity, and authenticates using the certificates that are read from instance metadata.
| https://docs.oracle.com/en-us/iaas/Content/Identity/Tasks/callingservicesfrominstances.htm
\ (instance_principal_auth)
/ use workload identity to grant Kubernetes pods policy-driven access to Oracle Cloud
4 | Infrastructure (OCI) resources using OCI Identity and Access Management (IAM).
| https://docs.oracle.com/en-us/iaas/Content/ContEng/Tasks/contenggrantingworkloadaccesstoresources.htm
\ (workload_identity_auth)
5 / use resource principals to make API calls
\ (resource_principal_auth)
6 / no credentials needed, this is typically for reading public buckets
\ (no_auth)
provider> 2
Option namespace.
Object storage namespace
Enter a value.
namespace> idbamagbg734
Option compartment.
Object storage compartment OCID
Enter a value.
compartment> ocid1.compartment.oc1..aaaaaaaapufkxc7ame3sthry5i7ujrwfc7ejnthhu6bhanm5oqfjpyasjkba
Option region.
Object storage Region
Enter a value.
region> us-ashburn-1
Option endpoint.
Endpoint for Object storage API.
Leave blank to use the default endpoint for the region.
Enter a value. Press Enter to leave empty.
endpoint>
Option config_file.
Full Path to OCI config file
Choose a number from below, or type in your own string value.
Press Enter for the default (~/.oci/config).
1 / oci configuration file location
\ (~/.oci/config)
config_file> /etc/oci/dev.conf
Option config_profile.
Profile name inside OCI config file
Choose a number from below, or type in your own string value.
Press Enter for the default (Default).
1 / Use the default profile
\ (Default)
config_profile> Test
Edit advanced config?
y) Yes
n) No (default)
y/n> n
Configuration complete.
Options:
- type: oracleobjectstorage
- namespace: idbamagbg734
- compartment: ocid1.compartment.oc1..aaaaaaaapufkxc7ame3sthry5i7ujrwfc7ejnthhu6bhanm5oqfjpyasjkba
- region: us-ashburn-1
- provider: user_principal_auth
- config_file: /etc/oci/dev.conf
- config_profile: Test
Keep this "remote" remote?
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d> y
bestie you just watched a whole config wizard speedrun itself ๐ญ๐ that's the whole Q&A flow, numbers and all.
See all buckets โ the vibe check on what's already out there ๐
rclone lsd remote:
Create a new bucket โ new bucket, who dis ๐ชฃโจ
rclone mkdir remote:bucket
List the contents of a bucket โ and yes you can keep it shallow if the nesting is doing too much ๐
rclone ls remote:bucket
rclone ls remote:bucket --max-depth 1
Authentication Providers ๐ชชโจ
OCI ships with several authentication methods, and honestly, picking one is giving choose your fighter. Wanna learn more about them? Go read the docs, bestie: oci authentication methods (https://docs.oracle.com/en-us/iaas/Content/API/Concepts/sdk_authentication_methods.htm).
These choices can be specified in the rclone config file. Periodt.
Rclone supports the following OCI authentication provider. ๐
- User Principal
- Instance Principal
- Resource Principal
- Workload Identity
- No authentication
User Principal ๐ค๐
Sample rclone config file for Authentication Provider User Principal:
[oos]
type = oracleobjectstorage
namespace = id<redacted>34
compartment = ocid1.compartment.oc1..aa<redacted>ba
region = us-ashburn-1
provider = user_principal_auth
config_file = /home/opc/.oci/config
config_profile = Default
Advantages:
- One can use this method from any server within OCI or on-premises or from other cloud provider.
Considerations:
- you need to configure user's privileges / policy to allow access to object storage
- Overhead of managing users and keys.
- If the user is deleted, the config file will no longer work and may cause automation regressions that use the user's credentials.
โ ๏ธ read that last one again bestie. if that user gets yeeted, the config file is cooked and any automation leaning on those credentials just goes down with it. no cap.
Instance Principal ๐ฅ๏ธ๐ง
An OCI compute instance can be authorized to use rclone by using it's identity and certificates as an instance principal. With this approach no credentials have to be stored and managed. (iconic behaviour honestly โจ)
Sample rclone configuration file for Authentication Provider Instance Principal:
[opc@rclone ~]$ cat ~/.config/rclone/rclone.conf
[oos]
type = oracleobjectstorage
namespace = id<redacted>fn
compartment = ocid1.compartment.oc1..aa<redacted>k7a
region = us-ashburn-1
provider = instance_principal_auth
Advantages:
- With instance principals, you don't need to configure user credentials and transfer/ save it to disk in your compute instances or rotate the credentials.
- You don't need to deal with users and keys.
- Greatly helps in automation as you don't have to manage access keys, user private keys, storing them in vault, using kms etc.
Considerations:
- You need to configure a dynamic group having this instance as member and add policy to read object storage to that dynamic group.
- Everyone who has access to this machine can execute the CLI commands.
- It is applicable for oci compute instances only. It cannot be used on external instance or resources.
๐ "everyone who has access to this machine" โ yeah, that's a whole trust exercise. know who's on your box.
Resource Principal ๐๐งฉ
Resource principal auth is very similar to instance principal auth but used for resources that are not compute instances such as serverless functions (https://docs.oracle.com/en-us/iaas/Content/Functions/Concepts/functionsoverview.htm). To use resource principal ensure Rclone process is started with these environment variables set in its process.
export OCI_RESOURCE_PRINCIPAL_VERSION=2.2
export OCI_RESOURCE_PRINCIPAL_REGION=us-ashburn-1
export OCI_RESOURCE_PRINCIPAL_PRIVATE_PEM=/usr/share/model-server/key.pem
export OCI_RESOURCE_PRINCIPAL_RPST=/usr/share/model-server/security_token
Sample rclone configuration file for Authentication Provider Resource Principal:
[oos]
type = oracleobjectstorage
namespace = id<redacted>34
compartment = ocid1.compartment.oc1..aa<redacted>ba
region = us-ashburn-1
provider = resource_principal_auth
Workload Identity โธ๏ธ๐ฆ
Workload Identity auth may be used when running Rclone from Kubernetes pod on a Container Engine for Kubernetes (OKE) cluster. For more details on configuring Workload Identity, see Granting Workloads Access to OCI Resources (https://docs.oracle.com/en-us/iaas/Content/ContEng/Tasks/contenggrantingworkloadaccesstoresources.htm). To use workload identity, ensure Rclone is started with these environment variables set in its process.
export OCI_RESOURCE_PRINCIPAL_VERSION=2.2
export OCI_RESOURCE_PRINCIPAL_REGION=us-ashburn-1
No authentication ๐ซถ๐
Public buckets do not require any authentication mechanism to read objects. Sample rclone configuration file for No authentication:
[oos]
type = oracleobjectstorage
namespace = id<redacted>34
compartment = ocid1.compartment.oc1..aa<redacted>ba
region = us-ashburn-1
provider = no_auth
Modification times and hashes โฐ๐
The modification time is stored as metadata on the object as opc-meta-mtime as floating point since the epoch, accurate to 1 ns.
If the modification time needs to be updated rclone will attempt to perform a server side copy to update the modification if the object can be copied in a single part. In the case the object is larger than 5Gb, the object will be uploaded rather than copied.
Note that reading this from the object takes an additional HEAD request as the metadata isn't returned in object listings.
The MD5 hash algorithm is supported.
๐ซ heads up: that extra HEAD request per read? it's a real cost, not a vibe. and those past-5Gb files are getting a full upload, not a cheeky copy โ plan accordingly.
Multipart uploads ๐งฉ๐ฅ
rclone supports multipart uploads with OOS which means that it can upload files bigger than 5 GiB. yesss big files, we love to see it.
Note that files uploaded both with multipart upload and through crypt remotes do not have MD5 sums.
rclone switches from single part uploads to multipart uploads at the point specified by --oos-upload-cutoff. This can be a maximum of 5 GiB and a minimum of 0 (ie always upload multipart files).
The chunk sizes used in the multipart upload are specified by --oos-chunk-size and the number of chunks uploaded concurrently is specified by --oos-upload-concurrency.
Multipart uploads will use --transfers * --oos-upload-concurrency * --oos-chunk-size extra memory. Single part uploads to not use extra memory.
Single part transfers can be faster than multipart transfers or slower depending on your latency from oos - the more latency, the more likely single part transfers will be faster.
Increasing --oos-upload-concurrency will increase throughput (8 would be a sensible value) and increasing --oos-chunk-size also increases throughput (16M would be sensible). Increasing either of these will use more memory. The default values are high enough to gain most of the possible performance without using too much memory.
๐ do the math on that memory formula before you crank the concurrency to like 64, bestie. --transfers * --oos-upload-concurrency * --oos-chunk-size is not a suggestion, it's a bill your RAM is gonna have to pay.
Standard options โญ๐
Here are the Standard options specific to oracleobjectstorage (Oracle Cloud Infrastructure Object Storage).
--oos-provider ๐
Choose your Auth Provider
Properties:
- Config:
provider - Env Var:
RCLONE_OOS_PROVIDER - Type:
string - Default:
"env_auth" - Examples:
"env_auth"- automatically pickup the credentials from runtime(env), first one to provide auth wins
"user_principal_auth"- use an OCI user and an API key for authentication.
- you'll need to put in a config file your tenancy OCID, user OCID, region, the path, fingerprint to an API key.
https://docs.oracle.com/en-us/iaas/Content/API/Concepts/sdkconfig.htm
"instance_principal_auth"
- use instance principals to authorize an instance to make API calls.
- each instance has its own identity, and authenticates using the certificates that are read from instance metadata. ๐ชช
https://docs.oracle.com/en-us/iaas/Content/Identity/Tasks/callingservicesfrominstances.htm
"workload_identity_auth"- use workload identity to grant OCI Container Engine for Kubernetes workloads policy-driven access to OCI resources using OCI Identity and Access Management (IAM). ๐
https://docs.oracle.com/en-us/iaas/Content/ContEng/Tasks/contenggrantingworkloadaccesstoresources.htm
"resource_principal_auth"- use resource principals to make API calls
"no_auth"- no credentials needed, this is typically for reading public buckets ๐
--oos-namespaceโ Object storage namespace ๐๏ธ- Config:
namespace - Env Var:
RCLONE_OOS_NAMESPACE - Type:
string - Required:
true
- Config:
--oos-compartmentโ Specify compartment OCID, if you need to list buckets.
Listing objects works without a compartment OCID, bestie โ but the moment you wanna list buckets you need it. ๐
- Config:
compartment - Env Var:
RCLONE_OOS_COMPARTMENT - Provider:
!no_auth - Type:
string - Required:
false
--oos-regionโ Object storage Region ๐- Config:
region - Env Var:
RCLONE_OOS_REGION - Type:
string - Required:
true
- Config:
--oos-endpointโ Endpoint for Object storage API.
Leave it blank and rclone just uses the default endpoint for the region, no stress. โจ
- Config:
endpoint - Env Var:
RCLONE_OOS_ENDPOINT - Type:
string - Required:
false
--oos-config-fileโ Path to OCI config file ๐- Config:
config_file - Env Var:
RCLONE_OOS_CONFIG_FILE - Provider:
user_principal_auth - Type:
string - Default:
"~/.oci/config" - Examples:
"~/.oci/config"- oci configuration file location
- Config:
--oos-config-profileโ Profile name inside the oci config file ๐- Config:
config_profile - Env Var:
RCLONE_OOS_CONFIG_PROFILE - Provider:
user_principal_auth - Type:
string - Default:
"Default" - Examples:
"Default"- Use the default profile
- Config:
โจ Advanced options โจ
Ok so these are the Advanced options specific to oracleobjectstorage (Oracle Cloud Infrastructure Object Storage). The main character options, fr fr. ๐ซถ
--oos-storage-tierโ The storage class to use when storing new objects in storage.https://docs.oracle.com/en-us/iaas/Content/Object/Concepts/understandingstoragetiers.htm- Config:
storage_tier - Env Var:
RCLONE_OOS_STORAGE_TIER - Type:
string - Default:
"Standard" - Examples:
"Standard"- Standard storage tier, this is the default tier
"InfrequentAccess"- InfrequentAccess storage tier
"Archive"- Archive storage tier
- Config:
--oos-upload-cutoffโ Cutoff for switching to chunked upload. โ๏ธ
Any files larger than this get uploaded in chunks of chunk_size. The minimum is 0 and the maximum is 5 GiB. No cap.
- Config:
upload_cutoff - Env Var:
RCLONE_OOS_UPLOAD_CUTOFF - Type:
SizeSuffix - Default:
200Mi
--oos-chunk-sizeโ Chunk size to use for uploading. ๐งฉ
When you're uploading files larger than upload_cutoff, or files with unknown size (like, say, from rclone rcat, or ones uploaded with rclone mount) they get uploaded as multipart uploads using this chunk size.
Heads up: upload_concurrency chunks of this size are buffered in memory per transfer. So yeah, it's giving RAM.
If you're transferring large files over high-speed links and you have enough memory, then increasing this will speed up the transfers. ๐
Rclone will automatically increase the chunk size when uploading a large file of known size to stay below the 10,000 chunks limit.
Files of unknown size are uploaded with the configured chunk_size. Since the default chunk size is 5 MiB and there can be at most 10,000 chunks, this means that by default the maximum size of a file you can stream upload is 48 GiB. If you wish to stream upload larger files then you will need to increase chunk_size.
Increasing the chunk size decreases the accuracy of the progress statistics displayed with -P flag. ๐ญ
- Config:
chunk_size - Env Var:
RCLONE_OOS_CHUNK_SIZE - Type:
SizeSuffix - Default:
5Mi
--oos-max-upload-partsโ Maximum number of parts in a multipart upload. ๐งฎ
This option defines the maximum number of multipart chunks to use when doing a multipart upload.
OCI has max parts limit of 10,000 chunks.
Rclone will automatically increase the chunk size when uploading a large file of a known size to stay below this number of chunks limit.
- Config:
max_upload_parts - Env Var:
RCLONE_OOS_MAX_UPLOAD_PARTS - Type:
int - Default:
10000
--oos-upload-concurrencyโ Concurrency for multipart uploads. ๐ฅ
This is the number of chunks of the same file that are uploaded concurrently.
If you are uploading small numbers of large files over high-speed links and these uploads do not fully utilize your bandwidth, then increasing this may help to speed up the transfers.
- Config:
upload_concurrency - Env Var:
RCLONE_OOS_UPLOAD_CONCURRENCY - Type:
int - Default:
10
--oos-copy-cutoffโ Cutoff for switching to multipart copy. ๐
Any files larger than this that need to be server-side copied will be copied in chunks of this size.
The minimum is 0 and the maximum is 5 GiB.
- Config:
copy_cutoff - Env Var:
RCLONE_OOS_COPY_CUTOFF - Type:
SizeSuffix - Default:
4.656Gi
--oos-copy-timeoutโ Timeout for copy. โณ
Copy is an asynchronous operation, so specify a timeout to wait for the copy to succeed.
- Config:
copy_timeout - Env Var:
RCLONE_OOS_COPY_TIMEOUT - Type:
Duration - Default:
1m0s
--oos-disable-checksumโ Don't store MD5 checksum with object metadata. ๐
Normally rclone will calculate the MD5 checksum of the input before uploading it so it can add it to metadata on the object. This is great for data integrity checking but can cause long delays for large files to start uploading.
- Config:
disable_checksum - Env Var:
RCLONE_OOS_DISABLE_CHECKSUM - Type:
bool - Default:
false
--oos-encodingโ The encoding for the backend. ๐ค
See the encoding section in the overview (https://rclone.org/overview/#encoding) for more info.
- Config:
encoding - Env Var:
RCLONE_OOS_ENCODING - Type:
Encoding - Default:
Slash,InvalidUtf8,Dot
--oos-leave-parts-on-errorโ If true avoid calling abort upload on a failure, leaving all successfully uploaded parts for manual recovery. ๐
It should be set to true for resuming uploads across different sessions.
WARNING: Storing parts of an incomplete multipart upload counts towards space usage on object storage and will add additional costs if not cleaned up. Not the vibe, bestie. ๐จ
- Config:
leave_parts_on_error - Env Var:
RCLONE_OOS_LEAVE_PARTS_ON_ERROR - Type:
bool - Default:
false
--oos-attempt-resume-uploadโ If true attempt to resume previously started multipart upload for the object. This will be helpful to speed up multipart transfers by resuming uploads from a past session. โช
WARNING: If chunk size differs in the resumed session from the past incomplete session, then the resumed multipart upload is aborted and a new multipart upload is started with the new chunk size. ๐ฑ
The flag leave_parts_on_error must be true to resume and optimize to skip parts that were already uploaded successfully.
- Config:
attempt_resume_upload - Env Var:
RCLONE_OOS_ATTEMPT_RESUME_UPLOAD - Type:
bool - Default:
false
--oos-no-check-bucketโ If set, don't attempt to check the bucket exists or create it. ๐ชฃ
This can be useful when trying to minimise the number of transactions rclone does if you know the bucket exists already.
It can also be needed if the user you are using does not have bucket creation permissions.
- Config:
no_check_bucket - Env Var:
RCLONE_OOS_NO_CHECK_BUCKET - Type:
bool - Default:
false
--oos-sse-customer-key-fileโ To use SSE-C, a file containing the base64-encoded string of the AES-256 encryption key associated with the object. ๐ Please note only one ofsse_customer_key_file|sse_customer_key|sse_kms_key_idis needed.'- Config:
sse_customer_key_file - Env Var:
RCLONE_OOS_SSE_CUSTOMER_KEY_FILE - Type:
string - Required:
false - Examples:
""- None
- Config:
--oos-sse-customer-keyโ To use SSE-C, the optional header that specifies the base64-encoded 256-bit encryption key to use to encrypt or decrypt the data. ๐ Please note only one ofsse_customer_key_file|sse_customer_key|sse_kms_key_idis needed. For more information, see Using Your Own Keys for Server-Side Encryption (https://docs.cloud.oracle.com/Content/Object/Tasks/usingyourencryptionkeys.htm)- Config:
sse_customer_key - Env Var:
RCLONE_OOS_SSE_CUSTOMER_KEY - Type:
string - Required:
false - Examples:
""- None
- Config:
--oos-sse-customer-key-sha256โ If using SSE-C, The optional header that specifies the base64-encoded SHA256 hash of the encryption key. This value is used to check the integrity of the encryption key. see Using Your Own Keys for Server-Side Encryption (https://docs.cloud.oracle.com/Content/Object/Tasks/usingyourencryptionkeys.htm). ๐งพ- Config:
sse_customer_key_sha256 - Env Var:
RCLONE_OOS_SSE_CUSTOMER_KEY_SHA256 - Type:
string - Required:
false - Examples:
""- None
- Config:
--oos-sse-kms-key-idโ if using your own master key in vault, this header specifies the OCID (https://docs.cloud.oracle.com/Content/General/Concepts/identifiers.htm) of a master encryption key used to call the Key Management service to generate a data encryption key or to encrypt or decrypt a data encryption key. ๐๏ธ Please note only one ofsse_customer_key_file|sse_customer_key|sse_kms_key_idis needed.- Config:
sse_kms_key_id - Env Var:
RCLONE_OOS_SSE_KMS_KEY_ID - Type:
string - Required:
false - Examples:
""- None
- Config:
okay bestie we're back in Oracle Object Storage land and we are still going through flags โจ buckle up, we're basically fluent in OOS now ๐
--oos-sse-customer-algorithmโ bestie if you're doing SSE-C, this is the optional header that says the encryption algorithm is"AES256". Object Storage supports"AES256"as the encryption algorithm. For more deets, go read Using Your Own Keys for Server-Side Encryption athttps://docs.cloud.oracle.com/Content/Object/Tasks/usingyourencryptionkeys.htm๐ซถ
Properties, no skipping:
- Config:
sse_customer_algorithm - Env Var:
RCLONE_OOS_SSE_CUSTOMER_ALGORITHM - Type: string
- Required: false
- Examples:
""- None
"AES256"- AES256
--oos-decompressโ set this and rclone will decompress gzip encoded objects ๐ซง
So here's the situation: you can upload objects to object storage with Content-Encoding: gzip set on them. Normally rclone will just download those files as compressed objects, no biggie.
But if this flag is on, rclone decompresses these files with Content-Encoding: gzip as they arrive. Which sounds iconic until you remember โ because of that, rclone can't check the size and hash ๐ญ but the file contents will be decompressed. Tradeoffs, bestie.
Properties:
- Config:
decompress - Env Var:
RCLONE_OOS_DECOMPRESS - Type: bool
- Default: false
--oos-descriptionโ a lil description of the remote, so future you remembers what this thing even is ๐
Properties:
- Config:
description - Env Var:
RCLONE_OOS_DESCRIPTION - Type: string
- Required: false
๐ธ Metadata ๐ธ
User metadata is stored as opc-meta- keys. Not me being obsessed with prefix naming conventions, but periodt.
Here are the possible system metadata items for the oracleobjectstorage backend:
opc-meta-atimeโ Time of last access. Type: ISO 8601. Example:2025-06-30T22:27:43-04:00. Read Only: Nopc-meta-btimeโ Time of file birth (creation). Type: ISO 8601. Example:2025-06-30T22:27:43-04:00. Read Only: Nopc-meta-gidโ Group ID of owner. Type: decimal number. Example:500. Read Only: Nopc-meta-modeโ File type and mode. Type: octal, unix style. Example:0100664. Read Only: Nopc-meta-mtimeโ Time of last modification. Type: ISO 8601. Example:2025-06-30T22:27:43-04:00. Read Only: Nopc-meta-uidโ User ID of owner. Type: decimal number. Example:500. Read Only: N
See the metadata docs at https://rclone.org/docs/#metadata for more info ๐
๐ Backend commands ๐
Here are the commands specific to the oracleobjectstorage backend. It's giving custom, it's giving exclusive ๐ฅ
Run them with:
rclone backend COMMAND remote:
The help below explains what arguments each command takes.
See the backend command at https://rclone.org/commands/rclone_backend/ for more info on how to pass options and arguments.
These can be run on a running backend using the rc command backend/command โ docs at https://rclone.org/rc/#backend-command โจ
rename
change the name of an object. very demure, very mindful ๐
rclone backend rename remote: [options] [<arguments>+]
This command can be used to rename a object.
Usage example:
rclone backend rename oos:bucket relative-object-path-under-bucket object-new-name
list-multipart-uploads
List the unfinished multipart uploads. the messy ones. we're calling them out ๐
rclone backend list-multipart-uploads remote: [options] [<arguments>+]
This command lists the unfinished multipart uploads in JSON format.
Usage example:
rclone backend list-multipart-uploads oos:bucket/path/to/object
It returns a dictionary of buckets with values as lists of unfinished multipart uploads.
You can call it with no bucket in which case it lists all bucket, with a bucket or with a bucket and path.
{
"test-bucket": [
{
"namespace": "test-namespace",
"bucket": "test-bucket",
"object": "600m.bin",
"uploadId": "51dd8114-52a4-b2f2-c42f-5291f05eb3c8",
"timeCreated": "2022-07-29T06:21:16.595Z",
"storageTier": "Standard"
}
]
}
cleanup
Remove unfinished multipart uploads. spring cleaning era ๐งนโจ
rclone backend cleanup remote: [options] [<arguments>+]
This command removes unfinished multipart uploads of age greater than max-age which defaults to 24 hours.
Note that you can use --interactive/-i or --dry-run with this command to see what it would do.
Usage examples:
rclone backend cleanup oos:bucket/path/to/object
rclone backend cleanup -o max-age=7w oos:bucket/path/to/object
Durations are parsed as per the rest of rclone, 2h, 7d, 7w etc.
Options:
"max-age": Max age of upload to delete.
restore
Restore objects from Archive to Standard storage. bring them back from the archives bestie, main character resurrection arc ๐
rclone backend restore remote: [options] [<arguments>+]
This command can be used to restore one or more objects from Archive to Standard storage.
Usage examples:
rclone backend restore oos:bucket/path/to/directory -o hours=HOURS
rclone backend restore oos:bucket -o hours=HOURS
This flag also obeys the filters. Test first with --interactive/-i or --dry-run flags โ please please please test first ๐
rclone --interactive backend restore --include "*.txt" oos:bucket/path -o hours=72
All the objects shown will be marked for restore, then:
rclone backend restore --include "*.txt" oos:bucket/path -o hours=72
It returns a list of status dictionaries with Object Name and Status keys. The Status will be "RESTORED"" if it was successful or an error message if not.
[
{
"Object": "test.txt"
"Status": "RESTORED",
},
{
"Object": "test/file4.txt"
"Status": "RESTORED",
}
]
Options:
"hours": The number of hours for which this object will be restored. Default is 24 hrs.
๐ Tutorials ๐
Mounting Buckets โ head to https://rclone.org/oracleobjectstorage/tutorial_mount/ and get you some ๐ฆ
โจ QingStor โจ
Bestie, paths are literally remote:bucket (or just remote: if you're doing the lsd command, cute). You can tuck subdirectories in there too, like remote:bucket/path/to/dir ๐ซถ
๐ Configuration
Okay so here's how you make a QingStor config. First, run:
rclone config
It's giving guided tour, and it'll walk you through the whole interactive setup. Look:
No remotes found, make a new one\?
n) New remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
n/r/c/s/q> n
name> remote
Type of storage to configure.
Choose a number from below, or type in your own value
[snip]
XX / QingStor Object Storage
\ "qingstor"
[snip]
Storage> qingstor
Get QingStor credentials from runtime. Only applies if access_key_id and secret_access_key is blank.
Choose a number from below, or type in your own value
1 / Enter QingStor credentials in the next step
\ "false"
2 / Get QingStor credentials from the environment (env vars or IAM)
\ "true"
env_auth> 1
QingStor Access Key ID - leave blank for anonymous access or runtime credentials.
access_key_id> access_key
QingStor Secret Access Key (password) - leave blank for anonymous access or runtime credentials.
secret_access_key> secret_key
Enter an endpoint URL to connection QingStor API.
Leave blank will use the default value "https://qingstor.com:443"
endpoint>
Zone connect to. Default is "pek3a".
Choose a number from below, or type in your own value
/ The Beijing (China) Three Zone
1 | Needs location constraint pek3a.
\ "pek3a"
/ The Shanghai (China) First Zone
2 | Needs location constraint sh1a.
\ "sh1a"
zone> 1
Number of connection retry.
Leave blank will use the default value "3".
connection_retries>
Remote config
Configuration complete.
Options:
- type: qingstor
- env_auth: false
- access_key_id: access_key
- secret_access_key: secret_key
- endpoint:
- zone: pek3a
- connection_retries:
Keep this "remote" remote?
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d> y
So this remote is called remote, and now you can use it all over the place, like so ๐
See all buckets:
rclone lsd remote:
Make a new bucket:
rclone mkdir remote:bucket
List the contents of a bucket:
rclone ls remote:bucket
Sync /home/local/directory to the remote bucket, deleting any excess files in the bucket (periodt):
rclone sync --interactive /home/local/directory remote:bucket
๐ฆ --fast-list
This remote is on the --fast-list roster, meaning you can use fewer transactions in exchange for more memory. It's giving trade-off, and if you want the tea, go read the rclone docs at https://rclone.org/docs/#fast-list ๐ฅ
๐ Multipart uploads
rclone supports multipart uploads with QingStor, which means it can upload files bigger than 5 GiB. Not to be dramatic but that's iconic. Just know that files uploaded with multipart upload don't have an MD5SUM โ that's just how it is, no cap ๐ญ
Also, incomplete multipart uploads older than 24 hours can be removed with rclone cleanup remote:bucket for just one bucket, or rclone cleanup remote: for all buckets. And here's the thing: QingStor does not ever remove incomplete multipart uploads, so you may need to run this from time to time. Like, housekeeping bestie, don't skip it ๐งน
๐ธ Buckets and Zone
With QingStor you can list buckets (rclone lsd) using any zone, but you can only access the content of a bucket from the zone it was created in. Which is lowkey annoying but that's the vibe. If you try to access a bucket from the wrong zone you'll get an error: incorrect zone, the bucket is not in 'XXX' zone. Rude, but noted ๐
๐ Authentication
There are two ways to hand rclone a set of QingStor credentials. In order of precedence:
- Directly in the rclone configuration file (as configured by
rclone config)- set
access_key_idandsecret_access_key
- set
- Runtime configuration:
- set
env_authtotruein the config file - Exporting the following environment variables before running rclone
- Access Key ID:
QS_ACCESS_KEY_IDorQS_ACCESS_KEY - Secret Access Key:
QS_SECRET_ACCESS_KEYorQS_SECRET_KEY
- Access Key ID:
- set
โญ Restricted filename characters
The control characters 0x00-0x1F and / are replaced, just like in the default restricted characters set (https://rclone.org/overview/#restricted-characters). Heads up though: 0x7F is not replaced. ๐
Invalid UTF-8 bytes will also be replaced (https://rclone.org/overview/#invalid-utf8), because they literally can't be used in JSON strings. Slay for safety.
๐ Standard options
Here are the Standard options specific to qingstor (QingCloud Object Storage):
--qingstor-env-auth
Get QingStor credentials from runtime. Only applies if access_key_id and secret_access_key is blank. Main character energy for the auth flow.
Properties:
- Config:
env_auth - Env Var:
RCLONE_QINGSTOR_ENV_AUTH - Type: bool
- Default: false
- Examples:
"false"- Enter QingStor credentials in the next step.
"true"- Get QingStor credentials from the environment (env vars or IAM).
--qingstor-access-key-id
QingStor Access Key ID. Leave blank for anonymous access or runtime credentials. ๐
Properties:
- Config:
access_key_id - Env Var:
RCLONE_QINGSTOR_ACCESS_KEY_ID - Type: string
- Required: false
--qingstor-secret-access-key
QingStor Secret Access Key (password). Leave blank for anonymous access or runtime credentials. Keep it secret, keep it safe bestie ๐คซ
Properties:
- Config:
secret_access_key - Env Var:
RCLONE_QINGSTOR_SECRET_ACCESS_KEY - Type: string
- Required: false
--qingstor-endpoint
Enter an endpoint URL to connection QingStor API. Leave blank will use the default value "https://qingstor.com:443".
Properties:
- Config:
endpoint - Env Var:
RCLONE_QINGSTOR_ENDPOINT - Type: string
- Required: false
--qingstor-zone
Zone to connect to. Default is "pek3a".
Properties:
- Config:
zone - Env Var:
RCLONE_QINGSTOR_ZONE - Type: string
- Required: false
- Examples:
"pek3a"- The Beijing (China) Three Zone.
- Needs location constraint
pek3a.
"sh1a"- The Shanghai (China) First Zone.
- Needs location constraint
sh1a.
"gd2a"- The Guangdong (China) Second Zone.
- Needs location constraint
gd2a.
๐ Advanced options
Here are the Advanced options specific to qingstor (QingCloud Object Storage):
--qingstor-connection-retries
Number of connection retries. Because sometimes the internet is not giving ๐ซ
Properties:
- Config:
connection_retries - Env Var:
RCLONE_QINGSTOR_CONNECTION_RETRIES - Type: int
- Default: 3
--qingstor-upload-cutoff
Cutoff for switching to chunked upload. Any files larger than this will be uploaded in chunks of chunk_size. The minimum is 0 and the maximum is 5 GiB.
Properties:
- Config:
upload_cutoff - Env Var:
RCLONE_QINGSTOR_UPLOAD_CUTOFF - Type: SizeSuffix
- Default: 200Mi
--qingstor-chunk-size
Chunk size to use for uploading. When uploading files larger than upload_cutoff they will be uploaded as multipart uploads using this chunk size.
Note that --qingstor-upload-concurrency chunks of this size are buffered in memory per transfer. ๐
If you are transferring large files over high-speed links and you have enough memory, then increasing this will speed up the transfers. Fire ๐ฅ
Properties:
- Config:
chunk_size - Env Var:
RCLONE_QINGSTOR_CHUNK_SIZE - Type: SizeSuffix
- Default: 4Mi
--qingstor-upload-concurrency
Concurrency for multipart uploads. This is the number of chunks of the same file that are uploaded concurrently.
NB if you set this to > 1 then the checksums of multipart uploads become corrupted (the uploads themselves are not corrupted though). Not a drill, bestie ๐ญ
If you are uploading small numbers of large files over high-speed links and these uploads do not fully utilize your bandwidth, then increasing this may help to speed up the transfers.
Properties:
- Config:
upload_concurrency - Env Var:
RCLONE_QINGSTOR_UPLOAD_CONCURRENCY - Type: int
- Default: 1
--qingstor-encoding
The encoding for the backend. See the encoding section in the overview (https://rclone.org/overview/#encoding) for more info.
Properties:
- Config:
encoding - Env Var:
RCLONE_QINGSTOR_ENCODING - Type: Encoding
- Default:
Slash,Ctl,InvalidUtf8
--qingstor-description
Description of the remote. Just a lil label for your baby โจ
Properties:
- Config:
description - Env Var:
RCLONE_QINGSTOR_DESCRIPTION - Type: string
- Required: false
๐ Limitations
rclone about is not supported by the qingstor backend. Which means backends without this capability can't determine free space for an rclone mount, and can't use policy mfs (most free space) as a member of an rclone union remote. Sad but true ๐ญ
See List of backends that do not support rclone about (https://rclone.org/overview/#optional-features) and rclone about (https://rclone.org/commands/rclone_about/).
๐ Quatrix ๐
Quatrix by Maytech is Quatrix Secure Compliant File Sharing | Maytech (https://www.maytech.net/products/quatrix-business).
Paths are specified as remote:path
Paths may be as deep as required, e.g., remote:directory/subdirectory.
The initial setup for Quatrix involves getting an API Key from Quatrix. You can get the API key in the user's profile at https://<account>/profile/api-keys or with the help of the API - <https://docs.maytech.net/quatrix/quatrix-api/api-explorer#/API-Key/post_api_key_create>.
See complete Swagger documentation for Quatrix (https://docs.maytech.net/quatrix/quatrix-api/api-explorer).
๐ ๏ธ Configuration
Here's a lil example of how to make a remote called remote. First run:
rclone config
This will guide you through an interactive setup process:
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
name> remote
Type of storage to configure.
Choose a number from below, or type in your own value
[snip]
XX / Quatrix by Maytech
\ "quatrix"
[snip]
Storage> quatrix
API key for accessing Quatrix account.
api_key> your_api_key
Host name of Quatrix account.
host> example.quatrix.it
Configuration complete.
Options:
- type: quatrix
- api_key: your_api_key
- host: example.quatrix.it
Keep this "remote" remote?
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d> y
Once you've configured it you can then use rclone like this (replace remote with the name you gave your remote, bestie ๐
):
List directories in top level of your Quatrix
rclone lsd remote:
List all the files in your Quatrix
rclone ls remote:
To copy a local directory to an Quatrix directory called backup
rclone copy /home/source remote:backup
๐ API key validity
API Key is created with no expiration date. It will be valid until you delete or deactivate it in your account. After disabling, the API Key can be enabled back. If the API Key was deleted and a new key was created, you can update it in rclone config. The same happens if the hostname was changed.
$ rclone config
Current remotes:
Name Type
==== ====
remote quatrix
e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
e/n/d/r/c/s/q> e
Choose a number from below, or type in an existing value
1 > remote
remote> remote
Configuration complete.
Options:
- type: quatrix
- host: some_host.quatrix.it
- api_key: your_api_key
Keep this "remote" remote?
Edit remote
Option api_key.
API key for accessing Quatrix account
Enter a string value. Press Enter for the default (your_api_key)
api_key>
Option host.
Host name of Quatrix account
Enter a string value. Press Enter for the default (some_host.quatrix.it).
Configuration complete.
Options:
- type: quatrix
- host: some_host.quatrix.it
- api_key: your_api_key
Keep this "remote" remote?
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d> y
โฐ Modification times and hashes
Quatrix allows modification times to be set on objects accurate to 1 microsecond. These will be used to detect whether objects need syncing or not. So precise, we love that โจ
Quatrix does not support hashes, so you cannot use the --checksum flag. That's just how it is, fr fr ๐ญ
๐ซ Restricted filename characters
File names in Quatrix are case sensitive and have limitations like the maximum length of a filename is 255, and the minimum length is 1. A file name cannot be equal to . or .. nor contain / , \ or non-printable ascii.
๐ค Transfers
For files above 50 MiB rclone will use a chunked transfer. Rclone will upload up to --transfers chunks at the same time (shared among all multipart uploads). Chunks are buffered in memory, and the minimal chunk size is 10_000_000 bytes by default, and it can be changed in the advanced configuration, so increasing --transfers will increase the memory use. The chunk size has a maximum size limit, which is set to 100_000_000 bytes by default and can be changed in the advanced configuration. The size of the uploaded chunk will dynamically change depending on the upload speed. The total memory use equals the number of transfers multiplied by the minimal chunk size. In case there's free memory allocated for the upload (which equals the difference of maximal_summary_chunk_size and minimal_chunk_size * transfers), the chunk size may increase in case of high upload speed. As well as it can decrease in case of upload speed problems. If no free memory is available, all chunks will equal minimal_chunk_size. ๐ง โจ
๐๏ธ Deleting files
Files you delete with rclone will end up in Trash and be stored there for 30 days. Quatrix also provides an API to permanently delete files and an API to empty the Trash so that you can remove files permanently from your account. Iconic behavior honestly ๐
โ๏ธ Standard options
Here are the Standard options specific to quatrix (Quatrix by Maytech).
--quatrix-api-key
API key for accessing Quatrix account
Properties:
- Config:
api_key - Env Var:
RCLONE_QUATRIX_API_KEY - Type:
string - Required:
true
--quatrix-host
Host name of Quatrix account
Properties:
- Config:
host - Env Var:
RCLONE_QUATRIX_HOST - Type:
string - Required:
true
๐ Advanced options
Here are the Advanced options specific to quatrix (Quatrix by Maytech).
--quatrix-encoding
The encoding for the backend.
See the encoding section in the overview (https://rclone.org/overview/#encoding) for more info.
Properties:
- Config:
encoding - Env Var:
RCLONE_QUATRIX_ENCODING - Type:
Encoding - Default:
Slash,BackSlash,Del,Ctl,InvalidUtf8,Dot
--quatrix-effective-upload-time
Wanted upload time for one chunk
Properties:
- Config:
effective_upload_time - Env Var:
RCLONE_QUATRIX_EFFECTIVE_UPLOAD_TIME - Type:
string - Default:
"4s"
--quatrix-minimal-chunk-size
The minimal size for one chunk
Properties:
- Config:
minimal_chunk_size - Env Var:
RCLONE_QUATRIX_MINIMAL_CHUNK_SIZE - Type:
SizeSuffix - Default:
9.537Mi
--quatrix-maximal-summary-chunk-size
The maximal summary for all chunks. It should not be less than 'transfers'*'minimal_chunk_size'
Properties:
- Config:
maximal_summary_chunk_size - Env Var:
RCLONE_QUATRIX_MAXIMAL_SUMMARY_CHUNK_SIZE - Type:
SizeSuffix - Default:
95.367Mi
--quatrix-hard-delete
Delete files permanently rather than putting them into the trash
Properties:
- Config:
hard_delete - Env Var:
RCLONE_QUATRIX_HARD_DELETE - Type:
bool - Default:
false
--quatrix-skip-project-folders
Skip project folders in operations
Properties:
- Config:
skip_project_folders - Env Var:
RCLONE_QUATRIX_SKIP_PROJECT_FOLDERS - Type:
bool - Default:
false
--quatrix-description
Description of the remote.
Properties:
- Config:
description - Env Var:
RCLONE_QUATRIX_DESCRIPTION - Type:
string - Required:
false
๐ฆ Storage usage
The storage usage in Quatrix is restricted to the account during the purchase. You can restrict any user with a smaller storage limit. The account limit is applied if the user has no custom storage limit. Once you've reached the limit, the upload of files will fail. This can be fixed by freeing up the space or increasing the quota. โจ
okay so if your uploads are suddenly failing, it's probably the quota. free up space or bump it, bestie, no biggie ๐ซถ
๐ค Server-side operations
Quatrix supports server-side operations (copy and move). In case of conflict, files are overwritten during server-side operation. The way that everything just moves on the server side? obsessed ๐ ๐ฆ
๐ฆ Sia ๐ฆ
Sia (sia.tech (<https://sia.tech/>)) is a decentralized cloud storage platform built on top of blockchain (<https://wikipedia.org/wiki/Blockchain>) technology. bestie, with rclone you can just use it like any other remote filesystem, or even mount Sia folders right on your local machine. the tech behind it involves a whole bunch of new concepts โ Siacoins and Wallet, Blockchain and Consensus, Renting and Hosting, and so on. if you're new to all this, lowkey please go familiarise yourself first using their excellent support documentation (<https://support.sia.tech/>). it's giving homework but it's worth it bestie. ๐
โจ Introduction โจ
Before you can use rclone with Sia, you'll need a running copy of Sia-UI or siad (the Sia daemon) locally on your computer or on your local network (e.g. a NAS). pls follow the Get started (<https://sia.tech/get-started>) guide and install one of them. no skipping, fr fr.
rclone interacts with the Sia network by talking to the Sia daemon via HTTP API (<https://docs.sia.tech/>), which is usually available on port 9980. by default you'll be running the daemon locally on the same computer, so it's totally safe to leave the API password blank โ the API URL will be http://127.0.0.1:9980, which makes external access impossible. iconic security-by-default behaviour, we love to see it. ๐
However, if you want to access a Sia daemon running on another node โ for example because of memory constraints, or because you want to share a single daemon between several rclone and Sia-UI instances โ you'll need to make a few more provisions:
- Ensure you have Sia daemon installed directly or in a docker container (<https://github.com/SiaFoundation/siad/pkgs/container/siad>) because Sia-UI does not support this mode natively.
- Run it on an externally accessible port, for example provide
--api-addr :9980and--disable-api-securityarguments on the daemon command line. - Enforce API password for the
siaddaemon via environment variableSIA_API_PASSWORDor text file namedapipasswordin the daemon directory. - Set rclone backend option
api_passwordtaking it from above locations.
Notes, bestie, read these, they matter:
- If your wallet is locked, rclone cannot unlock it automatically. You should either unlock it in advance by using Sia-UI or via command line
siac wallet unlock. Alternatively you can makesiadunlock your wallet automatically upon startup by running it with environment variableSIA_WALLET_PASSWORD. - If
siadcannot find theSIA_API_PASSWORDvariable or theapipasswordfile in theSIA_DIRdirectory, it will generate a random password and store in the text file namedapipasswordunderYOUR_HOME/.sia/directory on Unix orC:\Users\YOUR_HOME\AppData\Local\Sia\apipasswordon Windows. Remember this when you configure password in rclone. ๐ฅ - The only way to use
siadwithout API password is to run it on localhost with command line argument--authorize-api=false, but this is insecure and strongly discouraged.
๐จ okay so note 3 is the "please don't" one. running without an API password is insecure and strongly discouraged. do not do the thing. the vibes are bad on that one, periodt.
๐ธ Configuration ๐ธ
Here's an example of how to make a sia remote called mySia. First, run:
rclone config
This will guide you through an interactive setup process:
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
name> mySia
Type of storage to configure.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
...
29 / Sia Decentralized Cloud
\ "sia"
...
Storage> sia
Sia daemon API URL, like http://sia.daemon.host:9980.
Note that siad must run with --disable-api-security to open API port for other hosts (not recommended).
Keep default if Sia daemon runs on localhost.
Enter a string value. Press Enter for the default ("http://127.0.0.1:9980").
api_url> http://127.0.0.1:9980
Sia Daemon API Password.
Can be found in the apipassword file located in HOME/.sia/ or in the daemon directory.
y) Yes type in my own password
g) Generate random password
n) No leave this optional password blank (default)
y/g/n> y
Enter the password:
password:
Confirm the password:
password:
Edit advanced config?
y) Yes
n) No (default)
y/n> n
--------------------
[mySia]
type = sia
api_url = http://127.0.0.1:9980
api_password = *** ENCRYPTED ***
--------------------
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d> y
Once configured, you can then use rclone like this:
- List directories in top level of your Sia storage
rclone lsd mySia:
- List all the files in your Sia storage
rclone ls mySia:
- Upload a local directory to the Sia directory called
backup
rclone copy /home/source mySia:backup
๐ Standard options ๐
Here are the Standard options specific to sia (Sia Decentralized Cloud). ๐
๐ --sia-api-url
Sia daemon API URL, like http://sia.daemon.host:9980.
Note that siad must run with --disable-api-security to open API port for other hosts (not recommended). Keep default if Sia daemon runs on localhost.
Properties:
- Config:
api_url - Env Var:
RCLONE_SIA_API_URL - Type: string
- Default:
"http://127.0.0.1:9980"
๐ --sia-api-password
Sia Daemon API Password.
Can be found in the apipassword file located in HOME/.sia/ or in the daemon directory.
NB Input to this must be obscured โ see rclone obscure (<https://rclone.org/commands/rclone_obscure/>).
Properties:
- Config:
api_password - Env Var:
RCLONE_SIA_API_PASSWORD - Type: string
- Required: false
๐ Advanced options ๐
Here are the Advanced options specific to sia (Sia Decentralized Cloud). โจ
๐ --sia-user-agent
Siad User Agent
Sia daemon requires the 'Sia-Agent' user agent by default for security. yes it's literally checking your ID at the door. ๐
Properties:
- Config:
user_agent - Env Var:
RCLONE_SIA_USER_AGENT - Type: string
- Default:
"Sia-Agent"
๐ --sia-encoding
The encoding for the backend.
See the encoding section in the overview (<https://rclone.org/overview/#encoding>) for more info.
Properties:
- Config:
encoding - Env Var:
RCLONE_SIA_ENCODING - Type: Encoding
- Default:
Slash,Question,Hash,Percent,Del,Ctl,InvalidUtf8,Dot
๐ --sia-description
Description of the remote.
Properties:
- Config:
description - Env Var:
RCLONE_SIA_DESCRIPTION - Type: string
- Required: false
๐ Limitations ๐
- Modification times not supported
- Checksums not supported
rclone aboutnot supported- rclone can work only with
SiadorSia-UIat the moment, the SkyNet daemon is not supported yet. - Sia does not allow control characters or symbols like question and pound signs in file names. rclone will transparently encode (<https://rclone.org/overview/#encoding>) them for you, but you'd better be aware. ๐
๐ฆ Swift ๐ฆ
Swift refers to OpenStack Object Storage (<https://docs.openstack.org/swift/latest/>). Commercial implementations of that being:
- Rackspace Cloud Files (<https://www.rackspace.com/cloud/files/>)
- Memset Memstore (<https://www.memset.com/cloud/storage/>)
- OVH Object Storage (<https://www.ovhcloud.com/en/public-cloud/object-storage/>)
- Oracle Cloud Storage (<https://docs.oracle.com/en-us/iaas/integration/doc/configure-object-storage.html>)
- Blomp Cloud Storage (<https://www.blomp.com/cloud-storage/>)
- IBM Bluemix Cloud ObjectStorage Swift (<https://console.bluemix.net/docs/infrastructure/objectstorage-swift/index.html>)
Paths are specified as remote:container (or remote: for the lsd command.) You may put subdirectories in too, e.g. remote:container/path/to/dir. no cap, that's the whole path vibe. ๐ซถ
๐ธ Configuration ๐ธ
Here's an example of making a swift configuration. First run
rclone config
This will guide you through an interactive setup process.
okay bestie, buckle up, because this is what the whole thing looks like when you actually run it ๐
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
name> remote
Type of storage to configure.
Choose a number from below, or type in your own value
[snip]
XX / OpenStack Swift (Rackspace Cloud Files, Blomp Cloud Storage, Memset Memstore, OVH)
\ "swift"
[snip]
Storage> swift
Get swift credentials from environment variables in standard OpenStack form.
Choose a number from below, or type in your own value
1 / Enter swift credentials in the next step
\ "false"
2 / Get swift credentials from environment vars. Leave other fields blank if using this.
\ "true"
env_auth> true
User name to log in (OS_USERNAME).
user>
API key or password (OS_PASSWORD).
key>
Authentication URL for server (OS_AUTH_URL).
Choose a number from below, or type in your own value
1 / Rackspace US
\ "https://auth.api.rackspacecloud.com/v1.0"
2 / Rackspace UK
\ "https://lon.auth.api.rackspacecloud.com/v1.0"
3 / Rackspace v2
\ "https://identity.api.rackspacecloud.com/v2.0"
4 / Memset Memstore UK
\ "https://auth.storage.memset.com/v1.0"
5 / Memset Memstore UK v2
\ "https://auth.storage.memset.com/v2.0"
6 / OVH
\ "https://auth.cloud.ovh.net/v3"
7 / Blomp Cloud Storage
\ "https://authenticate.ain.net"
auth>
User ID to log in - optional - most swift systems use user and leave this blank (v3 auth) (OS_USER_ID).
user_id>
User domain - optional (v3 auth) (OS_USER_DOMAIN_NAME)
domain>
Tenant name - optional for v1 auth, this or tenant_id required otherwise (OS_TENANT_NAME or OS_PROJECT_NAME)
tenant>
Tenant ID - optional for v1 auth, this or tenant required otherwise (OS_TENANT_ID)
tenant_id>
Tenant domain - optional (v3 auth) (OS_PROJECT_DOMAIN_NAME)
tenant_domain>
Region name - optional (OS_REGION_NAME)
region>
Storage URL - optional (OS_STORAGE_URL)
storage_url>
Auth Token from alternate authentication - optional (OS_AUTH_TOKEN)
auth_token>
AuthVersion - optional - set to (1,2,3) if your auth URL has no version (ST_AUTH_VERSION)
auth_version>
Endpoint type to choose from the service catalogue (OS_ENDPOINT_TYPE)
Choose a number from below, or type in your own value
1 / Public (default, choose this if not sure)
\ "public"
2 / Internal (use internal service net)
\ "internal"
3 / Admin
\ "admin"
endpoint_type>
Remote config
--------------------
[test]
env_auth = true
user =
key =
auth =
user_id =
domain =
tenant =
tenant_id =
tenant_domain =
region =
storage_url =
auth_token =
auth_version =
endpoint_type =
--------------------
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d> y
This remote is called remote and can now be used like this ๐
See all containers
rclone lsd remote:
Make a new container
rclone mkdir remote:container
List the contents of a container
rclone ls remote:container
Sync /home/local/directory to the remote container, deleting any excess files in the container.
rclone sync --interactive /home/local/directory remote:container
๐ธ Configuration from an OpenStack credentials file ๐ธ
An OpenStack credentials file typically looks something like this (without the comments, bestie โ the comments are for us)
export OS_AUTH_URL=https://a.provider.net/v2.0
export OS_TENANT_ID=ffffffffffffffffffffffffffffffff
export OS_TENANT_NAME="1234567890123456"
export OS_USERNAME="123abc567xy"
echo "Please enter your OpenStack Password: "
read -sr OS_PASSWORD_INPUT
export OS_PASSWORD=$OS_PASSWORD_INPUT
export OS_REGION_NAME="SBG1"
if [ -z "$OS_REGION_NAME" ]; then unset OS_REGION_NAME; fi
The config file needs to look something like this, where $OS_USERNAME represents the value of the OS_USERNAME variable โ 123abc567xy in the example above. Slay ๐
[remote]
type = swift
user = $OS_USERNAME
key = $OS_PASSWORD
auth = $OS_AUTH_URL
tenant = $OS_TENANT_NAME
ngl, you may (or may not) need to set region too โ try without it first, fr fr.
๐ฆ Configuration from the environment ๐ฆ
If you prefer, you can configure rclone to use swift using a standard set of OpenStack environment variables. Main character energy โจ
When you run through the config, make sure you choose true for env_auth and leave everything else blank. That's the whole vibe.
rclone will then set any empty config parameters from the environment using standard OpenStack environment variables. There is a list of the variables in the docs for the swift library: https://godoc.org/github.com/ncw/swift#Connection.ApplyEnvironment
๐ฅ Using an alternate authentication method ๐ฅ
If your OpenStack installation uses a non-standard authentication method that might not be yet supported by rclone or the underlying swift library, you can authenticate externally (like, calling the openstack commands manually to get a token, iykyk). Then you just need to pass the two configuration variables auth_token and storage_url. If they are both provided, the other variables are ignored โ rclone will not try to authenticate, but instead assume it is already authenticated and use these two variables to access the OpenStack installation. Periodt.
๐ Using rclone without a config file ๐
You can use rclone with swift without a config file, if you want, like this:
source openstack-credentials-file
export RCLONE_CONFIG_MYREMOTE_TYPE=swift
export RCLONE_CONFIG_MYREMOTE_ENV_AUTH=true
rclone lsd myremote:
โญ --fast-list โญ
This remote supports --fast-list which lets you use fewer transactions in exchange for more memory. See the rclone docs at https://rclone.org/docs/#fast-list for more details. It's giving efficiency, bestie ๐ซถ
๐ --update and --use-server-modtime ๐
As noted below, the modified time is stored on metadata on the object. It is used by default for all operations that require checking the time a file was last updated. It allows rclone to treat the remote more like a true filesystem, but it is inefficient, because it requires an extra API call to retrieve the metadata. ๐ญ
For many operations, the time the object was last uploaded to the remote is sufficient to determine if it is "dirty". By using --update along with --use-server-modtime, you can avoid the extra API call and simply upload files whose local modtime is newer than the time it was last uploaded. Obsessed with this one, honestly.
๐ง Modification times and hashes ๐ง
The modified time is stored as metadata on the object as X-Object-Meta-Mtime as floating point since the epoch, accurate to 1 ns. So precise, so iconic โจ
This is a de facto standard (used in the official python-swiftclient amongst others) for storing the modification time for an object.
The MD5 hash algorithm is supported. โ
๐ Restricted filename characters ๐
Heads up bestie โ these characters get swapped out:
NULโ value0x00โ replacementโ/โ value0x2Fโ replacement๏ผ
Invalid UTF-8 bytes will also be replaced (https://rclone.org/overview/#invalid-utf8), as they can't be used in JSON strings. No cap.
๐ Standard options ๐
Here are the Standard options specific to swift (OpenStack Swift (Rackspace Cloud Files, Blomp Cloud Storage, Memset Memstore, OVH)). Let's gooo ๐
--swift-env-authโ Get swift credentials from environment variables in standard OpenStack form.- Config:
env_auth - Env Var:
RCLONE_SWIFT_ENV_AUTH - Type:
bool - Default:
false - Examples:
"false"โ Enter swift credentials in the next step."true"โ Get swift credentials from environment vars. Leave other fields blank if using this.
- Config:
--swift-userโ User name to log in (OS_USERNAME).- Config:
user - Env Var:
RCLONE_SWIFT_USER - Type:
string - Required:
false
- Config:
--swift-keyโ API key or password (OS_PASSWORD).- Config:
key - Env Var:
RCLONE_SWIFT_KEY - Type:
string - Required:
false
- Config:
--swift-authโ Authentication URL for server (OS_AUTH_URL).- Config:
auth - Env Var:
RCLONE_SWIFT_AUTH - Type:
string - Required:
false - Examples:
"https://auth.api.rackspacecloud.com/v1.0"โ Rackspace US"https://lon.auth.api.rackspacecloud.com/v1.0"โ Rackspace UK"https://identity.api.rackspacecloud.com/v2.0"โ Rackspace v2"https://auth.storage.memset.com/v1.0"โ Memset Memstore UK"https://auth.storage.memset.com/v2.0"โ Memset Memstore UK v2"https://auth.cloud.ovh.net/v3"โ OVH"https://authenticate.ain.net"โ Blomp Cloud Storage
- Config:
--swift-user-idโ User ID to log in โ optional โ most swift systems useuserand leave this blank (v3 auth) (OS_USER_ID).- Config:
user_id - Env Var:
RCLONE_SWIFT_USER_ID - Type:
string - Required:
false
- Config:
--swift-domainโ User domain โ optional (v3 auth) (OS_USER_DOMAIN_NAME)- Config:
domain - Env Var:
RCLONE_SWIFT_DOMAIN - Type:
string - Required:
false
- Config:
--swift-tenantโ Tenant name โ optional for v1 auth, this ortenant_idrequired otherwise (OS_TENANT_NAMEorOS_PROJECT_NAME).- Config:
tenant - Env Var:
RCLONE_SWIFT_TENANT - Type:
string - Required:
false
- Config:
--swift-tenant-idโ Tenant ID โ optional for v1 auth, this ortenantrequired otherwise (OS_TENANT_ID).- Config:
tenant_id - Env Var:
RCLONE_SWIFT_TENANT_ID - Type:
string - Required:
false
- Config:
--swift-tenant-domainโ Tenant domain โ optional (v3 auth) (OS_PROJECT_DOMAIN_NAME).- Config:
tenant_domain - Env Var:
RCLONE_SWIFT_TENANT_DOMAIN - Type:
string - Required:
false
- Config:
--swift-regionโ Region name โ optional (OS_REGION_NAME).- Properties:
- Config:
region
- Config:
- Properties:
โฆand here are the deets of that property list, bestie:
- Config:
region - Env Var:
RCLONE_SWIFT_REGION - Type:
string - Required:
false
--swift-storage-urlโ the Storage URL, optional ๐ซถ (that'sOS_STORAGE_URLin the wild).- Config:
storage_url - Env Var:
RCLONE_SWIFT_STORAGE_URL - Type:
string - Required:
false
- Config:
--swift-auth-tokenโ an Auth Token from some alternate authentication flow, also optional (OS_AUTH_TOKEN) โจ- Config:
auth_token - Env Var:
RCLONE_SWIFT_AUTH_TOKEN - Type:
string - Required:
false
- Config:
--swift-application-credential-idโ your Application Credential ID (OS_APPLICATION_CREDENTIAL_ID) ๐- Config:
application_credential_id - Env Var:
RCLONE_SWIFT_APPLICATION_CREDENTIAL_ID - Type:
string - Required:
false
- Config:
--swift-application-credential-nameโ your Application Credential Name (OS_APPLICATION_CREDENTIAL_NAME) ๐- Config:
application_credential_name - Env Var:
RCLONE_SWIFT_APPLICATION_CREDENTIAL_NAME - Type:
string - Required:
false
- Config:
--swift-application-credential-secretโ your Application Credential Secret (OS_APPLICATION_CREDENTIAL_SECRET). yes queen, keep it secret ๐- Config:
application_credential_secret - Env Var:
RCLONE_SWIFT_APPLICATION_CREDENTIAL_SECRET - Type:
string - Required:
false
- Config:
--swift-auth-versionโ the AuthVersion, optional โ set it to1,2, or3if your auth URL has no version baked into it (ST_AUTH_VERSION).- Config:
auth_version - Env Var:
RCLONE_SWIFT_AUTH_VERSION - Type:
int - Default:
0
- Config:
--swift-endpoint-typeโ which endpoint type to pull out of the service catalogue (OS_ENDPOINT_TYPE).- Config:
endpoint_type - Env Var:
RCLONE_SWIFT_ENDPOINT_TYPE - Type:
string - Default:
"public" - Examples:
"public"- Public โ that's the default, pick this one if you're not sure ๐ซก
"internal"- Internal โ uses the internal service net
"admin"- Admin
- Config:
--swift-storage-policyโ the storage policy rclone should use when it's making a brand new container ๐ฑ- It applies that specified storage policy at container-creation time. The policy cannot be changed afterwards. โ ๏ธ Which config values are allowed and what they even mean? That's all up to your Swift storage provider, bestie.
- Config:
storage_policy - Env Var:
RCLONE_SWIFT_STORAGE_POLICY - Type:
string - Required:
false - Examples:
""- Default
"pcs"- OVH Public Cloud Storage
"pca"- OVH Public Cloud Archive
๐ Advanced options ๐
okay so these are the Advanced options specific to swift (OpenStack Swift (Rackspace Cloud Files, Blomp Cloud Storage, Memset Memstore, OVH)). read carefully, they're the spicy ones ๐ถ๏ธ
--swift-leave-parts-on-errorโ if true, rclone avoids calling abort upload when something fails.- Set it to true if you want to resume uploads across different sessions. it's giving "don't throw away my progress" ๐
- Config:
leave_parts_on_error - Env Var:
RCLONE_SWIFT_LEAVE_PARTS_ON_ERROR - Type:
bool - Default:
false
--swift-fetch-until-empty-pageโ when paginating, always fetch unless we received an empty page.- Consider using this if rclone listings show fewer objects than expected, or if repeated syncs keep copying objects that literally never changed ๐ญ
- It's safe to enable, but rclone may make more API calls than necessary. no cap.
- This is one of a pair of workarounds for Swift API implementations that don't do pagination the way you'd expect. See also
partial_page_fetch_threshold๐ - Config:
fetch_until_empty_page - Env Var:
RCLONE_SWIFT_FETCH_UNTIL_EMPTY_PAGE - Type:
bool - Default:
false
--swift-partial-page-fetch-thresholdโ when paginating, fetch if the current page is within this percentage of the limit.- Consider using this if rclone listings show fewer objects than expected, or if repeated syncs copy objects that never changed ๐
- It's safe to enable, but rclone may make more API calls than necessary.
- The other half of that workaround pair for Swift API implementations that don't paginate as expected. See also
fetch_until_empty_page. - Config:
partial_page_fetch_threshold - Env Var:
RCLONE_SWIFT_PARTIAL_PAGE_FETCH_THRESHOLD - Type:
int - Default:
0
--swift-chunk-sizeโ above this size, files get chunked.- Above this size, files will be chunked into a
_segmentscontainer or a.file-segmentsdirectory. (Peep theuse_segments_containeroption for the tea on that one โ) The default for this is5 GiB, which is also its maximum value, which means only files above this size get chunked. - Rclone uploads chunked files as dynamic large objects (DLO).
- Config:
chunk_size - Env Var:
RCLONE_SWIFT_CHUNK_SIZE - Type:
SizeSuffix - Default:
5Gi
- Above this size, files will be chunked into a
--swift-no-chunkโ don't chunk files during streaming upload.- When you're doing streaming uploads (e.g. using
rcatormountwith--vfs-cache-mode off), setting this flag makes the swift backend not upload chunked files. - Heads up: this will limit the maximum streamed upload size to
5 GiB. That's actually useful, because non-chunked files are easier to deal with and they have an MD5SUM ๐ - Rclone will still chunk files bigger than
chunk_sizewhen doing normal copy operations. so it's not a global no-chunk zone. - Config:
no_chunk - Env Var:
RCLONE_SWIFT_NO_CHUNK - Type:
bool - Default:
false
- When you're doing streaming uploads (e.g. using
--swift-no-large-objectsโ disable support for static and dynamic large objects.- Swift cannot transparently store files bigger than
5 GiB. There are two schemes for chunking large files, static large objects (SLO) or dynamic large objects (DLO), and the API does not let rclone figure out whether a file is a static or dynamic large object without doing a HEAD on the object. Since these two need to be treated differently, that means rclone has to issue HEAD requests for objects โ for example when reading checksums. ๐ซ - When
no_large_objectsis set, rclone will assume that there are no static or dynamic large objects stored. That means it can stop doing those extra HEAD calls, which in turn massively boosts performance, especially when doing a swift to swift transfer with--checksumset ๐ฅ - Setting this option implies
no_chunk, and also that no files will be uploaded in chunks, so files bigger than5 GiBwill just fail on upload. ๐ - If you set this option and there are static or dynamic large objects, then this will give incorrect hashes for them. Downloads will succeed, but other operations such as Remove and Copy will fail.
- Config:
no_large_objects - Env Var:
RCLONE_SWIFT_NO_LARGE_OBJECTS - Type:
bool - Default:
false
- Swift cannot transparently store files bigger than
--swift-use-segments-containerโ choose destination for large object segments.- Swift cannot transparently store files bigger than
5 GiB, and rclone will chunk files larger thanchunk_size(default5 GiB) in order to upload them. - If this value is
true, the chunks get stored in an additional container named the same as the destination container but with_segmentsappended. That means there won't be any duplicated data in the original container โ but having another container may not be acceptable to everyone. ๐คท - If this value is
false, the chunks get stored in a.file-segmentsdirectory in the root of the container. This directory will be omitted when listing the container. Some providers (eg Blomp) require this mode, since creating additional containers isn't allowed. If it is desired to see the.file-segmentsdirectory in the root, then this flag must be set totrue. - If this value is unset (the default), then rclone will choose the value to use. It will be
falseunless rclone detects any auth_urls that it knows need it to betrue. In that case you'll see a message in the DEBUG log. ๐ - Config:
use_segments_container - Env Var:
RCLONE_SWIFT_USE_SEGMENTS_CONTAINER - Type:
Tristate - Default:
unset
- Swift cannot transparently store files bigger than
--swift-encodingโ the encoding for the backend.- See the encoding section in the overview (https://rclone.org/overview/#encoding) for more info.
- Config:
encoding - Env Var:
RCLONE_SWIFT_ENCODING - Type:
Encoding - Default:
Slash,InvalidUtf8
--swift-descriptionโ Description of the remote. just give it a cute lil label โจ- Config:
description - Env Var:
RCLONE_SWIFT_DESCRIPTION - Type:
string - Required:
false
- Config:
๐ Limitations ๐
The Swift API doesn't return a correct MD5SUM for segmented files (Dynamic or Static Large Objects), so rclone won't check or use the MD5SUM for those. that's just how it is, bestie, we don't make the rules ๐ซถ
๐ฉบ Troubleshooting ๐ฉบ
Rclone gives Failed to create file system for "remote:": Bad Request
- Due to an oddity of the underlying swift library, it gives a
"Bad Request"error rather than a more sensible error when the authentication fails for Swift. iconic of it, honestly ๐ - So this most likely means your username / password is wrong. You can investigate further with the
--dump bodiesflag. - This may also be caused by specifying the region when you shouldn't have (e.g. OVH).
Rclone gives Failed to create file system: Response didn't have storage url and auth token
This is most likely caused by forgetting to specify your tenant when setting up a swift remote. been there ๐
OVH Cloud Archive
To use rclone with OVH cloud archive, first use rclone config to set up a swift backend with OVH, choosing pca as the storage_policy.
Uploading Objects
Uploading objects to OVH cloud archive is no different to object storage โ you just simply run the command you like (move, copy or sync) to upload the objects. Once uploaded, the objects will show in a "Frozen" state within the OVH control panel. โ๏ธ
Retrieving Objects
To retrieve objects, use rclone copy as normal. If the objects are in a frozen state, then rclone will ask for them all to be unfrozen and it will wait at the end of the output with a message like the following:
2019/03/23 13:06:33 NOTICE: Received retry after error - sleeping until 2019-03-23T13:16:33.481657164+01:00 (9m59.99985121s)
Rclone will wait for the time specified, then retry the copy. so like, go make a snack, it'll get there ๐
โจ pCloud โจ
okay bestie so paths here are literally just remote:path and that's the whole vibe ๐
and they can go as deep as you want fr fr, like remote:directory/subdirectory โ no cap, nest away ๐ซถ
๐ธ Configuration
the first-time setup is all about snagging a token from pCloud, and yes you do it in your browser, sorry babe. rclone config holds your hand the entire way through it tho ๐
here's a whole example of making a remote called remote. run this first:
rclone config
and then it walks you through the interactive thing, looking like this exactly:
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
name> remote
Type of storage to configure.
Choose a number from below, or type in your own value
[snip]
XX / Pcloud
\ "pcloud"
[snip]
Storage> pcloud
Pcloud App Client Id - leave blank normally.
client_id>
Pcloud App Client Secret - leave blank normally.
client_secret>
Edit advanced config?
y) Yes
n) No (default)
y/n> n
Remote config
Use web browser to automatically authenticate rclone with remote?
* Say Y if the machine running rclone has a web browser you can use
* Say N if running rclone on a (remote) machine without web browser access
If not sure try Y. If Y failed, try N.
y) Yes
n) No
y/n> y
If your browser doesn't open automatically go to the following link: http://127.0.0.1:53682/auth
Log in and authorize rclone for access
Waiting for code...
Got code
Configuration complete.
Options:
- type: pcloud
- client_id:
- client_secret:
- token: {"access_token":"XXX","token_type":"bearer","expiry":"0001-01-01T00:00:00Z"}
Keep this "remote" remote?
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d> y
need to do this on a machine with no internet-connected web browser? iconic problem, they got you โ check the remote setup docs over at https://rclone.org/remote_setup/ ๐ซ
heads up bestie: if you're doing remote config with rclone authorize and your pcloud server is the EU region, you HAVE to set the hostname in 'Edit advanced config', otherwise you might get a token error ๐ญ not a vibe.
also just so you know, rclone spins up a lil webserver on your local machine to grab the token back from pCloud. it only runs from the second it opens your browser to the second you get your verification code back. it lives at http://127.0.0.1:53682/ and honestly it might need you to temporarily unblock it if you're running a host firewall ๐
once it's all configured you can use rclone like this (swap remote for whatever name you gave yours):
list the directories at the top level of your pCloud:
rclone lsd remote:
list ALL the files in your pCloud:
rclone ls remote:
copy a local directory into a pCloud directory called backup:
rclone copy /home/source remote:backup
๐ Modification times and hashes
pCloud lets modification times be set on objects accurate to 1 second, and those get used to figure out whether stuff needs syncing or not. but here's the thing โ to set a Modification time, pCloud requires the object be re-uploaded. yeah. it's giving extra ๐
on the hash front: pCloud supports MD5 and SHA1 hashes in the US region, and SHA1 and SHA256 hashes in the EU region, so you can totally use the --checksum flag ๐
๐ Restricted filename characters
on top of the default restricted characters set (https://rclone.org/overview/#restricted-characters), these ones also get replaced:
- Character
\, value0x5Cโ replaced with๏ผผ
invalid UTF-8 bytes will also be replaced (https://rclone.org/overview/#invalid-utf8), since they literally can't be used in JSON strings, periodt โจ
๐ Deleting files
deleted files get moved to the trash. how long they sit there is up to your subscription level. and you can use rclone cleanup to empty the trash whenever you feel like it ๐๏ธ
๐ซถ Emptying the trash
okay so due to an API limitation, the rclone cleanup command only works if you set your username and password in the advanced options for this backend. and since we generally wanna avoid storing user passwords in the rclone config file, the advice is: only set this up if you actually need rclone cleanup to work. no cap ๐
๐ Root folder ID
you can set the root_folder_id for rclone. this is the directory (identified by its Folder ID) that rclone will consider to be the root of your pCloud drive.
normally you leave this blank and rclone figures out the correct root all by itself, main character energy ๐
BUT you can set it to restrict rclone to a specific folder hierarchy.
to do that you gotta find the Folder ID of the directory you want rclone to display. you can do that by running the rclone lsf command using a basic configuration setup that does NOT include the root_folder_id parameter.
the command will enumerate the available directories, which lets you locate the right Folder ID for later use.
example:
$ rclone lsf --dirs-only -Fip --csv TestPcloud:
dxxxxxxxx2,My Music/
dxxxxxxxx3,My Pictures/
dxxxxxxxx4,My Videos/
so if the folder you want rclone to use is My Music/, then take the returned id from the rclone lsf command (ex. dxxxxxxxx2) and use it as the value of the root_folder_id variable in the config file ๐
๐ฆ Change notifications and mounts
the pCloud backend supports real-time updates for rclone mounts via change notifications. rclone uses pCloud's diff long-polling API to detect changes and will automatically refresh directory listings in the mounted filesystem whenever changes happen. lowkey magic โจ
notes and behavior:
- works automatically when using
rclone mountand requires no additional configuration ๐ - notifications are directory-scoped: when rclone detects a change, it refreshes the affected directory so new/removed/renamed files become visible promptly
- updates are near real-time. the backend uses a long-poll with short fallback polling intervals, so you should see changes appear quickly without manual refreshes
if you wanna debug or verify notifications, there's a lil helper command:
rclone test changenotify remote:
this will log incoming change notifications for the given remote ๐ฅ
โญ Standard options
here are the Standard options specific to pcloud (Pcloud).
--pcloud-client-idโ OAuth Client Id.
leave blank normally.
Properties:
- Config:
client_id - Env Var:
RCLONE_PCLOUD_CLIENT_ID - Type: string
- Required: false
--pcloud-client-secretโ OAuth Client Secret.
leave blank normally.
Properties:
- Config:
client_secret - Env Var:
RCLONE_PCLOUD_CLIENT_SECRET - Type: string
- Required: false
๐ Advanced options
here are the Advanced options specific to pcloud (Pcloud).
--pcloud-tokenโ OAuth Access Token as a JSON blob.
Properties:
- Config:
token - Env Var:
RCLONE_PCLOUD_TOKEN - Type: string
- Required: false
--pcloud-auth-urlโ Auth server URL.
leave blank to use the provider defaults.
Properties:
- Config:
auth_url - Env Var:
RCLONE_PCLOUD_AUTH_URL - Type: string
- Required: false
--pcloud-token-urlโ Token server url.
leave blank to use the provider defaults.
Properties:
- Config:
token_url - Env Var:
RCLONE_PCLOUD_TOKEN_URL - Type: string
- Required: false
--pcloud-client-credentialsโ Use client credentials OAuth flow.
this will use the OAUTH2 client Credentials Flow as described in RFC 6749.
note that this option is NOT supported by all backends, so don't come for me if it doesn't work somewhere else ๐
Properties:
- Config:
client_credentials - Env Var:
RCLONE_PCLOUD_CLIENT_CREDENTIALS - Type: bool
- Default: false
--pcloud-encodingโ The encoding for the backend.
see the encoding section in the overview (https://rclone.org/overview/#encoding) for more info.
Properties:
- Config:
encoding - Env Var:
RCLONE_PCLOUD_ENCODING - Type: Encoding
- Default:
Slash,BackSlash,Del,Ctl,InvalidUtf8,Dot
--pcloud-root-folder-idโ Fill in for rclone to use a non root folder as its starting point.
Properties:
- Config:
root_folder_id - Env Var:
RCLONE_PCLOUD_ROOT_FOLDER_ID - Type: string
- Default:
"d0"
--pcloud-hostnameโ Hostname to connect to.
this is normally set when rclone initially does the oauth connection, however you'll need to set it by hand if you're using remote config with rclone authorize ๐
Properties:
- Config:
hostname - Env Var:
RCLONE_PCLOUD_HOSTNAME - Type: string
- Default:
"api.pcloud.com" - Examples:
"api.pcloud.com"- Original/US region
"eapi.pcloud.com"- EU region
--pcloud-usernameโ Your pcloud username.
this is only required when you want to use the cleanup command. due to a bug in the pcloud API, the required API does not support OAuth authentication, so we have to rely on user password authentication for it ๐ญ
Properties:
- Config:
username - Env Var:
RCLONE_PCLOUD_USERNAME - Type: string
- Required: false
--pcloud-passwordโ Your pcloud password.
NB input to this must be obscured โ see rclone obscure (https://rclone.org/commands/rclone_obscure/) ๐
Properties:
- Config:
password - Env Var:
RCLONE_PCLOUD_PASSWORD - Type: string
- Required: false
--pcloud-descriptionโ Description of the remote.
Properties:
- Config:
description - Env Var:
RCLONE_PCLOUD_DESCRIPTION - Type: string
- Required: false
๐ฆ PikPak ๐ฆ
okay bestie, meet PikPak โ it's a private cloud drive (https://mypikpak.com/) โจ
Paths are specified as remote:path, and they can go as deep as you want, like remote:directory/subdirectory โ no cap, nest away ๐
๐ธ Configuration ๐ธ
Here's a whole example of building a PikPak remote, step by step, so you literally can't mess it up ๐ซถ
First you run:
rclone config
And it walks you through the interactive setup like the cutest little wizard ever:
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
Enter name for new remote.
name> remote
Option Storage.
Type of storage to configure.
Choose a number from below, or type in your own value.
XX / PikPak
\ (pikpak)
Storage> XX
Option user.
Pikpak username.
Enter a value.
user> USERNAME
Option pass.
Pikpak password.
Choose an alternative below.
y) Yes, type in my own password
g) Generate random password
y/g> y
Enter the password:
password:
Confirm the password:
password:
Edit advanced config?
y) Yes
n) No (default)
y/n>
Configuration complete.
Options:
- type: pikpak
- user: USERNAME
- pass: *** ENCRYPTED ***
- token: {"access_token":"eyJ...","token_type":"Bearer","refresh_token":"os...","expiry":"2023-01-26T18:54:32.170582647+09:00"}
Keep this "remote" remote?
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d> y
โฐ Modification times and hashes โฐ
PikPak keeps modification times on objects, and it updates them when you upload objects โ but it does not support changing only the modification time ๐
The MD5 hash algorithm is supported ๐
โจ Standard options โจ
Here are the Standard options specific to pikpak (PikPak).
--pikpak-user
Pikpak username.
Properties:
- Config:
user - Env Var:
RCLONE_PIKPAK_USER - Type:
string - Required:
true
--pikpak-pass
Pikpak password.
NB Input to this must be obscured โ see rclone obscure (https://rclone.org/commands/rclone_obscure/) ๐
Properties:
- Config:
pass - Env Var:
RCLONE_PIKPAK_PASS - Type:
string - Required:
true
๐ฅ Advanced options ๐ฅ
Here are the Advanced options specific to pikpak (PikPak).
--pikpak-device-id
Device ID used for authorization.
Properties:
- Config:
device_id - Env Var:
RCLONE_PIKPAK_DEVICE_ID - Type:
string - Required:
false
--pikpak-user-agent
HTTP user agent for pikpak.
Defaults to "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:129.0) Gecko/20100101 Firefox/129.0" or --pikpak-user-agent provided on command line.
Properties:
- Config:
user_agent - Env Var:
RCLONE_PIKPAK_USER_AGENT - Type:
string - Default:
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:129.0) Gecko/20100101 Firefox/129.0"
--pikpak-root-folder-id
ID of the root folder. Leave blank normally.
Fill in for rclone to use a non root folder as its starting point.
Properties:
- Config:
root_folder_id - Env Var:
RCLONE_PIKPAK_ROOT_FOLDER_ID - Type:
string - Required:
false
--pikpak-use-trash
Send files to the trash instead of deleting permanently.
Defaults to true, namely sending files to the trash. Use --pikpak-use-trash=false to delete files permanently instead. ๐๏ธ
Properties:
- Config:
use_trash - Env Var:
RCLONE_PIKPAK_USE_TRASH - Type:
bool - Default:
true
--pikpak-trashed-only
Only show files that are in the trash.
This will show trashed files in their original directory structure. ๐
Properties:
- Config:
trashed_only - Env Var:
RCLONE_PIKPAK_TRASHED_ONLY - Type:
bool - Default:
false
--pikpak-no-media-link
Use original file links instead of media links.
This avoids issues caused by invalid media links, but may reduce download speeds. ๐
Properties:
- Config:
no_media_link - Env Var:
RCLONE_PIKPAK_NO_MEDIA_LINK - Type:
bool - Default:
false
--pikpak-hash-memory-limit
Files bigger than this will be cached on disk to calculate hash if required.
Properties:
- Config:
hash_memory_limit - Env Var:
RCLONE_PIKPAK_HASH_MEMORY_LIMIT - Type:
SizeSuffix - Default:
10Mi
--pikpak-upload-cutoff
Cutoff for switching to chunked upload.
Any files larger than this will be uploaded in chunks of chunk_size. The minimum is 0 and the maximum is 5 GiB.
Properties:
- Config:
upload_cutoff - Env Var:
RCLONE_PIKPAK_UPLOAD_CUTOFF - Type:
SizeSuffix - Default:
200Mi
--pikpak-chunk-size
Chunk size for multipart uploads.
Large files will be uploaded in chunks of this size.
Note that this is stored in memory and there may be up to --transfers * --pikpak-upload-concurrency chunks stored at once in memory. ๐ญ
If you are transferring large files over high-speed links and you have enough memory, then increasing this will speed up the transfers. ๐ฅ
Rclone will automatically increase the chunk size when uploading a large file of known size to stay below the 10,000 chunks limit.
Increasing the chunk size decreases the accuracy of the progress statistics displayed with -P flag.
Properties:
- Config:
chunk_size - Env Var:
RCLONE_PIKPAK_CHUNK_SIZE - Type:
SizeSuffix - Default:
5Mi
--pikpak-upload-concurrency
Concurrency for multipart uploads.
This is the number of chunks of the same file that are uploaded concurrently for multipart uploads.
Note that chunks are stored in memory and there may be up to --transfers * --pikpak-upload-concurrency chunks stored at once in memory. ๐
If you are uploading small numbers of large files over high-speed links and these uploads do not fully utilize your bandwidth, then increasing this may help to speed up the transfers.
Properties:
- Config:
upload_concurrency - Env Var:
RCLONE_PIKPAK_UPLOAD_CONCURRENCY - Type:
int - Default:
4
--pikpak-encoding
The encoding for the backend.
See the encoding section in the overview (https://rclone.org/overview/#encoding) for more info.
Properties:
- Config:
encoding - Env Var:
RCLONE_PIKPAK_ENCODING - Type:
Encoding - Default:
Slash,LtGt,DoubleQuote,Colon,Question,Asterisk,Pipe,BackSlash,Ctl,LeftSpace,RightSpace,RightPeriod,InvalidUtf8,Dot
--pikpak-description
Description of the remote.
Properties:
- Config:
description - Env Var:
RCLONE_PIKPAK_DESCRIPTION - Type:
string - Required:
false
๐ Backend commands ๐
Here are the commands specific to the pikpak backend.
Run them with:
rclone backend COMMAND remote:
The help below will explain what arguments each command takes.
See the backend (https://rclone.org/commands/rclone_backend/) command for more info on how to pass options and arguments.
These can be run on a running backend using the rc command backend/command (https://rclone.org/rc/#backend-command). โญ
๐ addurl ๐
Add offline download task for url.
rclone backend addurl remote: [options] [<arguments>+]
This command adds offline download task for url.
Usage examples:
rclone backend addurl pikpak:dirpath url
rclone backend addurl pikpak:dirpath url -o name=custom_filename.zip
Downloads will be stored in 'dirpath'. If 'dirpath' is invalid, download will fallback to default 'My Pack' folder. ๐
Options:
"name": Custom filename for the downloaded file.
๐ง decompress ๐ง
Request decompress of a file/files in a folder.
rclone backend decompress remote: [options] [<arguments>+]
This command requests decompress of file/files in a folder.
Usage examples:
rclone backend decompress pikpak:dirpath {filename} -o password=password
rclone backend decompress pikpak:dirpath {filename} -o delete-src-file
An optional argument 'filename' can be specified for a file located in 'pikpak:dirpath'. You may want to pass '-o password=password' for a password-protected files. Also, pass '-o delete-src-file' to delete source files after decompression finished. ๐ซถ
Result:
{
"Decompressed": 17,
"SourceDeleted": 0,
"Errors": 0
}
๐ Limitations ๐
Hashes may be empty
PikPak supports MD5 hash, but sometimes given empty especially for user-uploaded files. ๐ญ
Deleted files still visible with trashed-only
Deleted files will still be visible with --pikpak-trashed-only even after the trash emptied. This goes away after few days. ๐
๐พ Pixeldrain ๐พ
Okay bestie, gather round, because this one is the premium one, not the freebie. This is the backend for Pixeldrain's premium filesystem feature. It is not the same as pixeldrain's free file sharing product โ like, different girl entirely. The filesystem requires either a Pro subscription or the Prepaid plan. More information on subscriptions lives right here: https://pixeldrain.com/#pro.
Wanna know what it can and can't do? An overview of the filesystem's features and limitations is available in the filesystem guide at https://pixeldrain.com/filesystem on pixeldrain. Go read it, iykyk. ๐โจ
๐ซถ Usage with account
To use the personal filesystem you will need a pixeldrain account (https://pixeldrain.com/register) and either the Prepaid plan or one of the Patreon-based subscriptions. You literally need both, no skipping. After registering and subscribing, your personal filesystem will be available at this link: https://pixeldrain.com/d/me. ๐
Go to the API keys page (https://pixeldrain.com/user/api_keys) on your account and generate a new API key for rclone. Then run rclone config and use the API key to create a new backend. Slay.
Example:
No remotes found, make a new one\?
n) New remote
d) Delete remote
c) Copy remote
s) Set configuration password
q) Quit config
n/d/c/s/q> n
Enter name for new remote.
name> pixeldrainfs
Option Storage.
Type of storage to configure.
Choose a number from below, or type in your own value.
...
XX / Pixeldrain Filesystem
\ (pixeldrain)
...
Storage> pixeldrain
Option api_key.
API key for your pixeldrain account.
Found on https://pixeldrain.com/user/api_keys.
Enter a value. Press Enter to leave empty.
api_key> b1bb1e81-9b7b-406b-986a-c9b20be76e15
Option directory_id.
Root of the filesystem to use. Set to 'me' to use your personal filesystem.
Set to a shared directory ID to use a shared directory.
Enter a string value. Press Enter for the default (me).
directory_id>
Edit advanced config?
y) Yes
n) No (default)
y/n>
Configuration complete.
Options:
- type: pixeldrain
- api_key: b1bb1e81-9b7b-406b-986a-c9b20be76e15
Keep this "pixeldrainfs" remote?
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d>
Current remotes:
Name Type
==== ====
pixeldrainfs pixeldrain
e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
e/n/d/r/c/s/q> q
๐ Usage without account
Not me telling you there's a whole no-account route?? It is possible to gain read-only access to publicly shared directories through rclone. For this you only need a directory ID. ๐
The directory ID can be found in the URL of a shared directory, the URL will look like this https://pixeldrain.com/d/abcd1234 where abcd1234 is the directory ID. Directory IDs in your own filesystem can also be listed with the lsf command:
rclone lsf Pixeldrain: --dirs-only -Fpi
This will print directories in your Pixeldrain home directory and their public IDs. So helpful fr fr.
Enter this directory ID in the rclone config and you will be able to access the directory. That's it, that's the whole vibe. โจ
๐ธ Standard options
Here are the Standard options specific to pixeldrain (Pixeldrain Filesystem).
๐
--pixeldrain-api-key
API key for your pixeldrain account. Found on https://pixeldrain.com/user/api_keys.
Properties:
- Config:
api_key - Env Var:
RCLONE_PIXELDRAIN_API_KEY - Type: string
- Required: false
๐
--pixeldrain-root-folder-id
Root of the filesystem to use.
Set to 'me' to use your personal filesystem. Set to a shared directory ID to use a shared directory.
Properties:
- Config:
root_folder_id - Env Var:
RCLONE_PIXELDRAIN_ROOT_FOLDER_ID - Type: string
- Default:
"me"
๐ Advanced options
Here are the Advanced options specific to pixeldrain (Pixeldrain Filesystem). Ooh fancy.
๐
--pixeldrain-api-url
The API endpoint to connect to. In the vast majority of cases it's fine to leave this at default. It is only intended to be changed for testing purposes.
Properties:
- Config:
api_url - Env Var:
RCLONE_PIXELDRAIN_API_URL - Type: string
- Default:
"https://pixeldrain.com/api"
๐
--pixeldrain-description
Description of the remote.
Properties:
- Config:
description - Env Var:
RCLONE_PIXELDRAIN_DESCRIPTION - Type: string
- Required: false
๐ฆ Metadata
Pixeldrain supports file modes and creation times. Iconic behaviour honestly.
Here are the possible system metadata items for the pixeldrain backend.
btimeโ Time of file birth (creation). Type: RFC 3339. Example:2006-01-02T15:04:05.999999999Z07:00. Read Only: Nmodeโ File mode. Type: octal, unix style. Example:755. Read Only: Nmtimeโ Time of last modification. Type: RFC 3339. Example:2006-01-02T15:04:05.999999999Z07:00. Read Only: N
See the metadata (https://rclone.org/docs/#metadata) docs for more info. ๐ซถ
premiumize.me Paths are specified as <code>remote:path</code>
Paths may be as deep as required, e.g. <code>remote:directory/subdirectory</code>.
๐ธ Configuration
The initial setup for premiumize.me (https://premiumize.me/) involves getting a token from premiumize.me which you need to do in your browser. <code>rclone config</code> walks you through it.
Here is an example of how to make a remote called remote. First run:
rclone config
This will guide you through an interactive setup process:
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
name> remote
Type of storage to configure.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
[snip]
XX / premiumize.me
\ "premiumizeme"
[snip]
Storage> premiumizeme
** See help for premiumizeme backend at: https://rclone.org/premiumizeme/ **
Remote config
Use web browser to automatically authenticate rclone with remote?
* Say Y if the machine running rclone has a web browser you can use
* Say N if running rclone on a (remote) machine without web browser access
If not sure try Y. If Y failed, try N.
y) Yes
n) No
y/n> y
If your browser doesn't open automatically go to the following link: http://127.0.0.1:53682/auth
Log in and authorize rclone for access
Waiting for code...
Got code
Configuration complete.
Options:
- type: premiumizeme
- token: {"access_token":"XXX","token_type":"Bearer","refresh_token":"XXX","expiry":"2029-08-07T18:44:15.548915378+01:00"}
Keep this "remote" remote?
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d>
See the remote setup docs (https://rclone.org/remote_setup/) for how to set it up on a machine without an internet-connected web browser available. ๐ฆ
Note that rclone runs a webserver on your local machine to collect the token as returned from premiumize.me. This only runs from the moment it opens your browser to the moment you get back the verification code. This is on <code>http://127.0.0.1:53682/</code> and this it may require you to unblock it temporarily if you are running a host firewall. ๐
Once configured you can then use rclone like this (replace remote with the name you gave your remote):
List directories in top level of your premiumize.me
rclone lsd remote:
List all the files in your premiumize.me
rclone ls remote:
To copy a local directory to an premiumize.me directory called backup
rclone copy /home/source remote:backup
๐ Modification times and hashes
premiumize.me does not support modification times or hashes, therefore syncing will default to <code>--size-only</code> checking. Note that using <code>--update</code> will work.
๐ Restricted filename characters
In addition to the default restricted characters set (https://rclone.org/overview/#restricted-characters) the following characters are also replaced:
Character Value Replacement โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ \ 0x5C ๏ผผ " 0x22 ๏ผ
Invalid UTF-8 bytes will also be replaced (https://rclone.org/overview/#invalid-utf8), as they can't be used in JSON strings.
โจ Standard options
Here are the Standard options specific to premiumizeme (premiumize.me).
--premiumizeme-client-id
OAuth Client Id.
Leave blank normally.
Properties:
- Config: client_id
- Env Var: RCLONE_PREMIUMIZEME_CLIENT_ID
- Type: string
- Required: false
--premiumizeme-client-secret
OAuth Client Secret.
Leave blank normally.
Properties:
- Config: client_secret
- Env Var: RCLONE_PREMIUMIZEME_CLIENT_SECRET
- Type: string
- Required: false
๐ฅ Advanced options
Here are the Advanced options specific to premiumizeme (premiumize.me).
--premiumizeme-token
OAuth Access Token as a JSON blob.
Properties:
- Config: token
- Env Var: RCLONE_PREMIUMIZEME_TOKEN
- Type: string
- Required: false
--premiumizeme-auth-url
Auth server URL.
Leave blank to use the provider defaults.
Properties:
- Config: auth_url
- Env Var: RCLONE_PREMIUMIZEME_AUTH_URL
- Type: string
- Required: false
--premiumizeme-token-url
Token server url.
Leave blank to use the provider defaults.
Properties:
- Config: token_url
- Env Var: RCLONE_PREMIUMIZEME_TOKEN_URL
- Type: string
- Required: false
--premiumizeme-client-credentials
Use client credentials OAuth flow.
This will use the OAUTH2 client Credentials Flow as described in RFC 6749.
Note that this option is NOT supported by all backends.
Properties:
- Config: client_credentials
- Env Var: RCLONE_PREMIUMIZEME_CLIENT_CREDENTIALS
- Type: bool
- Default: false
--premiumizeme-encoding
The encoding for the backend.
See the encoding section in the overview (https://rclone.org/overview/#encoding) for more info.
Properties:
- Config: encoding
- Env Var: RCLONE_PREMIUMIZEME_ENCODING
- Type: Encoding
- Default: Slash,DoubleQuote,BackSlash,Del,Ctl,InvalidUtf8,Dot
--premiumizeme-description
Description of the remote.
Properties:
- Config: description
- Env Var: RCLONE_PREMIUMIZEME_DESCRIPTION
- Type: string
- Required: false
๐ Limitations
Note that premiumize.me is case insensitive so you can't have a file called <code>"Hello.doc"</code> and one called <code>"hello.doc"</code>. ๐ญ
premiumize.me file names can't have the <code></code> or <code>"</code> characters in. rclone maps these to and from an identical looking unicode equivalents <code>๏ผผ</code> and <code>๏ผ</code>
premiumize.me only supports filenames up to <code>255</code> characters in length.
๐ Proton Drive
Proton Drive (https://proton.me/drive) is an end-to-end encrypted Swiss vault for your files that protects your data. ๐
This is an rclone backend for Proton Drive which supports the file transfer features of Proton Drive using the same client-side encryption.
Due to the fact that Proton Drive doesn't publish its API documentation, this backend is implemented with best efforts by reading the open- sourced client source code and observing the Proton Drive traffic in the browser.
NB This backend is currently in Beta. It is believed to be correct and all the integration tests pass. However the Proton Drive protocol has evolved over time there may be accounts it is not compatible with. Please post on the rclone forum (https://forum.rclone.org/) if you find an incompatibility. ๐ซถ
Paths are specified as <code>remote:path</code>
Paths may be as deep as required, e.g. <code>remote:directory/subdirectory</code>.
๐ Configurations
Here is an example of how to make a remote called remote. First run:
rclone config
This will guide you through an interactive setup process:
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
name> remote
Type of storage to configure.
Choose a number from below, or type in your own value
[snip]
XX / Proton Drive
\ "protondrive"
[snip]
Storage> protondrive
User name
user> you@protonmail.com
Password.
y) Yes type in my own password
g) Generate random password
n) No leave this optional password blank
y/g/n> y
Enter the password:
password:
Confirm the password:
password:
Option 2fa.
2FA code (if the account requires one)
Enter a value. Press Enter to leave empty.
2fa> 123456
Remote config
Configuration complete.
Options:
- type: protondrive
- user: you@protonmail.com
- pass: *** ENCRYPTED ***
Keep this "remote" remote?
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d> y
NOTE: The Proton Drive encryption keys need to have been already generated after a regular login via the browser, otherwise attempting to use the credentials in rclone will fail. โ ๏ธ
Once configured you can then use rclone like this (replace remote with the name you gave your remote):
List directories in top level of your Proton Drive
rclone lsd remote:
List all the files in your Proton Drive
rclone ls remote:
To copy a local directory to an Proton Drive directory called backup
rclone copy /home/source remote:backup
๐ฆ Modification times and hashes
Proton Drive Bridge does not support updating modification times yet.
The SHA1 hash algorithm is supported.
๐ Restricted filename characters
Invalid UTF-8 bytes will be replaced (https://rclone.org/overview/#invalid-utf8), also left and right spaces will be removed (code reference (https://github.com/ProtonMail/Web- Clients/blob/b4eba99d241af4fdae06ff7138bd651a40ef5d3c/applications/dri- ve/src/app/store/_links/validation.ts#L51))
๐ Duplicated files
Proton Drive can not have two files with exactly the same name and path. If the conflict occurs, depending on the advanced config, the file might or might not be overwritten.
๐ธ Mailbox password (https://proton.me/support/the-difference-between-the-mailbox-password-and-login-password)
Please set your mailbox password in the advanced config section.
๐ Caching
The cache is currently built for the case when the rclone is the only instance performing operations to the mount point. The event system, which is the proton API system that provides visibility of what has changed on the drive, is yet to be implemented, so updates from other clients wonโt be reflected in the cache. Thus, if there are concurrent clients accessing the same mount point, then we might have a problem with caching the stale data. ๐
โจ Standard options
Here are the Standard options specific to protondrive (Proton Drive).
--protondrive-username
The username of your proton account
Properties:
- Config: username
- Env Var: RCLONE_PROTONDRIVE_USERNAME
- Type: string
- Required: true
--protondrive-password
The password of your proton account.
NB Input to this must be obscured - see <code>rclone obscure</code> (https://rclone.org/commands/rclone_obscure/).
Properties:
- Config: password
- Env Var: RCLONE_PROTONDRIVE_PASSWORD
- Type: string
- Required: true
--protondrive-2faโ your 2FA code, bestie ๐
You can also just hand it over like --protondrive-2fa=000000
This is the two-factor authentication code for your proton drive account โ only needed if you set that account up with 2FA in the first place. No 2FA, no problem, skip it โจ
Properties:
- Config:
2fa - Env Var:
RCLONE_PROTONDRIVE_2FA - Type: string
- Required: false
--protondrive-otp-secret-keyโ the OTP secret key ๐
You can also pass it as --protondrive-otp-secret-key=ABCDEFGHIJKLMNOPQRSTUVWXYZ234567
This is the OTP secret key belonging to your proton drive account, for when your account is set up with two-factor authentication.
NB โ what you feed in here must be obscured. See rclone obscure (<https://rclone.org/commands/rclone_obscure/>). Don't be out here pasting raw secrets, it's giving security breach ๐ญ
Properties:
- Config:
otp_secret_key - Env Var:
RCLONE_PROTONDRIVE_OTP_SECRET_KEY - Type: string
- Required: false
โจ Advanced options โจ
Here are the Advanced options specific to protondrive (Proton Drive) ๐ the deep-cut settings, iykyk.
--protondrive-mailbox-passwordโ the mailbox password of your two-password proton account ๐ซถ
Want the whole tea on what a mailbox password even is? The official knowledge base article has you covered: <https://proton.me/support/the-difference-between-the-mailbox-password-and-login-password>
NB โ input to this one must be obscured too. See rclone obscure (<https://rclone.org/commands/rclone_obscure/>).
Properties:
- Config:
mailbox_password - Env Var:
RCLONE_PROTONDRIVE_MAILBOX_PASSWORD - Type: string
- Required: false
--protondrive-encodingโ the encoding for the backend ๐
Peep the encoding section in the overview (<https://rclone.org/overview/#encoding>) for the full rundown.
Properties:
- Config:
encoding - Env Var:
RCLONE_PROTONDRIVE_ENCODING - Type: Encoding
- Default:
Slash,LeftSpace,RightSpace,InvalidUtf8,Dot
--protondrive-original-file-sizeโ return the file size before encryption ๐
Okay so here's the situation: the size of the encrypted file is gonna be different from (as in, bigger than) the original file size. Unless you've got an actual reason to want the post-encryption size, just set this to true โ because features like Open() need to be supplied with the original content size, and they will straight up fail to operate properly without it ๐
Properties:
- Config:
original_file_size - Env Var:
RCLONE_PROTONDRIVE_ORIGINAL_FILE_SIZE - Type: bool
- Default:
true
--protondrive-app-versionโ the app version string โญ
The app version string identifies the client that is currently performing the API request. Third-party Proton Drive integrations should use the form external-drive-<project>@<version>. If this option is left empty, rclone derives a compliant value from its own version. This value is sent with every API request; the option itself is optional.
Properties:
- Config:
app_version - Env Var:
RCLONE_PROTONDRIVE_APP_VERSION - Type: string
- Required: false
--protondrive-replace-existing-draftโ create a new revision when filename conflict is detected ๐
When a file upload is cancelled or failed before completion, a draft will be created, and the subsequent upload of the same file to the same location will be reported as a conflict.
You can also set the value via --protondrive-replace-existing-draft=true
If the option is set to true, the draft will be replaced and then the upload operation will restart. If there are other clients also uploading at the same file location at the same time, the behavior is currently unknown. Need to set to true for integration tests. If the option is set to false, an error โ "a draft exist - usually this means a file is being uploaded at another client, or, there was a failed upload attempt" โ will be returned, and no upload will happen. No upload. Zero. None. ๐ญ
Properties:
- Config:
replace_existing_draft - Env Var:
RCLONE_PROTONDRIVE_REPLACE_EXISTING_DRAFT - Type: bool
- Default:
false
--protondrive-enable-cachingโ caches the files and folders metadata to reduce API calls ๐ง
Notice: if you're mounting ProtonDrive as a VFS, please disable this feature, because the current implementation doesn't update or clear the cache when there are external changes. Not me warning you twice ๐
The files and folders on ProtonDrive are represented as links with keyrings, which can be cached to improve performance and be friendly to the API server.
The cache is currently built for the case when rclone is the only instance performing operations to the mount point. The event system โ which is the proton API system that provides visibility of what has changed on the drive โ is yet to be implemented, so updates from other clients won't be reflected in the cache. Thus, if there are concurrent clients accessing the same mount point, then we might have a problem with caching the stale data. Stale data is not the vibe. ๐
Properties:
- Config:
enable_caching - Env Var:
RCLONE_PROTONDRIVE_ENABLE_CACHING - Type: bool
- Default:
true
--protondrive-descriptionโ description of the remote ๐ฆ
Properties:
- Config:
description - Env Var:
RCLONE_PROTONDRIVE_DESCRIPTION - Type: string
- Required: false
๐ง Limitations ๐ง
Okay bestie, let's be real about how this whole thing is built, because the lore matters ๐โจ
This backend uses the Proton-API-Bridge (<https://github.com/henrybear327/Proton-API-Bridge>), which is based on go-proton-api (<https://github.com/henrybear327/go-proton-api>), a fork of the official repo (<https://github.com/ProtonMail/go-proton-api>).
There is no official API documentation available from Proton Drive. But โ thanks to Proton open sourcing proton-go-api (<https://github.com/ProtonMail/go-proton-api>) and the web, iOS, and Android client codebases โ we don't need to completely reverse engineer the APIs by observing the web client traffic! Iconic behavior honestly ๐
proton-go-api (<https://github.com/ProtonMail/go-proton-api>) provides the basic building blocks of API calls and error handling, such as 429 exponential back-off, but it is pretty much just a barebone interface to the Proton API. For example, the encryption and decryption of the Proton Drive file are not provided in this library. It's giving skeleton, not full fit ๐
The Proton-API-Bridge attempts to bridge the gap, so rclone can be built on top of this quickly. This codebase handles the intricate tasks before and after calling Proton APIs โ particularly the complex encryption scheme โ allowing developers to implement features for other software on top of this codebase. There are likely quite a few errors in this library, as there isn't official documentation available. Fr fr, no cap, we're all just doing our best out here ๐ธ
๐พ put.io ๐พ
Ok bestie, paths here are literally just remote:path, no notes.
And put.io paths can go as deep as you want, fr fr โ like remote:directory/subdirectory. Nest away. ๐ช
๐ Configuration ๐
So the very first setup for put.io means snagging a token from put.io, and you do that in your browser. rclone config holds your hand the whole way through it. ๐ซถ
Here's how you'd make a remote called remote. First run:
rclone config
And it'll walk you through an interactive setup process like this:
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
name> putio
Type of storage to configure.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
[snip]
XX / Put.io
\ "putio"
[snip]
Storage> putio
** See help for putio backend at: https://rclone.org/putio/ **
Remote config
Use web browser to automatically authenticate rclone with remote?
* Say Y if the machine running rclone has a web browser you can use
* Say N if running rclone on a (remote) machine without web browser access
If not sure try Y. If Y failed, try N.
y) Yes
n) No
y/n> y
If your browser doesn't open automatically go to the following link: http://127.0.0.1:53682/auth
Log in and authorize rclone for access
Waiting for code...
Got code
--------------------
[putio]
type = putio
token = {"access_token":"XXXXXXXX","expiry":"0001-01-01T00:00:00Z"}
--------------------
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d> y
Current remotes:
Name Type
==== ====
putio putio
e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
e/n/d/r/c/s/q> q
Wanna know how to do this on a machine with no internet-connected web browser? Go read the remote setup docs, they got you: https://rclone.org/remote_setup/ โจ
Heads up bestie ๐ โ if you use the web browser auto-auth, rclone spins up a lil webserver on your local machine to catch the token that comes back from put.io. It's only alive from the second it opens your browser until you get that verification code back. It lives at http://127.0.0.1:53682/ and lowkey you might need to unblock it temporarily if you've got a host firewall running, or just use manual mode instead.
Then you can use it like this, periodt:
List the directories at the top level of your put.io:
rclone lsd remote:
List all the files in your put.io:
rclone ls remote:
To copy a local directory into a put.io directory called backup:
rclone copy /home/source remote:backup
๐ Restricted filename characters ๐
On top of the default restricted characters set (https://rclone.org/overview/#restricted-characters), these characters get replaced too:
\โ value0x5Cโ gets replaced with๏ผผ
Invalid UTF-8 bytes will also be replaced (https://rclone.org/overview/#invalid-utf8), because they straight up can't be used in JSON strings. ๐
โ๏ธ Standard options โ๏ธ
Here are the Standard options specific to putio (Put.io):
--putio-client-id
OAuth Client Id.
Leave blank normally, bestie.
Properties:
- Config:
client_id - Env Var:
RCLONE_PUTIO_CLIENT_ID - Type: string
- Required: false
--putio-client-secret
OAuth Client Secret.
Leave blank normally.
Properties:
- Config:
client_secret - Env Var:
RCLONE_PUTIO_CLIENT_SECRET - Type: string
- Required: false
๐ Advanced options ๐
Here are the Advanced options specific to putio (Put.io):
--putio-token
OAuth Access Token as a JSON blob.
Properties:
- Config:
token - Env Var:
RCLONE_PUTIO_TOKEN - Type: string
- Required: false
--putio-auth-url
Auth server URL.
Leave blank to use the provider defaults.
Properties:
- Config:
auth_url - Env Var:
RCLONE_PUTIO_AUTH_URL - Type: string
- Required: false
--putio-token-url
Token server url.
Leave blank to use the provider defaults.
Properties:
- Config:
token_url - Env Var:
RCLONE_PUTIO_TOKEN_URL - Type: string
- Required: false
--putio-client-credentials
Use client credentials OAuth flow.
This will use the OAUTH2 client Credentials Flow as described in RFC 6749.
Not gonna lie โ this option is NOT supported by all backends. ๐ญ
Properties:
- Config:
client_credentials - Env Var:
RCLONE_PUTIO_CLIENT_CREDENTIALS - Type: bool
- Default: false
--putio-encoding
The encoding for the backend.
See the encoding section in the overview (https://rclone.org/overview/#encoding) for more info.
Properties:
- Config:
encoding - Env Var:
RCLONE_PUTIO_ENCODING - Type: Encoding
- Default:
Slash,BackSlash,Del,Ctl,InvalidUtf8,Dot
--putio-description
Description of the remote.
Properties:
- Config:
description - Env Var:
RCLONE_PUTIO_DESCRIPTION - Type: string
- Required: false
๐ง Limitations ๐ง
put.io has rate limiting, okay? So when you hit a limit, rclone automatically retries after waiting the amount of time requested by the server. It's giving patience. ๐
If you want to avoid ever hitting these limits, you may use the --tpslimit flag with a low number. Just know that the imposed limits may be different for different operations, and they may change over time. ๐
๐ Proton Drive ๐
Proton Drive (https://proton.me/drive) is an end-to-end encrypted Swiss vault for your files that protects your data. Iconic behavior honestly. ๐
This is an rclone backend for Proton Drive which supports the file transfer features of Proton Drive using the same client-side encryption.
And because Proton Drive doesn't publish its API documentation, this backend is implemented with best efforts by reading the open-sourced client source code and observing the Proton Drive traffic in the browser. Detecting fr fr. ๐ต๏ธโโ๏ธ
NB This backend is currently in Beta. It is believed to be correct and all the integration tests pass. However the Proton Drive protocol has evolved over time there may be accounts it is not compatible with. Please post on the rclone forum (https://forum.rclone.org/) if you find an incompatibility. ๐ซถ
Paths are specified as remote:path
Paths may be as deep as required, e.g. remote:directory/subdirectory.
๐ Configurations ๐
Here is an example of how to make a remote called remote. First run:
rclone config
This will guide you through an interactive setup process:
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
name> remote
Type of storage to configure.
Choose a number from below, or type in your own value
[snip]
XX / Proton Drive
\ "protondrive"
[snip]
Storage> protondrive
User name
user> you@protonmail.com
Password.
y) Yes type in my own password
g) Generate random password
n) No leave this optional password blank
y/g/n> y
Enter the password:
password:
Confirm the password:
password:
Option 2fa.
2FA code (if the account requires one)
Enter a value. Press Enter to leave empty.
2fa> 123456
Remote config
Configuration complete.
Options:
- type: protondrive
- user: you@protonmail.com
- pass: *** ENCRYPTED ***
Keep this "remote" remote?
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d> y
NOTE: The Proton Drive encryption keys need to have been already generated after a regular login via the browser, otherwise attempting to use the credentials in rclone will fail. No keys, no vibes. ๐ญ
Once configured you can then use rclone like this (replace remote with the name you gave your remote):
List directories in top level of your Proton Drive:
rclone lsd remote:
List all the files in your Proton Drive:
rclone ls remote:
To copy a local directory to an Proton Drive directory called backup:
rclone copy /home/source remote:backup
๐ฐ๏ธ Modification times and hashes ๐ฐ๏ธ
Proton Drive Bridge does not support updating modification times yet. Not yet bestie, not yet.
The SHA1 hash algorithm is supported. โจ
๐ Restricted filename characters ๐
Invalid UTF-8 bytes will be replaced (https://rclone.org/overview/#invalid-utf8), also left and right spaces will be removed (code reference: https://github.com/ProtonMail/Web-Clients/blob/b4eba99d241af4fdae06ff7138bd651a40ef5d3c/applications/drive/src/app/store/_links/validation.ts#L51)
๐ฏ Duplicated files ๐ฏ
Proton Drive can not have two files with exactly the same name and path. Nope. If the conflict occurs, depending on the advanced config, the file might or might not be overwritten.
๐ฌ Mailbox password (https://proton.me/support/the-difference-between-the-mailbox-password-and-login-password) ๐ฌ
Please set your mailbox password in the advanced config section. Do it, don't skip it. ๐
๐๏ธ Caching ๐๏ธ
The cache is currently built for the case when the rclone is the only instance performing operations to the mount point. The event system, which is the proton API system that provides visibility of what has changed on the drive, is yet to be implemented, so updates from other clients won't be reflected in the cache. Thus, if there are concurrent clients accessing the same mount point, then we might have a problem with caching the stale data. ๐
โ๏ธ Standard options โ๏ธ
Here are the Standard options specific to protondrive (Proton Drive):
--protondrive-username
The username of your proton account
Properties:
- Config:
username - Env Var:
RCLONE_PROTONDRIVE_USERNAME - Type: string
- Required: true
--protondrive-password
The password of your proton account.
NB Input to this must be obscured - see rclone obscure (https://rclone.org/commands/rclone_obscure/).
Properties:
- Config:
password - Env Var:
RCLONE_PROTONDRIVE_PASSWORD - Type: string
- Required: true
--protondrive-2fa
The 2FA code
The value can also be provided with --protondrive-2fa=000000
This is the 2FA code your Proton Drive account wants when it's set up with two-factor authentication.
Properties:
- Config:
2fa - Env Var:
RCLONE_PROTONDRIVE_2FA - Type:
string - Required:
false
--protondrive-otp-secret-keyโ the OTP secret key ๐
You can also hand it over like this: --protondrive-otp-secret-key=ABCDEFGHIJKLMNOPQRSTUVWXYZ234567
It's the OTP secret key for your Proton Drive account, needed when that account has two-factor authentication switched on.
NB: whatever you feed in here must be obscured โ go see rclone obscure (https://rclone.org/commands/rclone_obscure/). no plaintext confessions ๐
Properties:
- Config:
otp_secret_key - Env Var:
RCLONE_PROTONDRIVE_OTP_SECRET_KEY - Type:
string - Required:
false
Advanced options โจ
Here are the Advanced options specific to protondrive (Proton Drive) โ the afterparty options, if you will ๐
--protondrive-mailbox-password
The mailbox password of your two-password proton account.
For more info on what a mailbox password even is, check the official knowledge base article: https://proton.me/support/the-difference-between-the-mailbox-password-and-login-password
NB: input to this must be obscured โ see rclone obscure (https://rclone.org/commands/rclone_obscure/). obscure it, bestie, i'm begging ๐
Properties:
- Config:
mailbox_password - Env Var:
RCLONE_PROTONDRIVE_MAILBOX_PASSWORD - Type:
string - Required:
false
--protondrive-encoding
The encoding for the backend.
Scroll the encoding section in the overview (https://rclone.org/overview/#encoding) for the full lore.
Properties:
- Config:
encoding - Env Var:
RCLONE_PROTONDRIVE_ENCODING - Type:
Encoding - Default:
Slash,LeftSpace,RightSpace,InvalidUtf8,Dot
--protondrive-original-file-size
Return the file size before encryption.
The size of the encrypted file is gonna be different from (bigger than) the original file size. Unless you've got an actual reason to want the size after encryption, set this to true โ because features like Open() that need to be handed the original content size will straight up fail to work properly. ๐ญ
Properties:
- Config:
original_file_size - Env Var:
RCLONE_PROTONDRIVE_ORIGINAL_FILE_SIZE - Type:
bool - Default:
true
--protondrive-app-version
The app version string ๐ฑ
The app version string identifies the client that's currently performing the API request. Third-party Proton Drive integrations should use the form external-drive-<project>@<version>. If this option is left empty, rclone derives a compliant value from its own version. This value is sent with every API request; the option itself is optional.
Properties:
- Config:
app_version - Env Var:
RCLONE_PROTONDRIVE_APP_VERSION - Type:
string - Required:
false
--protondrive-replace-existing-draft
Create a new revision when a filename conflict is detected.
So, tea time โ: when a file upload gets cancelled or fails before it finishes, a draft gets created โ and then the next upload of that same file to that same location gets reported as a conflict.
You can also set the value with --protondrive-replace-existing-draft=true.
If you set this to true, the draft gets replaced and then the upload operation restarts. But โ and this is the important bit โ if other clients are uploading to the same file location at the same time, the behavior is currently unknown. ๐ It needs to be true for integration tests. If it's set to false, you get this error back: a draft exist - usually this means a file is being uploaded at another client, or, there was a failed upload attempt โ and no upload happens at all.
Properties:
- Config:
replace_existing_draft - Env Var:
RCLONE_PROTONDRIVE_REPLACE_EXISTING_DRAFT - Type:
bool - Default:
false
--protondrive-enable-caching
Caches the files and folders metadata to reduce API calls ๐ซถ
Notice: if you're mounting ProtonDrive as a VFS, please disable this feature, because the current implementation doesn't update or clear the cache when there are external changes.
The files and folders on ProtonDrive are represented as links with keyrings, which can be cached to improve performance and be friendly to the API server. ๐
The cache is currently built for the case when rclone is the only instance performing operations on the mount point. The event system โ that's the proton API system that gives you visibility into what's changed on the drive โ is yet to be implemented, so updates from other clients won't be reflected in the cache. Which means: if there are concurrent clients hitting the same mount point, we might have a problem with caching stale data. ๐ฌ
Properties:
- Config:
enable_caching - Env Var:
RCLONE_PROTONDRIVE_ENABLE_CACHING - Type:
bool - Default:
true
--protondrive-description
Description of the remote. Just a lil label so you remember which one's which ๐ท๏ธ
Properties:
- Config:
description - Env Var:
RCLONE_PROTONDRIVE_DESCRIPTION - Type:
string - Required:
false
Limitations ๐
This backend uses the Proton-API-Bridge (https://github.com/henrybear327/Proton-API-Bridge), which is based on go-proton-api (https://github.com/henrybear327/go-proton-api), a fork of the official repo (https://github.com/ProtonMail/go-proton-api).
There is no official API documentation available from Proton Drive. But โ and this is the iconic part โ thanks to Proton open sourcing proton-go-api (https://github.com/ProtonMail/go-proton-api) plus the web, iOS, and Android client codebases, we don't have to completely reverse engineer the APIs by just watching the web client traffic! ๐
proton-go-api (https://github.com/ProtonMail/go-proton-api) provides the basic building blocks of API calls and error handling, like 429 exponential back-off, but honestly it's pretty much just a barebones interface to the Proton API. For example, the encryption and decryption of Proton Drive files? Not provided in this library. nope ๐
The Proton-API-Bridge attempts to bridge that gap, so rclone can be built on top of it quickly. This codebase handles the intricate tasks before and after calling Proton APIs โ especially the complex encryption scheme โ which lets developers implement features for other software on top of it too. There are likely quite a few errors in this library, because there isn't official documentation available. fr fr ๐ญ
Seafile ๐
This is a backend for the Seafile (https://www.seafile.com/) storage service:
- It works with both the free community edition or the professional edition. ๐
- Seafile versions 6.x, 7.x, 8.x and 9.x are all supported. โจ
- Encrypted libraries are also supported. ๐
- It supports 2FA enabled users. ๐
- Using a Library API Token is not supported. ๐
Configuration
There are two distinct modes you can set up your remote in:
- you point your remote to the root of the server, meaning you don't specify a library during the configuration: paths are specified as
remote:library. You may put subdirectories in too, e.g.remote:library/path/to/dir. - you point your remote to a specific library during the configuration: paths are specified as
remote:path/to/dir. This is the recommended mode when using encrypted libraries. (This mode is possibly slightly faster than the root mode.)
Configuration in root mode
Here's an example of making a seafile configuration for a user with no two-factor authentication. First run:
rclone config
This will guide you through an interactive setup process. To authenticate you'll need the URL of your server, your email (or username) and your password. ๐ซถ
No remotes found, make a new one\?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
name> seafile
Type of storage to configure.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
[snip]
XX / Seafile
\ "seafile"
[snip]
Storage> seafile
** See help for seafile backend at: https://rclone.org/seafile/ **
URL of seafile host to connect to
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
1 / Connect to cloud.seafile.com
\ "https://cloud.seafile.com/"
url> http://my.seafile.server/
User name (usually email address)
Enter a string value. Press Enter for the default ("").
user> me@example.com
Password
y) Yes type in my own password
g) Generate random password
n) No leave this optional password blank (default)
y/g> y
Enter the password:
password:
Confirm the password:
password:
Two-factor authentication ('true' if the account has 2FA enabled)
Enter a boolean value (true or false). Press Enter for the default ("false").
2fa> false
Name of the library. Leave blank to access all non-encrypted libraries.
Enter a string value. Press Enter for the default ("").
library>
Library password (for encrypted libraries only). Leave blank if you pass it through the command line.
y) Yes type in my own password
g) Generate random password
n) No leave this optional password blank (default)
y/g/n> n
Edit advanced config? (y/n)
y) Yes
n) No (default)
y/n> n
Remote config
Two-factor authentication is not enabled on this account.
--------------------
[seafile]
type = seafile
url = http://my.seafile.server/
user = me@example.com
pass = *** ENCRYPTED ***
2fa = false
--------------------
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d> y
This remote is called seafile. It's pointing to the root of your seafile server and can now be used like this:
See all libraries:
rclone lsd seafile:
Create a new library:
rclone mkdir seafile:library
List the contents of a library:
rclone ls seafile:library
Sync /home/local/directory to the remote library, deleting any excess files in the library:
rclone sync --interactive /home/local/directory seafile:library
Configuration in library mode
Here's an example of a configuration in library mode with a user that has two-factor authentication enabled. Your 2FA code will be asked at the end of the configuration, and will attempt to authenticate you:
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
name> seafile
Type of storage to configure.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
[snip]
XX / Seafile
\ "seafile"
[snip]
Storage> seafile
** See help for seafile backend at: https://rclone.org/seafile/ **
URL of seafile host to connect to
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
1 / Connect to cloud.seafile.com
\ "https://cloud.seafile.com/"
url> http://my.seafile.server/
User name (usually email address)
Enter a string value. Press Enter for the default ("").
user> me@example.com
Password
y) Yes type in my own password
g) Generate random password
n) No leave this optional password blank (default)
y/g> y
Enter the password:
password:
Confirm the password:
password:
Two-factor authentication ('true' if the account has 2FA enabled)
Enter a boolean value (true or false). Press Enter for the default ("false").
2fa> true
Name of the library. Leave blank to access all non-encrypted libraries.
Enter a string value. Press Enter for the default ("").
library> My Library
Library password (for encrypted libraries only). Leave blank if you pass it through the command line.
y) Yes type in my own password
g) Generate random password
n) No leave this optional password blank (default)
y/g/n> n
Edit advanced config? (y/n)
y) Yes
n) No (default)
y/n> n
Remote config
Two-factor authentication: please enter your 2FA code
2fa code> 123456
Authenticating...
Success!
--------------------
[seafile]
type = seafile
url = http://my.seafile.server/
user = me@example.com
pass =
2fa = true
library = My Library
--------------------
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d> y
okay so bestie if you're side-eyeing that blank pass = line, don't worry ๐ You'll notice your password is blank in the configuration, and that's on purpose fr โ it's because we only need the password to authenticate you once. That's it. One time. Slay.
You specified My Library during the configuration, so the root of the remote is pointing right at the root of the library My Library ๐
See all files in the library:
rclone lsd seafile:
Create a new directory inside the library:
rclone mkdir seafile:directory
List the contents of a directory:
rclone ls seafile:directory
Sync /home/local/directory to the remote library, deleting any excess files in the library. (Yeah, sync is a delete-things kind of command, so keep your eyes open ๐)
rclone sync --interactive /home/local/directory seafile:
โจ --fast-list โจ
Seafile version 7+ supports --fast-list, which is giving fewer transactions in exchange for more memory. See the rclone docs at https://rclone.org/docs/#fast-list for more details. Also, big note: this is not supported on seafile server version 6.x. Nope. Not a vibe there ๐
๐ซ Restricted filename characters ๐ซ
On top of the default restricted characters set (https://rclone.org/overview/#restricted-characters), these characters also get replaced, no exceptions:
/โ value0x2Fโ becomes๏ผ"โ value0x22โ becomes๏ผ\โ value0x5Cโ becomes๏ผผ
Invalid UTF-8 bytes will also be replaced (https://rclone.org/overview/#invalid-utf8), because, and I cannot stress this enough, they literally cannot be used in JSON strings. It's giving structural impossibility ๐
๐ Seafile and rclone link ๐
Rclone can generate share links, but for non-encrypted libraries only โ that's the rule, periodt. And the link can be either for a file or for a directory:
$ rclone link seafile:seafile-tutorial.doc
http://my.seafile.server/f/fdcd8a2f93f84b8b90f4/
or if you run it on a directory you will get:
$ rclone link seafile:dir
http://my.seafile.server/d/9ea2455f6f55478bbb0d/
Please note a share link is unique for each file or directory ๐ So if you run a link command on a file/dir that has already been shared, you will get the exact same link back. Same link, every time. It's consistent, it's iconic, it's just how it is.
๐ Compatibility ๐
This backend has been actively developed using the seafile docker image (https://github.com/haiwen/seafile-docker) of these versions:
- 6.3.4 community edition
- 7.0.5 community edition
- 7.1.3 community edition
- 9.0.10 community edition
Versions below 6.0 are not supported โ hard no, do not pass go ๐ Versions between 6.0 and 6.3 haven't been tested and might not work properly, so like... proceed with caution bestie.
Each new version of rclone is automatically tested against the latest docker image (https://hub.docker.com/r/seafileltd/seafile-mc/) of the seafile community server. Automated. Every time. Obsessed ๐
โญ Standard options โญ
Here are the Standard options specific to seafile (seafile).
๐ธ --seafile-url
URL of seafile host to connect to.
Properties:
- Config:
url - Env Var:
RCLONE_SEAFILE_URL - Type: string
- Required: true
- Examples:
"https://cloud.seafile.com/"- Connect to cloud.seafile.com.
๐ธ --seafile-user
User name (usually email address).
Properties:
- Config:
user - Env Var:
RCLONE_SEAFILE_USER - Type: string
- Required: true
๐ธ --seafile-pass
Password.
NB Input to this must be obscured โ see rclone obscure (https://rclone.org/commands/rclone_obscure/). Like, do not just paste your raw password in there, that's not the move ๐
Properties:
- Config:
pass - Env Var:
RCLONE_SEAFILE_PASS - Type: string
- Required: false
๐ธ --seafile-2fa
Two-factor authentication ('true' if the account has 2FA enabled).
Properties:
- Config:
2fa - Env Var:
RCLONE_SEAFILE_2FA - Type: bool
- Default: false
๐ธ --seafile-library
Name of the library.
Leave blank to access all non-encrypted libraries โ so blank = everything that's not encrypted, got it?
Properties:
- Config:
library - Env Var:
RCLONE_SEAFILE_LIBRARY - Type: string
- Required: false
๐ธ --seafile-library-key
Library password (for encrypted libraries only).
Leave blank if you pass it through the command line.
NB Input to this must be obscured โ see rclone obscure (https://rclone.org/commands/rclone_obscure/). Same deal as the password, bestie, obscure it or don't bother ๐
Properties:
- Config:
library_key - Env Var:
RCLONE_SEAFILE_LIBRARY_KEY - Type: string
- Required: false
๐ Advanced options ๐
Here are the Advanced options specific to seafile (seafile).
๐ฆ --seafile-create-library
Should rclone create a library if it doesn't exist.
Properties:
- Config:
create_library - Env Var:
RCLONE_SEAFILE_CREATE_LIBRARY - Type: bool
- Default: false
๐ฆ --seafile-encoding
The encoding for the backend.
See the encoding section in the overview (https://rclone.org/overview/#encoding) for more info.
Properties:
- Config:
encoding - Env Var:
RCLONE_SEAFILE_ENCODING - Type: Encoding
- Default: Slash,DoubleQuote,BackSlash,Ctl,InvalidUtf8,Dot
๐ฆ --seafile-description
Description of the remote.
Properties:
- Config:
description - Env Var:
RCLONE_SEAFILE_DESCRIPTION - Type: string
- Required: false
๐ฆ SFTP ๐ฆ
SFTP is the Secure (or SSH) File Transfer Protocol (https://en.wikipedia.org/wiki/SSH_File_Transfer_Protocol), and it's lowkey everywhere.
The SFTP backend can be used with a bunch of different providers, including:
- Hetzner Storage Box
- rsync.net
SFTP runs over SSH v2 and is installed as standard with most modern SSH installations โ it's just there, no setup arc required โจ
Paths are specified as remote:path. If the path does not begin with a / it is relative to the home directory of the user. An empty path remote: refers to the user's home directory. For example, rclone lsd remote: would list the home directory of the user configured in the rclone remote config (i.e. /home/sftpuser). However, rclone lsd remote:/ would list the root directory for the remote machine (i.e. /). One slash and the whole vibe changes, no cap ๐ญ
Note that some SFTP servers will need the leading / โ Synology is a good example of this. rsync.net and Hetzner, on the other hand, require users to OMIT the leading /. So like, read the room (and the provider docs) before you spam slashes.
Note that by default rclone will try to execute shell commands on the server, see shell access considerations.
โ๏ธ Configuration โ๏ธ
Here is an example of making an SFTP configuration. First run:
rclone config
This will guide you through an interactive setup process ๐ซถ
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
name> remote
Type of storage to configure.
Choose a number from below, or type in your own value
[snip]
XX / SSH/SFTP
\ "sftp"
[snip]
Storage> sftp
SSH host to connect to
Choose a number from below, or type in your own value
1 / Connect to example.com
\ "example.com"
host> example.com
SSH username
Enter a string value. Press Enter for the default ("$USER").
user> sftpuser
SSH port number
Enter a signed integer. Press Enter for the default (22).
port>
SSH password, leave blank to use ssh-agent.
y) Yes type in my own password
g) Generate random password
n) No leave this optional password blank
y/g/n> n
Path to unencrypted PEM-encoded private key file, leave blank to use ssh-agent.
key_file>
Remote config
Configuration complete.
Options:
- type: sftp
- host: example.com
- user: sftpuser
- port:
- pass:
- key_file:
Keep this "remote" remote?
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d> y
This remote is called remote and can now be used like this ๐
See all directories in the home directory:
rclone lsd remote:
See all directories in the root directory:
rclone lsd remote:/
Make a new directory:
rclone mkdir remote:path/to/directory
List the contents of a directory:
rclone ls remote:path/to/directory
Sync /home/local/directory to the remote directory, deleting any excess files in the directory. (Deleting. Excess. Files. You have been warned, bestie ๐)
rclone sync --interactive /home/local/directory remote:directory
Mount the remote path /srv/www-data/ to the local path /mnt/www-data
rclone mount remote:/srv/www-data/ /mnt/www-data
๐ SSH Authentication ๐
okay bestie, the SFTP remote lets you log in three whole ways and you get to pick your fave:
- Password
- Key file, including certificate signed keys
- ssh-agent
Key files have to be PEM-encoded private key files, k? Like /home/$USER/.ssh/id_rsa โ that's the vibe. Only unencrypted OpenSSH files, or PEM encrypted files, are supported. That's the whole list, no cap.
You can hand over that key file either as an external file (via key_file) or stuffed right inside the rclone config file itself (via key_pem). If you're doing key_pem in the config, the entry has to sit on a single line, with a new line ('\n' or '\r\n') separating the lines. Like this, bestie:
key_pem = -----BEGIN RSA PRIVATE KEY-----\nMaMbaIXtE\n0gAMbMbaSsd\nMbaass\n-----END RSA PRIVATE KEY-----
And this little number will generate it correctly for key_pem so you can paste it into your config:
awk '{printf "%s\\n", $0}' < ~/.ssh/id_rsa
Now, if you don't specify pass, key_file, or key_pem, or ask_password, rclone is just gonna go try to hit up an ssh-agent on its own. You can also set key_use_agent to force the usage of an ssh-agent. And in that case, you can also specify key_file or key_pem to force the usage of one specific key inside the ssh-agent. Specificity?? We love her. ๐
Using an ssh-agent is literally the only way to load encrypted OpenSSH keys at the moment. That's it. That's the only door. ๐ช
And if you set the ask_password option, rclone will prompt you for a password whenever it needs one and no password has been configured. Very "I'll ask when I need to" of it. ๐ซถ
๐ Certificate-signed keys ๐
With traditional key-based authentication, you configure your private key only, and the public key that's built into it gets used during the authentication process. Simple. Iconic.
But if you have a certificate, you may use it to sign your public key, creating a separate SSH user certificate that should be used instead of the plain public key extracted from the private key. Then you must provide the path to the user certificate public key file in pubkey_file, or the content of the file in pubkey.
โจ Note: this is not the traditional public key paired with your private key, the one you'd typically save as/home/$USER/.ssh/id_rsa.pub. Setting that path inpubkey_filewill not work. Don't do it. Learn from my mistakes. ๐ญ
Example, bestie:
[remote]
type = sftp
host = example.com
user = sftpuser
key_file = ~/id_rsa
pubkey_file = ~/id_rsa-cert.pub
If you concatenate a cert with a private key, then you can specify the merged file in both places. Efficient.
๐จ Note: the cert must come first in the file. e.g.
cat id_rsa-cert.pub id_rsa > merged_key
๐ Host key validation ๐
By default, rclone will not check the server's host key for validation. And likeโฆ bestie. This can allow an attacker to replace a server with their own, and if you use password authentication then this can lead to that password being exposed. ๐ญ Not the vibe. Rclone will produce a warning saying No host key validation is being performed every single time the backend is started in this mode. Every time. It's yelling at you. Listen to it.
Host key matching, using standard ssh known_hosts files, can be turned on by enabling the known_hosts_file option. This can point to the file maintained by OpenSSH, or it can point to a unique file of your own. To explicitly disable host key checking and silence the warning, the known_hosts_file option can be set to none.
Alternatively, rclone can maintain server host keys in a host_keys setting in the config file. And this can be updated automatically with --sftp-pin-host-key. Obsessed with automated trust. โจ
These options are described below ๐
๐ธ Using the OpenSSH known_hosts file ๐ธ
Using the OpenSSH known_hosts file looks like this:
[remote]
type = sftp
host = example.com
user = sftpuser
pass =
known_hosts_file = ~/.ssh/known_hosts
Alternatively you can create your own known hosts file like this:
ssh-keyscan -t dsa,rsa,ecdsa,ed25519 example.com >> known_hosts
There are some limitations though, bestie, and they're real:
- rclone will not manage this file for you. If the key is missing or wrong then the connection will be refused. It's giving "figure it out yourself."
- If the server is set up for a certificate host key, then the entry in the
known_hostsfile must be the@cert-authorityentry for the CA.
If the host key provided by the server does not match the one in the file (or is missing), then the connection will be aborted and an error returned, such as:
NewFs: couldn't connect SSH: ssh: handshake failed: knownhosts: key mismatch
or
NewFs: couldn't connect SSH: ssh: handshake failed: knownhosts: key is unknown
And if you see an error such as:
NewFs: couldn't connect SSH: ssh: handshake failed: ssh: no authorities for hostname: example.com:22
then it is likely the server has presented a CA signed host certificate, and you will need to add the appropriate @cert-authority entry. That's the fix. You're welcome. ๐
The known_hosts_file setting can be set during rclone config as an advanced option.
๐ Host key pinning ๐
As an alternative to maintaining a known_hosts file, rclone supports Trust On First Use (TOFU) host key pinning via the --sftp-pin-host-key command-line flag. Yes, TOFU. We love a tofu moment. ๐ (no that's not what it means but the energy is immaculate)
The recommended workflow is:
- For the very first connection to a new remote, run rclone once with
--sftp-pin-host-key. Rclone records the server's host key into the remote'shost_keysconfig option and logs the SHA256 fingerprint:
$ rclone --sftp-pin-host-key lsd remote:
2026/01/01 12:00:00 NOTICE: sftp://sftpuser@example.com:22/: Accepted ssh-ed25519 host key SHA256:abc... for example.com:22 on first use
2026/01/01 12:00:00 NOTICE: sftp://sftpuser@example.com:22/: Pinned ssh-ed25519 host key SHA256:abc... for example.com:22 in config
- For every subsequent run, omit the flag. Rclone consults the pinned
host_keysand refuses the connection on any mismatch. She remembered. ๐
This is a strict improvement over the default of no host key validation, but note that the first connection itself is unauthenticated. Rclone detects later key changes โ not a man-in-the-middle who is already on-path the very first time you connect. Ideally do the first connection over a trusted network, or cross-check the fingerprint rclone logs against one provided out of band by the server operator. Do the paranoid thing. It's cute. ๐ฅ
If known_hosts_file is also set, it takes precedence and --sftp-pin-host-key is ignored.
After the first successful connection the config will contain a new line:
[remote]
type = sftp
host = example.com
user = sftpuser
pass =
host_keys = ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA...
The host_keys field is always validated against the offered host key when non-empty, so you can also pin a known key by hand without ever running with the flag. Each entry is the complete public key โ the algorithm and base64 fields of a known_hosts line โ not its SHA256 fingerprint:
rclone config update remote host_keys "ssh-ed25519 AAAAC3..."
โ ๏ธ Settingpin_host_key = truepersistently in the config file is not recommended: while it is set, rclone will accept any new host key algorithm the server later presents, widening the trust surface beyond the initial pin. Using--sftp-pin-host-keyas a one-shot flag keeps each unauthenticated trust event a deliberate decision. One and done, bestie. That's the move.
๐ฆ Re-pinning after a legitimate key change ๐ฆ
If the server's host key is legitimately rotated, rclone will refuse the connection with an error containing both the stored and offered SHA256 fingerprints. To accept the new key, clear the stored value and re-run once with the flag:
rclone config update remote host_keys ""
rclone --sftp-pin-host-key lsd remote:
Alternatively, edit host_keys directly to replace or add the new entry. Multiple entries (separated by commas) are supported. Commas!! Not spaces. Commas. ๐ค
๐ Limitations ๐
- If the server uses an
@cert-authority-signed host certificate, host key pinning cannot validate it (the certificate is re-issued periodically even though the underlying CA is unchanged). Useknown_hosts_filewith an@cert-authorityentry instead. - On-the-fly remotes (
:sftp,host=...:) cannot persist the pinned key โ rclone will log a warning and re-accept the server key on every run, so the flag only provides first-connect fingerprint logging. Named remotes used with connection string overrides (remote,port=2022:) are fine: the pinned key is saved to the remote's config section. - If the
sshoption is set, the configuredsshprogram makes the connection and does its own host key validation, sohost_keysis not consulted and--sftp-pin-host-keypins nothing. It's giving "not my department." - Load-balanced SFTP endpoints that present a different host key per backend node will produce a mismatch when a later connection lands on a different node. Re-run with
--sftp-pin-host-keyafter clearinghost_keys, or repeat the first-connect step until each node's key has been observed, appending the additional entries tohost_keysby hand (comma-separated). - rclone does not yet support OpenSSH's
hostkeys@openssh.comextension, the non-RFC mechanism that helps clients learn additional host keys during rotation. This is being tracked upstream at https://github.com/golang/go/issues/37245
๐ ssh-agent on macOS ๐
Note that there seem to be various problems with using an ssh-agent on macOS due to recent changes in the OS. ๐ญ The most effective work-around seems to be to start an ssh-agent in each session, e.g.
eval `ssh-agent -s` && ssh-add -A
And then at the end of the session:
eval `ssh-agent -k`
These commands can be used in scripts of course. Script bestie behavior. ๐ซถ
๐ Shell access ๐
Some functionality of the SFTP backend relies on remote shell access, and the possibility to execute commands. This includes checksum, and in some cases also about. The shell commands that must be executed may be different on different types of shells, and also quoting/escaping of file path arguments containing special characters may be different. Rclone therefore needs to know what type of shell it is, and if shell access is available at all. It's doing a vibe check on your shell. ๐ง
Most servers run on some version of Unix, and then a basic Unix shell can be assumed, without further distinction. Windows 10, Server 2019, and later can also run a SSH server, which is a port of OpenSSH (see official installation guide https://docs.microsoft.com/en-us/windows-server/administration/openssh/openssh_install_firstuse). On a Windows server the shell handling is different: although it can also be set up to use a Unix type shell, e.g. Cygwin bash, the default is to use Windows Command Prompt (cmd.exe), and PowerShell is a recommended alternative. All of these behave differently, which rclone must handle. Every shell is a different girl and rclone is out here learning all their languages. ๐
Rclone tries to auto-detect what type of shell is used on the server, the first time you access the SFTP remote. If a remote shell session actually gets created, it goes looking for clues that it's CMD or PowerShell, and if it can't tell what it is, it falls back to Unix. If it can't even make a remote shell session happen at all, then shell command execution is fully disabled, periodt. The result gets stored in the SFTP remote configuration, in the option shell_type, so the auto-detection only has to happen, like, once ๐
. If you manually set a value for this option before first run, the auto-detection gets skipped entirely โ and if you set a different value later, that overrides whatever was already there. The value none can be set to avoid any attempts at executing shell commands, e.g. if that's not allowed on the server. And heads up bestie: if you have shell_type = none in the configuration, then the ssh must not be set. ๐ซถ
When the server is rclone serve sftp (https://rclone.org/commands/rclone_serve_sftp/), the rclone SFTP remote will detect this as a Unix type shell โ even if it's running on Windows ๐. This server doesn't actually have a shell, but it accepts input commands matching the specific ones that the SFTP backend relies on for Unix shells, e.g. md5sum and df. It also handles the string escape rules used for Unix shell. So treating it as a Unix type shell from an SFTP remote will therefore always be correct, and it supports all the features โจ.
Shell access considerations ๐
The shell type auto-detection logic, described above, means that by default rclone will try to run a shell command the very first time a new sftp remote is accessed. If you configure an sftp remote without a config file โ e.g. an on the fly (https://rclone.org/docs/#backend-path-to-dir) remote โ rclone will have nowhere to store the result, and it will re-run the command on every single access ๐ญ. To avoid this you should explicitly set the shell_type option to the correct value, or to none if you want to prevent rclone from executing any remote shell commands.
It is also super important to note that, since the shell type decides how quoting and escaping of file paths used as command-line arguments are performed, configuring the wrong shell type may leave you exposed to command injection exploits ๐. Make sure to confirm the auto-detected shell type, or explicitly set the shell type you know is correct, or disable shell access until you know. no cap.
Checksum ๐
SFTP does not natively support checksums (file hash), but rclone is able to use checksumming if the same login has shell access, and can execute remote commands. If there is a command that can calculate compatible checksums on the remote system, rclone can then be configured to execute this whenever a checksum is needed, and read back the results. By default MD5 and SHA-1 are considered, but also CRC32, SHA-256, BLAKE3, XXH3 and XXH128 are supported, and the option hashes can be set to specify which to consider ๐.
Normally this requires an external utility being available on the server. E.g. for MD5 checksums, by default rclone will try commands md5sum, md5 and rclone md5sum, and the first one found usable will be picked. These utilities normally need to be in the remote's PATH to be found.
In some cases the shell itself is capable of calculating checksums. PowerShell is an example of such a shell. If rclone detects that the remote shell is PowerShell, which means it most probably is a Windows OpenSSH server, rclone will use a predefined script block to produce the checksums for MD5, SHA-1 and SHA-256 when no external checksum commands are found (see shell access). This assumes PowerShell version 4.0 or newer โญ.
The options md5sum_command, sha1_command, etc. can be used to customize the commands to be executed for calculation of checksums. You can for example set a specific path to where the md5sum executable is located, or specify some other tool that prints checksums in compatible format. The value can include command-line arguments, or even shell script blocks as with PowerShell. Rclone has subcommands hashsum (https://rclone.org/commands/rclone_hashsum/), md5sum (https://rclone.org/commands/rclone_md5sum/) and sha1sum (https://rclone.org/commands/rclone_sha1sum/) that use a compatible format, which means if you have an rclone executable on the server it can be used ๐. As mentioned above, they will be automatically picked up if found in PATH, but if not you can set something like /path/to/rclone md5sum as the value of option md5sum_command to make sure a specific executable is used.
Remote checksumming is recommended and enabled by default โจ. First time rclone is using an SFTP remote, if options md5sum_command or sha1_command are not set, it will check if any of the default commands for each of them, as described above, can be used. The result will be saved in the remote configuration, so next time it will use the same. The value none will be set if none of the default commands could be used for a specific algorithm, and this algorithm will not be supported by the remote.
Disabling the checksumming completely may be required if you are connecting to SFTP servers which are not under your control, and to which the execution of remote shell commands is prohibited. Set the configuration option disable_hashcheck to true to disable checksumming entirely (you get the same effect by setting option hashes to none or options md5sum_command, sha1_command etc. to none). Set option shell_type to none to not only disable checksumming, but also disable all other functionality that is based on remote shell command execution ๐ซถ.
Modification times and hashes โฐ
Modified times are stored on the server to 1 second precision.
Modified times are used in syncing and are fully supported ๐.
Some SFTP servers disable setting/modifying the file modification time after upload (for example, certain configurations of ProFTPd with mod_sftp). If you are using one of these servers, you can set the option set_modtime = false in your rclone backend configuration to disable this behaviour.
About command ๐
The about command returns the total space, free space, and used space on the remote for the disk of the specified path on the remote or, if not set, the disk of the root on the remote.
SFTP usually supports the about (https://rclone.org/commands/rclone_about/) command, but it depends on the server. If the server implements the vendor-specific VFS statistics extension, which is normally the case with OpenSSH instances, it will be used. If not, but the same login has access to a Unix shell, where the df command is available (e.g. in the remote's PATH), then this will be used instead. If the server shell is PowerShell, probably with a Windows OpenSSH server, rclone will use a built-in shell command (see shell access). If none of the above is applicable, about will fail ๐ญ.
Standard options ๐
Here are the Standard options specific to sftp (SSH/SFTP).
--sftp-host
SSH host to connect to.
E.g. "example.com".
Properties:
- Config: host
- Env Var:
RCLONE_SFTP_HOST - Type: string
- Required: true
--sftp-user
SSH username.
Properties:
- Config: user
- Env Var:
RCLONE_SFTP_USER - Type: string
- Default:
"$USER"
--sftp-port
SSH port number.
Properties:
- Config: port
- Env Var:
RCLONE_SFTP_PORT - Type: int
- Default:
22
--sftp-pass
SSH password, leave blank to use ssh-agent.
NB Input to this must be obscured - see rclone obscure (https://rclone.org/commands/rclone_obscure/).
Properties:
- Config: pass
- Env Var:
RCLONE_SFTP_PASS - Type: string
- Required: false
--sftp-key-pem
Raw PEM-encoded private key.
Note that this should be on a single line with line endings replaced with '', eg
key_pem = -----BEGIN RSA PRIVATE KEY-----\nMaMbaIXtE\n0gAMbMbaSsd\nMbaass\n-----END RSA PRIVATE KEY-----
This will generate the single line correctly:
awk '{printf "%s\\n", $0}' < ~/.ssh/id_rsa
If specified, it will override the key_file parameter.
Properties:
- Config: key_pem
- Env Var:
RCLONE_SFTP_KEY_PEM - Type: string
- Required: false
--sftp-key-file
Path to PEM-encoded private key file.
Leave blank or set key-use-agent to use ssh-agent.
Leading ~ will be expanded in the file name as will environment variables such as ${RCLONE_CONFIG_DIR}.
Properties:
- Config: key_file
- Env Var:
RCLONE_SFTP_KEY_FILE - Type: string
- Required: false
--sftp-key-file-pass
The passphrase to decrypt the PEM-encoded private key file.
Only PEM encrypted key files (old OpenSSH format) are supported. Encrypted keys in the new OpenSSH format can't be used ๐ญ.
NB Input to this must be obscured - see rclone obscure (https://rclone.org/commands/rclone_obscure/).
Properties:
- Config: key_file_pass
- Env Var:
RCLONE_SFTP_KEY_FILE_PASS - Type: string
- Required: false
--sftp-pubkey
SSH public certificate for public certificate based authentication. Set this if you have a signed certificate you want to use for authentication. If specified will override pubkey_file.
Properties:
- Config: pubkey
- Env Var:
RCLONE_SFTP_PUBKEY - Type: string
- Required: false
--sftp-pubkey-file
Optional path to public key file.
Set this if you have a signed certificate you want to use for authentication.
Leading ~ will be expanded in the file name as will environment variables such as ${RCLONE_CONFIG_DIR}.
Properties:
- Config: pubkey_file
- Env Var:
RCLONE_SFTP_PUBKEY_FILE - Type: string
- Required: false
--sftp-key-use-agent
When set forces the usage of the ssh-agent.
When key-file is also set, the ".pub" file of the specified key-file is read and only the associated key is requested from the ssh-agent. This allows to avoid Too many authentication failures for *username* errors when the ssh-agent contains many keys ๐.
Properties:
- Config: key_use_agent
- Env Var:
RCLONE_SFTP_KEY_USE_AGENT - Type: bool
- Default: false
--sftp-use-insecure-cipher
Enable the use of insecure ciphers and key exchange methods.
This enables the use of the following insecure ciphers and key exchange methods:
aes128-cbcaes192-cbcaes256-cbc3des-cbcdiffie-hellman-group-exchange-sha256diffie-hellman-group-exchange-sha1
Those algorithms are insecure and may allow plaintext data to be recovered by an attacker ๐.
This must be false if you use either ciphers or key_exchange advanced options.
Properties:
Properties:
- Config:
use_insecure_cipher - Env Var:
RCLONE_SFTP_USE_INSECURE_CIPHER - Type:
bool - Default:
false - Examples:
"false"- just use the default Cipher list, bb ๐
"true"- this one lets you use the
aes128-cbccipher plus thediffie-hellman-group-exchange-sha256anddiffie-hellman-group-exchange-sha1key exchange. yes fr, those exact ones. ๐
- this one lets you use the
--sftp-disable-hashcheckโ turn OFF the whole "hey lemme run some SSH commands real quick to see if this server does file hashing" thing.
Leave it blank, or set it to false, and hashing stays on (that's the recommended vibe โจ). Set it to true and hashing is off, periodt.
Properties:
- Config:
disable_hashcheck - Env Var:
RCLONE_SFTP_DISABLE_HASHCHECK - Type:
bool - Default:
false
--sftp-sshโ path and arguments for an externalsshbinary. ๐ฆ
Normally rclone just uses its own internal ssh library to talk to the SFTP server, no drama. But that library doesn't implement every possible ssh option out there, so sometimes you're gonna wanna hand the whole thing off to an external ssh binary instead.
Heads up bestie: when you use this option, rclone ignores all the internal config and just expects you to have configured that ssh binary with the user/host/port and whatever else it needs.
Important The ssh command has to log in without asking for a password, so it needs to be set up with keys or certificates. No password prompts, iykyk. ๐
rclone will run the command you gave it either with the extra arguments "-s sftp" (to reach the SFTP subsystem) or with commands like "md5sum /path/to/file" tacked on the end to read checksums.
Any arguments with spaces in them should be wrapped in "double quotes".
An example setting might be:
ssh -o ServerAliveInterval=20 user@example.com
Lowkey important: when you're using an external ssh binary, rclone opens a brand new ssh connection for every single hash it calculates. iconic but also ๐ญ
Properties:
- Config:
ssh - Env Var:
RCLONE_SFTP_SSH - Type:
SpaceSepList - Default: (empty)
โจ Advanced options โจ
Here are the Advanced options specific to sftp (SSH/SFTP). buckle up babe, this is where it gets good ๐
--sftp-known-hosts-fileโ optional path to aknown_hostsfile. ๐
Set this and you turn on server host key validation. Set it to none to silence that "No host key validation" notice rclone keeps yelling at you about.
A leading ~ gets expanded in the file name, and so do environment variables like ${RCLONE_CONFIG_DIR}.
Properties:
- Config:
known_hosts_file - Env Var:
RCLONE_SFTP_KNOWN_HOSTS_FILE - Type:
string - Required:
false - Examples:
"~/.ssh/known_hosts"- uses OpenSSH's
known_hostsfile ๐ซ
- uses OpenSSH's
--sftp-pin-host-keyโ pin the server host key on the first connection (Trust On First Use). ๐
This is meant for one-time use as the --sftp-pin-host-key command-line flag. Run rclone once with the flag and boom, the server's host key gets recorded into the host_keys config option. On later runs (without the flag) that host_keys value gets consulted and any mismatch is refused. no cap.
Setting this option persistently in the config file is not recommended. While it's set, rclone will also accept any new host key algorithm the server later presents, which widens the trust surface way beyond that first pin. To pin a new key after a legit key change, just re-run with the flag. ๐ธ
The first connection is unauthenticated, so ideally do it over a trusted network, or cross-check the fingerprint rclone logs against one you got out of band.
If known_hosts_file is also set, that one takes precedence and this option is simply ignored.
Properties:
- Config:
pin_host_key - Env Var:
RCLONE_SFTP_PIN_HOST_KEY - Type:
bool - Default:
false
--sftp-host-keysโ pinned host keys for this remote, used to verify the server. ๐
It's a comma-separated list of "algo base64-key" entries (same format as the second and third fields of an OpenSSH known_hosts line). Usually this gets populated automatically by running once with --sftp-pin-host-key, but you can hand-set it to pin a server's public key you got out of band. Note that each entry is the complete public key, not its SHA256 fingerprint.
When it's non-empty, the host key the server offers must match one of the entries or the connection is refused. To re-pin after a legit key change, clear this option and reconnect with --sftp-pin-host-key, or just edit the value directly.
At most 16 entries may be pinned.
Properties:
- Config:
host_keys - Env Var:
RCLONE_SFTP_HOST_KEYS - Type:
CommaSepList - Default: (empty)
--sftp-ask-passwordโ let rclone ask for the SFTP password when it needs one. ๐ซถ
If this is set and no password was supplied, then rclone will:
- ask for a password
- not contact the ssh agent
Properties:
- Config:
ask_password - Env Var:
RCLONE_SFTP_ASK_PASSWORD - Type:
bool - Default:
false
--sftp-path-overrideโ override the path used by SSH shell commands. ๐
This is what lets checksum calculation work when the SFTP path and the SSH path are different. This issue affects, among others, Synology NAS boxes.
E.g. if shared folders live in directories representing volumes:
rclone sync /home/local/directory remote:/directory --sftp-path-override /volume2/directory
E.g. if the home directory lives inside a shared folder called "home":
rclone sync /home/local/directory remote:/home/directory --sftp-path-override /volume1/homes/USER/directory
Wanna specify only the path to the SFTP remote's root, and let rclone add any relative subpaths automatically (including unwrapping/decrypting remotes as needed)? Just slap the '@' character at the beginning of the path. โจ
E.g. that first example above could be rewritten as:
rclone sync /home/local/directory remote:/directory --sftp-path-override @/volume2
Note that when you use this method with Synology "home" folders, you should specify the full /homes/USER path instead of /home.
E.g. the second example above should be rewritten as:
rclone sync /home/local/directory remote:/homes/USER/directory --sftp-path-override @/volume1
Properties:
- Config:
path_override - Env Var:
RCLONE_SFTP_PATH_OVERRIDE - Type:
string - Required:
false
--sftp-encodingโ the encoding for the backend. ๐
Check out the encoding section in the overview (https://rclone.org/overview/#encoding) for all the deets.
Properties:
- Config:
encoding - Env Var:
RCLONE_SFTP_ENCODING - Type:
Encoding - Default:
Slash,Del,Ctl,Dot
--sftp-set-modtimeโ set the modified time on the remote, if it's set. โฐ
Properties:
- Config:
set_modtime - Env Var:
RCLONE_SFTP_SET_MODTIME - Type:
bool - Default:
true
--sftp-shell-typeโ the type of SSH shell on the remote server, if any. ๐
Leave it blank and rclone will autodetect for you, bestie.
Properties:
- Config:
shell_type - Env Var:
RCLONE_SFTP_SHELL_TYPE - Type:
string - Required:
false - Examples:
"none"- no shell access at all
"unix"- Unix shell
"powershell"- PowerShell
"cmd"- Windows Command Prompt
--sftp-hashesโ comma separated list of supported checksum types. ๐งฎ
Properties:
- Config:
hashes - Env Var:
RCLONE_SFTP_HASHES - Type:
CommaSepList - Default: (empty)
--sftp-md5sum-commandโ the command used to read MD5 hashes.
Leave blank for autodetect.
Properties:
- Config:
md5sum_command - Env Var:
RCLONE_SFTP_MD5SUM_COMMAND - Type:
string - Required:
false
--sftp-sha1sum-commandโ the command used to read SHA-1 hashes.
Leave blank for autodetect.
Properties:
- Config:
sha1sum_command - Env Var:
RCLONE_SFTP_SHA1SUM_COMMAND - Type:
string - Required:
false
--sftp-crc32sum-commandโ the command used to read CRC-32 hashes.
Leave blank for autodetect.
Properties:
- Config:
crc32sum_command - Env Var:
RCLONE_SFTP_CRC32SUM_COMMAND - Type:
string - Required:
false
--sftp-sha256sum-commandโ the command used to read SHA-256 hashes.
Leave blank for autodetect.
Properties:
- Config:
sha256sum_command - Env Var:
RCLONE_SFTP_SHA256SUM_COMMAND - Type:
string - Required:
false
--sftp-blake3sum-commandโ the command used to read BLAKE3 hashes.
Leave blank for autodetect.
Properties:
- Config:
blake3sum_command - Env Var:
RCLONE_SFTP_BLAKE3SUM_COMMAND - Type:
string - Required:
false
--sftp-xxh3sum-commandโ the command used to read XXH3 hashes.
Leave blank for autodetect.
Properties:
- Config:
xxh3sum_command - Env Var:
RCLONE_SFTP_XXH3SUM_COMMAND - Type:
string - Required:
false
--sftp-xxh128sum-commandโ the command used to read XXH128 hashes.
Leave blank for autodetect.
Properties:
- Config:
xxh128sum_command - Env Var:
RCLONE_SFTP_XXH128SUM_COMMAND - Type:
string - Required:
false
--sftp-skip-linksโ set this to skip any symlinks and any other non regular files. ๐ซ๐
This only affects listing: symlinks and other non regular files get omitted from directory listings. It is not a security control and does not stop writes from following symlinks on the server โ confining an SFTP account to a directory has to be enforced server side (for example with a chroot jail or restricted permissions). fr fr, do not rely on this for that.
Properties:
- Config:
skip_links - Env Var:
RCLONE_SFTP_SKIP_LINKS - Type:
bool - Default:
false
--sftp-subsystemโ specifies the SSH2 subsystem on the remote host. ๐ฐ๏ธ
Properties:
- Config:
subsystem - Env Var:
RCLONE_SFTP_SUBSYSTEM - Type:
string - Default:
"sftp"
--sftp-server-commandโ specifies the path or command to run a sftp server on the remote host.
The subsystem option is ignored when server_command is defined. ๐
If you're adding server_command to the configuration file please note that it should not be enclosed in quotes, since that will make rclone fail.
A working example is:
[remote_name]
type = sftp
server_command = sudo /usr/libexec/openssh/sftp-server
Properties:
- Config:
server_command - Env Var:
RCLONE_SFTP_SERVER_COMMAND - Type:
string - Required:
false
--sftp-use-fstatโ if set, usefstatinstead ofstat. ๐
Some servers limit how many open files you can have, and calling Stat after opening the file will make the server throw an error. Setting this flag calls Fstat instead of Stat, and Fstat works on an already-open file handle. slay.
It's been found that this helps with IBM Sterling SFTP servers that have their "extractability" level set to 1, which means only 1 file can be opened at any given time.
Properties:
- Config:
use_fstat - Env Var:
RCLONE_SFTP_USE_FSTAT - Type:
bool - Default:
false
--sftp-disable-concurrent-readsโ flip this on and we don't do concurrent reads, periodt.
Normally concurrent reads are safe safe and turning them off is literally just gonna tank your performance, bestie, which is why this one is off by default. But some servers be gatekeeping how many times a file can be downloaded ๐ค and concurrent reads can trip that limit. So if your server keeps hitting you with
Failed to copy: file does not exist
then yeah, you might need to enable this flag.
Oh and heads up: if concurrent reads are disabled, the use_fstat option is just ignored. Bye.
Properties:
- Config:
disable_concurrent_reads - Env Var:
RCLONE_SFTP_DISABLE_CONCURRENT_READS - Type:
bool - Default:
false
--sftp-disable-concurrent-writesโ set it and no concurrent writes, simple as that.
Normally rclone uses concurrent writes to upload files, and the way that it improves performance greatly โ especially for distant servers โ is iconic ngl. This option disables concurrent writes should that be necessary.
Properties:
- Config:
disable_concurrent_writes - Env Var:
RCLONE_SFTP_DISABLE_CONCURRENT_WRITES - Type:
bool - Default:
false
--sftp-idle-timeoutโ max time before we close idle connections ๐ซถ
If no connections have been returned to the connection pool in the time given, rclone will empty the connection pool. Set to 0 to keep connections indefinitely.
Properties:
- Config:
idle_timeout - Env Var:
RCLONE_SFTP_IDLE_TIMEOUT - Type:
Duration - Default:
1m0s
--sftp-chunk-sizeโ the upload and download chunk size ๐
This controls the maximum size of payload in SFTP protocol packets. The RFC limits this to 32768 bytes (32k), which is the default. BUT ๐
a lot of servers support larger sizes โ typically limited to a maximum total package size of 256k โ and setting it larger will increase transfer speed dramatically on high latency links. This includes OpenSSH, and for example, using the value of 255k works well, leaving plenty of room for overhead while still being within a total packet size of 256k.
โ ๏ธ Bestie, please test thoroughly before using a value higher than 32k, and only use it if you always connect to the same server or after sufficiently broad testing. If you get errors such as "failed to send packet payload: EOF", lots of "connection lost", or "corrupted on transfer" when copying a larger file, try lowering the value.
The server run by rclone serve sftp sends packets with standard 32k maximum payload so you must not set a different chunk_size when downloading files, but it accepts packets up to the 256k total size, so for uploads the chunk_size can be set as for the OpenSSH example above.
Properties:
- Config:
chunk_size - Env Var:
RCLONE_SFTP_CHUNK_SIZE - Type:
SizeSuffix - Default:
32Ki
--sftp-concurrencyโ the maximum number of outstanding requests for one file ๐ฅ
This controls the maximum number of outstanding requests for one file. Increasing it will increase throughput on high latency links at the cost of using more memory.
Properties:
- Config:
concurrency - Env Var:
RCLONE_SFTP_CONCURRENCY - Type:
int - Default:
64
--sftp-connectionsโ maximum number of SFTP simultaneous connections,0for unlimited.
๐ Note that setting this is very likely to cause deadlocks so it should be used with care, fr fr.
If you are doing a sync or copy then make sure connections is one more than the sum of --transfers and --checkers.
If you use --check-first then it just needs to be one more than the maximum of --checkers and --transfers.
So for connections 3 you'd use --checkers 2 --transfers 2 --check-first or --checkers 1 --transfers 1.
Properties:
- Config:
connections - Env Var:
RCLONE_SFTP_CONNECTIONS - Type:
int - Default:
0
--sftp-set-envโ environment variables to pass to sftp and commands โจ
Set environment variables in the form:
VAR=value
to be passed to the sftp client and to any commands run (eg md5sum).
Pass multiple variables space separated, eg
VAR1=value VAR2=value
and pass variables with spaces in quotes, eg
"VAR3=value with space" "VAR4=value with space" VAR5=nospacehere
Properties:
- Config:
set_env - Env Var:
RCLONE_SFTP_SET_ENV - Type:
SpaceSepList - Default:
--sftp-ciphersโ space separated list of ciphers to be used for session encryption, ordered by preference ๐
At least one must match with server configuration. This can be checked for example using ssh -Q cipher.
This must not be set if use_insecure_cipher is true.
Example:
aes128-ctr aes192-ctr aes256-ctr aes128-gcm@openssh.com aes256-gcm@openssh.com
Properties:
- Config:
ciphers - Env Var:
RCLONE_SFTP_CIPHERS - Type:
SpaceSepList - Default:
--sftp-key-exchangeโ space separated list of key exchange algorithms, ordered by preference ๐
At least one must match with server configuration. This can be checked for example using ssh -Q kex.
This must not be set if use_insecure_cipher is true.
Example:
sntrup761x25519-sha512@openssh.com curve25519-sha256 curve25519-sha256@libssh.org ecdh-sha2-nistp256
Properties:
- Config:
key_exchange - Env Var:
RCLONE_SFTP_KEY_EXCHANGE - Type:
SpaceSepList - Default:
--sftp-macsโ space separated list of MACs (message authentication code) algorithms, ordered by preference ๐ง
At least one must match with server configuration. This can be checked for example using ssh -Q mac.
Example:
umac-64-etm@openssh.com umac-128-etm@openssh.com hmac-sha2-256-etm@openssh.com
Properties:
- Config:
macs - Env Var:
RCLONE_SFTP_MACS - Type:
SpaceSepList - Default:
--sftp-host-key-algorithmsโ space separated list of host key algorithms, ordered by preference ๐
At least one must match with server configuration. This can be checked for example using ssh -Q HostKeyAlgorithms.
Note: This can affect the outcome of key negotiation with the server even if server host key validation is not enabled.
Example:
ssh-ed25519 ssh-rsa ssh-dss
Properties:
- Config:
host_key_algorithms - Env Var:
RCLONE_SFTP_HOST_KEY_ALGORITHMS - Type:
SpaceSepList - Default:
--sftp-socks-proxyโ Socks 5 proxy host ๐งฆ
Supports the format user:pass@host:port, user@host:port, host:port.
Example:
myUser:myPass@localhost:9005
Properties:
- Config:
socks_proxy - Env Var:
RCLONE_SFTP_SOCKS_PROXY - Type:
string - Required:
false
--sftp-http-proxyโ URL for HTTP CONNECT proxy ๐
Set this to a URL for an HTTP proxy which supports the HTTP CONNECT verb.
Supports the format http://user:pass@host:port, http://host:port, http://host.
Example:
http://myUser:myPass@proxyhostname.example.com:8000
Properties:
- Config:
http_proxy - Env Var:
RCLONE_SFTP_HTTP_PROXY - Type:
string - Required:
false
--sftp-copy-is-hardlinkโ set to enable server side copies using hardlinks ๐
The SFTP protocol does not define a copy command so normally server side copies are not allowed with the sftp backend.
However the SFTP protocol does support hardlinking, and if you enable this flag then the sftp backend will support server side copies. These will be implemented by doing a hardlink from the source to the destination.
Not all sftp servers support this.
Note that hardlinking two files together will use no additional space as the source and the destination will be the same file.
This feature may be useful backups made with --copy-dest.
Properties:
- Config:
copy_is_hardlink - Env Var:
RCLONE_SFTP_COPY_IS_HARDLINK - Type:
bool - Default:
false
--sftp-descriptionโ description of the remote ๐
Properties:
- Config:
description - Env Var:
RCLONE_SFTP_DESCRIPTION - Type:
string - Required:
false
๐ Limitations ๐
On some SFTP servers (e.g. Synology) the paths are different for SSH and SFTP so the hashes can't be calculated properly. You can either use --sftp-path-override or disable_hashcheck.
The only ssh agent supported under Windows is Putty's pageant.
The Go SSH library disables the use of the aes128-cbc cipher by default, due to security concerns. This can be re-enabled on a per-connection basis by setting the use_insecure_cipher setting in the configuration file to true. Further details on the insecurity of this cipher can be found in this paper (http://www.isg.rhul.ac.uk/~kp/SandPfinal.pdf).
SFTP isn't supported under plan9 until this issue (https://github.com/pkg/sftp/issues/156) is fixed.
Note that since SFTP isn't HTTP based the following flags don't work with it: --dump headers, --dump bodies, --dump auth.
Note that --timeout and --contimeout are both supported.
๐ rsync.net ๐
rsync.net is supported through the SFTP backend.
See rsync.net's documentation of rclone examples (https://www.rsync.net/products/rclone.html).
๐ฆ Hetzner Storage Box ๐ฆ
Hetzner Storage Boxes are supported through the SFTP backend on port 23.
See Hetzner's documentation for details (https://docs.hetzner.com/robot/storage-box/access/access-ssh-rsync-borg#rclone)
๐ Shade
Ok bestie, this one's a whole backend for the Shade platform โ like, https://shade.inc/ โ and we're about to get into it. โจ
๐ฆ About Shade
So basically Shade (https://shade.inc/) is an AI-powered cloud NAS that makes your cloud files act like a local drive?? Iconic behaviour honestly. It's optimized for media and creative workflows, and it gives you fast, secure access plus natural-language search, easy sharing, and scalable cloud storage. Chef's kiss. ๐
๐ธ Accounts & Pricing
To use this backend you need to make a free account (https://app.shade.inc/) on Shade. You can start free and get 20GB of storage for free โ like, actually free, no cap. ๐
๐ Usage
Paths are specified as remote:path
Paths may be as deep as required, e.g. remote:directory/subdirectory.
โ๏ธ Configuration
Here's an example of making a Shade configuration, step by step, like a little tutorial for my besties. ๐ซถ
First, create a create a free account (https://app.shade.inc/) account and choose a plan.
You will need to log in and get the API Key and Drive ID for your account from the settings section of your account and created drive respectively.
Now run
rclone config
Follow this interactive process:
$ rclone config
e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
e/n/d/r/c/s/q> n
Enter name for new remote.
name> Shade
Option Storage.
Type of storage to configure.
Choose a number from below, or type in your own value.
[OTHER OPTIONS]
xx / Shade FS
\ (shade)
[OTHER OPTIONS]
Storage> xx
Option drive_id.
The ID of your drive, see this in the drive settings. Individual rclone configs must be made per drive.
Enter a value.
drive_id> [YOUR_ID]
Option api_key.
An API key for your account.
Enter a value.
api_key> [YOUR_API_KEY]
Edit advanced config?
y) Yes
n) No (default)
y/n> n
Configuration complete.
Options:
- type: shade
- drive_id: [YOUR_ID]
- api_key: [YOUR_API_KEY]
Keep this "Shade" remote?
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d> y
๐ Modification times and hashes
Shade does not support hashes and writing mod times. It's giving "we don't do that here" and honestly, we cope. ๐ญ
๐ค Transfers
Shade uses multipart uploads by default. This means that files will be chunked and sent up to Shade concurrently. In order to configure how many simultaneous uploads you want to use, upload the 'concurrency' option in the advanced config section. Note that this uses more memory and initiates more http requests. ๐
๐๏ธ Deleting files
Please note that when deleting files in Shade via rclone it will delete the file instantly, instead of sending it to the trash. This means that it will not be recoverable.
โ ๏ธ Bestie read this twice: gone is gone. No trash, no undo, no resurrection arc. ๐
โจ Standard options
Here are the Standard options specific to shade (Shade FS).
๐ --shade-drive-id
The ID of your drive, see this in the drive settings. Individual rclone configs must be made per drive.
Properties:
- Config:
drive_id - Env Var:
RCLONE_SHADE_DRIVE_ID - Type:
string - Required: true
๐ --shade-api-key
An API key for your account.
Properties:
- Config:
api_key - Env Var:
RCLONE_SHADE_API_KEY - Type:
string - Required: true
๐ฅ Advanced options
Here are the Advanced options specific to shade (Shade FS).
๐ --shade-endpoint
Endpoint for the service.
Leave blank normally.
Properties:
- Config:
endpoint - Env Var:
RCLONE_SHADE_ENDPOINT - Type:
string - Required: false
๐ --shade-chunk-size
Chunk size to use for uploading.
Any files larger than this will be uploaded in chunks of this size.
Note that this is stored in memory per transfer, so increasing it will increase memory usage.
Minimum is 5MB, maximum is 5GB.
Properties:
- Config:
chunk_size - Env Var:
RCLONE_SHADE_CHUNK_SIZE - Type:
SizeSuffix - Default:
64Mi
๐ --shade-upload-concurrency
Concurrency for multipart uploads and copies. This is the number of chunks of the same file that are uploaded concurrently for multipart uploads and copies.
Properties:
- Config:
upload_concurrency - Env Var:
RCLONE_SHADE_UPLOAD_CONCURRENCY - Type:
int - Default:
4
๐ --shade-max-upload-parts
Maximum amount of parts in a multipart upload.
Properties:
- Config:
max_upload_parts - Env Var:
RCLONE_SHADE_MAX_UPLOAD_PARTS - Type:
int - Default:
10000
๐ --shade-token
JWT Token for performing Shade FS operations. Don't set this value - rclone will set it automatically
Properties:
- Config:
token - Env Var:
RCLONE_SHADE_TOKEN - Type:
string - Required: false
๐ --shade-token-expiry
JWT Token Expiration time. Don't set this value - rclone will set it automatically
Properties:
- Config:
token_expiry - Env Var:
RCLONE_SHADE_TOKEN_EXPIRY - Type:
string - Required: false
๐ --shade-encoding
The encoding for the backend.
See the encoding section in the overview (https://rclone.org/overview/#encoding) for more info.
Properties:
- Config:
encoding - Env Var:
RCLONE_SHADE_ENCODING - Type:
Encoding - Default:
Slash,BackSlash,Del,Ctl,InvalidUtf8,Dot
๐ --shade-description
Description of the remote.
Properties:
- Config:
description - Env Var:
RCLONE_SHADE_DESCRIPTION - Type:
string - Required: false
๐ง Limitations
Note that Shade is case insensitive so you can't have a file called "Hello.doc" and one called "hello.doc". Pick one, bestie. ๐ญ
Shade only supports filenames up to 255 characters in length.
rclone about is not supported by the Shade backend. Backends without this capability cannot determine free space for an rclone mount or use policy mfs (most free space) as a member of an rclone union remote.
See List of backends that do not support rclone about (https://rclone.org/overview/#optional-features) and rclone about (https://rclone.org/commands/rclone_about/)
๐ ๏ธ Backend commands
Here are the commands specific to the shade backend.
Run them with
rclone backend COMMAND remote:
The help below will explain what arguments each command takes.
See the backend (https://rclone.org/commands/rclone_backend/) command for more info on how to pass options and arguments.
These can be run on a running backend using the rc command backend/command (https://rclone.org/rc/#backend-command).
โจ๐ SMB ๐โจ
Okay bestie, SMB is a communication protocol for sharing files over a network (<https://en.wikipedia.org/wiki/Server_Message_Block>).
This one leans on the go-smb2 library (<https://github.com/CloudSoda/go-smb2/>) to do all the talking with the SMB protocol.
Paths go like remote:sharename (or just remote: if you're doing the lsd command ๐ธ). You can totally drop subdirectories in there too, like remote:item/path/to/dir.
๐ Notes
The very first path segment has to be the name of the share โ the one you typed when you started sharing on Windows. On smbd, it's the section title in smb.conf (usually chillin' in /etc/samba/). Not sure what shares exist? Just query the root, like rclone lsd remote: ๐ฆ
You can't get at shared printers from rclone. Obviously. ๐
You also can't use Anonymous access to log in โ nope, not a thing here. You have to use the guest user with an empty password instead. The rclone client tries to dodge 8.3 names when uploading files by encoding trailing spaces and periods. Alternatively, the local backend (<https://rclone.org/local/#paths-on-windows>) on Windows can reach SMB servers using UNC paths, via \\server\share. That trick does not apply to non-Windows OSes like Linux and macOS, sorry bestie. ๐
โ๏ธ Configuration
Here's an example of setting up a SMB configuration.
First run
rclone config
This will walk you through an interactive setup process, like a lil guided tour ๐
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
name> remote
Option Storage.
Type of storage to configure.
Choose a number from below, or type in your own value.
XX / SMB / CIFS
\ (smb)
Storage> smb
Option host.
Samba hostname to connect to.
E.g. "example.com".
Enter a value.
host> localhost
Option user.
Samba username.
Enter a string value. Press Enter for the default (lesmi).
user> guest
Option port.
Samba port number.
Enter a signed integer. Press Enter for the default (445).
port>
Option pass.
Samba password.
Choose an alternative below. Press Enter for the default (n).
y) Yes, type in my own password
g) Generate random password
n) No, leave this optional password blank (default)
y/g/n> g
Password strength in bits.
64 is just about memorable
128 is secure
1024 is the maximum
Bits> 64
Your password is: XXXX
Use this password? Please note that an obscured version of this
password (and not the password itself) will be stored under your
configuration file, so keep this generated password in a safe place.
y) Yes (default)
n) No
y/n> y
Option domain.
Domain name for NTLM authentication.
Enter a string value. Press Enter for the default (WORKGROUP).
domain>
Edit advanced config?
y) Yes
n) No (default)
y/n> n
Configuration complete.
Options:
- type: samba
- host: localhost
- user: guest
- pass: *** ENCRYPTED ***
Keep this "remote" remote?
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d> d
๐ Standard options
Here are the Standard options specific to smb (SMB / CIFS). โจ
--smb-host
SMB server hostname to connect to.
E.g. "example.com".
Properties:
- Config:
host - Env Var:
RCLONE_SMB_HOST - Type: string
- Required: true
--smb-user
SMB username.
Leave blank to use the current user name.
Properties:
- Config:
user - Env Var:
RCLONE_SMB_USER - Type: string
- Required: false
--smb-port
SMB port number.
Properties:
- Config:
port - Env Var:
RCLONE_SMB_PORT - Type: int
- Default:
445
--smb-pass
SMB password.
NB Input to this must be obscured โ see rclone obscure (<https://rclone.org/commands/rclone_obscure/>).
Properties:
- Config:
pass - Env Var:
RCLONE_SMB_PASS - Type: string
- Required: false
--smb-domain
Domain name for NTLM authentication.
Properties:
- Config:
domain - Env Var:
RCLONE_SMB_DOMAIN - Type: string
- Default:
"WORKGROUP"
--smb-spn
Service principal name.
Rclone shows this name to the server. Some servers use it as extra authentication, and it often needs to be set for clusters. For example:
cifs/remotehost:1020
Leave blank if you're not sure. ๐ซถ
Properties:
- Config:
spn - Env Var:
RCLONE_SMB_SPN - Type: string
- Required: false
--smb-use-kerberos
Use Kerberos authentication.
If set, rclone will use Kerberos authentication instead of NTLM. This needs a valid Kerberos configuration and credentials cache available โ either in the default locations or as specified by the KRB5_CONFIG and KRB5CCNAME environment variables.
Properties:
- Config:
use_kerberos - Env Var:
RCLONE_SMB_USE_KERBEROS - Type: bool
- Default:
false
๐ฅ Advanced options
Here are the Advanced options specific to smb (SMB / CIFS).
--smb-idle-timeout
Max time before closing idle connections.
If no connections have been returned to the connection pool in the time given, rclone will empty the connection pool.
Set to 0 to keep connections indefinitely.
Properties:
- Config:
idle_timeout - Env Var:
RCLONE_SMB_IDLE_TIMEOUT - Type: Duration
- Default:
1m0s
--smb-hide-special-share
Hide special shares (e.g. print$) which users aren't supposed to access.
Properties:
- Config:
hide_special_share - Env Var:
RCLONE_SMB_HIDE_SPECIAL_SHARE - Type: bool
- Default:
true
--smb-case-insensitive
Whether the server is configured to be case-insensitive.
Always true on Windows shares.
Properties:
- Config:
case_insensitive - Env Var:
RCLONE_SMB_CASE_INSENSITIVE - Type: bool
- Default:
true
--smb-kerberos-ccache
Path to the Kerberos credential cache (krb5cc).
Overrides the default KRB5CCNAME environment variable and lets this instance of the SMB backend use a different Kerberos cache file. Super useful when you're mounting multiple SMB with different credentials or running in multi-user environments. ๐
Supported formats:
FILE:/path/to/ccacheโ Use the specified file.DIR:/path/to/ccachedirโ Use the primary file inside the specified directory./path/to/ccacheโ Interpreted as a file path.
Properties:
- Config:
kerberos_ccache - Env Var:
RCLONE_SMB_KERBEROS_CCACHE - Type: string
- Required: false
--smb-encoding
The encoding for the backend.
See the encoding section in the overview (<https://rclone.org/overview/#encoding>) for more info.
Properties:
- Config:
encoding - Env Var:
RCLONE_SMB_ENCODING - Type: Encoding
- Default:
Slash,LtGt,DoubleQuote,Colon,Question,Asterisk,Pipe,BackSlash,Ctl,RightSpace,RightPeriod,InvalidUtf8,Dot
--smb-description
Description of the remote.
Properties:
- Config:
description - Env Var:
RCLONE_SMB_DESCRIPTION - Type: string
- Required: false
๐ Storj ๐
Storj (<https://storj.io>) is redefining the cloud to support the future of data โ sustainably and economically. Storj leverages the vast global supply of underutilized resources to deliver better security, durability, and performance services. Experience up to 90% lower costs and carbon reduction with Storj. ๐
Storj is an encrypted, secure, and cost-effective object storage service that lets you store, back up, and archive large amounts of data in a decentralized manner. So cute, so decentralized โจ
๐ง Backend options
Storj can be used both with this native backend and with the s3 backend using the Storj S3 compatible gateway (<https://rclone.org/s3/#storj>) (shared or private).
Use this backend to take advantage of client-side encryption, plus to get the best possible download performance. Uploads get erasure-coded locally, so a 1gb upload will result in 2.68gb of data being uploaded to storage nodes across the network. ๐ญ (yes, really)
Use the s3 backend and one of the S3 compatible Hosted Gateways to increase upload performance and reduce the load on your systems and network. Uploads will be encrypted and erasure-coded server-side, so a 1GB upload will result in only 1GB of data being uploaded to storage nodes across the network. Slay ๐ซถ
Side by side comparison with more details:
- Characteristics:
- Storj backend: Uses native RPC protocol, connects directly to the storage nodes which hosts the data. Requires more CPU resource of encoding/decoding and has network amplification (especially during the upload), uses lots of TCP connections
- S3 backend: Uses S3 compatible HTTP Rest API via the shared gateways. There is no network amplification, but performance depends on the shared gateways and the secret encryption key is shared with the gateway.
- Typical usage:
- Storj backend: Server environments and desktops with enough resources, internet speed and connectivity โ and applications where storjs client-side encryption is required.
- S3 backend: Desktops and similar with limited resources, internet speed or connectivity.
- Security:
- Storj backend: strong. Private encryption key doesn't need to leave the local computer.
- S3 backend: weaker. Private encryption key is shared with (<https://docs.storj.io/dcs/api-reference/s3-compatible-gateway#security-and-encryption>) the authentication service of the hosted gateway, where it's stored encrypted. It can be stronger when combining with the rclone crypt backend.
- Bandwidth usage (upload):
- Storj backend: higher. As data is erasure coded on the client side both the original data and the parities should be uploaded. About ~2.7 times more data is required to be uploaded. Client may start to upload with even higher number of nodes (~3.7 times more) and abandon/stop the slow uploads.
- S3 backend: normal. Only the raw data is uploaded, erasure coding happens on the gateway.
- Bandwidth usage (download)
- Storj backend: it's giving almost normal โจ. Only the minimal number of data is required, but to avoid very slow data providers a few more sources are used and the slowest are ignored (max
1.2xoverhead).- S3 backend: normal. Only the raw data is downloaded, erasure coding happens on the shared gateway. Simple as that ๐
- CPU usage:
- Storj backend: higher, but more predictable. Erasure code and encryption/decryption happens locally which requires significant CPU usage.
- S3 backend: less. Erasure code and encryption/decryption happens on shared s3 gateways (and as is, it depends on the current load on the gateways).
- TCP connection usage:
- Storj backend: high. A direct connection is required to each of the Storj nodes resulting in
110connections on upload and35on download per64 MBsegment. Not all the connections are actively used (slow ones are pruned), but they are all opened. Adjusting the max open file limit (https://rclone.org/storj/#known-issues) may be required. - S3 backend: normal. Only one connection per download/upload thread is required to the shared gateway.
- Storj backend: high. A direct connection is required to each of the Storj nodes resulting in
- Overall performance:
- Storj backend: with enough resources (CPU and bandwidth) storj backend can provide even
2xbetter performance. Data is directly downloaded to / uploaded from to the client instead of the gateway. - S3 backend: Can be faster on edge devices where CPU and network bandwidth is limited as the shared S3 compatible gateways take care about the encrypting/decryption and erasure coding and no download/upload amplification.
- Storj backend: with enough resources (CPU and bandwidth) storj backend can provide even
- Decentralization:
- Storj backend: high. Data is downloaded directly from the distributed cloud of storage providers.
- S3 backend: low. Requires a running S3 gateway (either self-hosted or Storj-hosted).
- Limitations:
- Storj backend: rclone checksum is not possible without download, as checksum metadata is not calculated during upload ๐
- S3 backend: secret encryption key is shared with the gateway ๐
โ๏ธ Configuration โ๏ธ
To make a new Storj configuration you need one of the following, bestie โ pick your fighter:
- Access Grant that someone else shared with you.
- API Key (https://storj.dev/learn/concepts/access/access-grants/api-key) of a Storj project you are a member of.
Here is an example of how to make a remote called remote. First run:
rclone config
This will guide you through an interactive setup process, no cap ๐
Setup with access grant
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
name> remote
Type of storage to configure.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
[snip]
XX / Storj Decentralized Cloud Storage
\ "storj"
[snip]
Storage> storj
** See help for storj backend at: https://rclone.org/storj/ **
Choose an authentication method.
Enter a string value. Press Enter for the default ("existing").
Choose a number from below, or type in your own value
1 / Use an existing access grant.
\ "existing"
2 / Create a new access grant from satellite address, API key, and passphrase.
\ "new"
provider> existing
Access Grant.
Enter a string value. Press Enter for the default ("").
access_grant> your-access-grant-received-by-someone-else
Remote config
Configuration complete.
Options:
- type: storj
- access_grant: your-access-grant-received-by-someone-else
Keep this "remote" remote?
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d> y
Setup with API key and passphrase
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
name> remote
Type of storage to configure.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
[snip]
XX / Storj Decentralized Cloud Storage
\ "storj"
[snip]
Storage> storj
** See help for storj backend at: https://rclone.org/storj/ **
Choose an authentication method.
Enter a string value. Press Enter for the default ("existing").
Choose a number from below, or type in your own value
1 / Use an existing access grant.
\ "existing"
2 / Create a new access grant from satellite address, API key, and passphrase.
\ "new"
provider> new
Satellite Address. Custom satellite address should match the format: `<nodeid>@<address>:<port>`.
Enter a string value. Press Enter for the default ("us1.storj.io").
Choose a number from below, or type in your own value
1 / US1
\ "us1.storj.io"
2 / EU1
\ "eu1.storj.io"
3 / AP1
\ "ap1.storj.io"
satellite_address> 1
API Key.
Enter a string value. Press Enter for the default ("").
api_key> your-api-key-for-your-storj-project
Encryption Passphrase. To access existing objects enter passphrase used for uploading.
Enter a string value. Press Enter for the default ("").
passphrase> your-human-readable-encryption-passphrase
Remote config
Configuration complete.
Options:
- type: storj
- satellite_address: 12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S@us1.storj.io:7777
- api_key: your-api-key-for-your-storj-project
- passphrase: your-human-readable-encryption-passphrase
- access_grant: the-access-grant-generated-from-the-api-key-and-passphrase
Keep this "remote" remote?
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d> y
โจ Standard options โจ
Here are the Standard options specific to storj (Storj Decentralized Cloud Storage). Lock in ๐
--storj-provider
Choose an authentication method.
Properties:
- Config:
provider - Env Var:
RCLONE_STORJ_PROVIDER - Type: string
- Default:
"existing" - Examples:
"existing"- Use an existing access grant.
"new"- Create a new access grant from satellite address, API key, and passphrase.
--storj-access-grant
Access grant. ๐๏ธ
Properties:
- Config:
access_grant - Env Var:
RCLONE_STORJ_ACCESS_GRANT - Provider:
existing - Type: string
- Required: false
--storj-satellite-address
Satellite address. ๐ฐ๏ธ
Custom satellite address should match the format: <nodeid>@<address>:<port>.
Properties:
- Config:
satellite_address - Env Var:
RCLONE_STORJ_SATELLITE_ADDRESS - Provider:
new - Type: string
- Default:
"us1.storj.io" - Examples:
"us1.storj.io"- US1
"eu1.storj.io"- EU1
"ap1.storj.io"- AP1
--storj-api-key
API key. ๐
Properties:
- Config:
api_key - Env Var:
RCLONE_STORJ_API_KEY - Provider:
new - Type: string
- Required: false
--storj-passphrase
Encryption passphrase. ๐คซ
To access existing objects enter passphrase used for uploading.
Properties:
- Config:
passphrase - Env Var:
RCLONE_STORJ_PASSPHRASE - Provider:
new - Type: string
- Required: false
๐ Advanced options ๐
Here are the Advanced options specific to storj (Storj Decentralized Cloud Storage). Yes bestie, there's more ๐
--storj-description
Description of the remote.
Properties:
- Config:
description - Env Var:
RCLONE_STORJ_DESCRIPTION - Type: string
- Required: false
๐ Usage ๐
Paths are specified as remote:bucket (or remote: for the lsf command.) You may put subdirectories in too, e.g. remote:bucket/path/to/dir.
Once configured you can then use rclone like this. Let's gooo ๐ฆ
Create a new bucket
Use the mkdir command to create new bucket, e.g. bucket.
rclone mkdir remote:bucket
List all buckets
Use the lsf command to list all buckets.
rclone lsf remote:
Note the colon (:) character at the end of the command line. Don't forget it, bestie, it's lowkey essential ๐
Delete a bucket
Use the rmdir command to delete an empty bucket.
rclone rmdir remote:bucket
Use the purge command to delete a non-empty bucket with all its content.
rclone purge remote:bucket
Upload objects
Use the copy command to upload an object.
rclone copy --progress /home/local/directory/file.ext remote:bucket/path/to/dir/
The --progress flag is for displaying progress information. Remove it if you don't need this information.
Use a folder in the local path to upload all its objects.
rclone copy --progress /home/local/directory/ remote:bucket/path/to/dir/
Only modified files will be copied. โจ
List objects
Use the ls command to list recursively all objects in a bucket.
rclone ls remote:bucket
Add the folder to the remote path to list recursively all objects in this folder.
$ rclone ls remote:bucket
/path/to/dir/
Use the lsf command to list non-recursively all objects in a bucket or a folder.
rclone lsf remote:bucket/path/to/dir/
Download objects
Use the copy command to download an object.
rclone copy --progress remote:bucket/path/to/dir/file.ext /home/local/directory/
The --progress flag is for displaying progress information. Remove it if you don't need this information.
Use a folder in the remote path to download all its objects.
rclone copy --progress remote:bucket/path/to/dir/ /home/local/directory/
Delete objects
Use the deletefile command to delete a single object.
rclone deletefile remote:bucket/path/to/dir/file.ext
Use the delete command to delete all object in a folder.
rclone delete remote:bucket/path/to/dir/
Print the total size of objects
Use the size command to print the total size of objects in a bucket or a folder.
rclone size remote:bucket/path/to/dir/
Sync two Locations
Use the sync command to sync the source to the destination, changing the destination only, deleting any excess files.
rclone sync --interactive --progress /home/local/directory/ remote:bucket/path/to/dir/
Heads up bestie โ sync changes the destination only and deletes excess files there, so vibe check your paths before you hit enter ๐
The --progress flag is just there so you can watch the little bars go โจ โ if you don't need that info, drop it, it's not that deep.
bestie, this can genuinely cause data loss, so please test first with the --dry-run flag so you can see exactly what would be copied and deleted. no cap. ๐
You can also do the sync the other way around โ Storj โก๏ธ your local file system:
rclone sync --interactive --progress remote:bucket/path/to/dir/ /home/local/directory/
Or between two Storj buckets, iconic glow-up style:
rclone sync --interactive --progress remote-us:bucket/path/to/dir/ remote-europe:bucket/path/to/dir/
Or even between some other cloud storage and Storj, because rclone does not play favourites:
rclone sync --interactive --progress s3:bucket/path/to/dir/ storj:bucket/path/to/dir/
Limitations ๐
rclone about is not supported by the rclone Storj backend. Backends without this capability cannot determine free space for an rclone mount or use policy mfs (most free space) as a member of an rclone union remote. ๐ญ
Go peek at List of backends that do not support rclone about (https://rclone.org/overview/#optional-features) and rclone about (https://rclone.org/commands/rclone_about/).
Known issues ๐ซ
If you get errors like too many open files, this usually happens when the default ulimit for system max open files is exceeded. Native Storj protocol opens a large number of TCP connections (each of which is counted as an open file). For a single upload stream you can expect 110 TCP connections to be opened. For a single download stream you can expect 35. This batch of connections will be opened for every 64 MiB segment and you should also expect TCP connections to be reused. If you do many transfers you eventually open a connection to most storage nodes (thousands of nodes). it's giving swarm energy fr fr ๐
To fix these, please raise your system limits. You can do this issuing a ulimit -n 65536 just before you run rclone. To change the limits more permanently you can add this to your shell startup script, e.g. $HOME/.bashrc, or change the system-wide configuration, usually /etc/sysctl.conf and/or /etc/security/limits.conf, but please refer to your operating system manual. ๐
๐ฌ SugarSync ๐ฌ
SugarSync (https://sugarsync.com) is a cloud service that enables active synchronization of files across computers and other devices for file backup, access, syncing, and sharing. very "my files follow me around like a loyal little duckling" of it ๐ฆ
Configuration ๐ง
The initial setup for SugarSync involves getting a token from SugarSync which you can do with rclone. rclone config walks you through it. slay, hand-held the whole way ๐ซถ
Here is an example of how to make a remote called remote. First run:
rclone config
This will guide you through an interactive setup process:
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
name> remote
Type of storage to configure.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
[snip]
XX / Sugarsync
\ "sugarsync"
[snip]
Storage> sugarsync
** See help for sugarsync backend at: https://rclone.org/sugarsync/ **
Sugarsync App ID.
Leave blank to use rclone's.
Enter a string value. Press Enter for the default ("").
app_id>
Sugarsync Access Key ID.
Leave blank to use rclone's.
Enter a string value. Press Enter for the default ("").
access_key_id>
Sugarsync Private Access Key
Leave blank to use rclone's.
Enter a string value. Press Enter for the default ("").
private_access_key>
Permanently delete files if true
otherwise put them in the deleted files.
Enter a boolean value (true or false). Press Enter for the default ("false").
hard_delete>
Edit advanced config? (y/n)
y) Yes
n) No (default)
y/n> n
Remote config
Username (email address)> nick@craig-wood.com
Your Sugarsync password is only required during setup and will not be stored.
password:
Configuration complete.
Options:
- type: sugarsync
- refresh_token: https://api.sugarsync.com/app-authorization/XXXXXXXXXXXXXXXXXX
Keep this "remote" remote?
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d> y
Note that the config asks for your email and password but doesn't store them, it only uses them to get the initial token. your secrets stay your secrets, periodt ๐
Once configured you can then use rclone like this (replace remote with the name you gave your remote):
List directories (sync folders) in top level of your SugarSync
rclone lsd remote:
List all the files in your SugarSync folder "Test"
rclone ls remote:Test
To copy a local directory to an SugarSync folder called backup
rclone copy /home/source remote:backup
Paths are specified as remote:path
Paths may be as deep as required, e.g. remote:directory/subdirectory.
NB you can't create files in the top level folder you have to create a folder, which rclone will create as a "Sync Folder" with SugarSync. ๐ (the top level is like, decorative only, bestie)
Modification times and hashes ๐
SugarSync does not support modification times or hashes, therefore syncing will default to --size-only checking. Note that using --update will work as rclone can read the time files were uploaded.
Restricted filename characters ๐ซ
SugarSync replaces the default restricted characters set (https://rclone.org/overview/#restricted-characters) except for DEL.
Invalid UTF-8 bytes will also be replaced (https://rclone.org/overview/#invalid-utf8), as they can't be used in XML strings.
Deleting files ๐๏ธ
Deleted files will be moved to the "Deleted items" folder by default.
However you can supply the flag --sugarsync-hard-delete or set the config parameter hard_delete = true if you would like files to be deleted straight away. gone gone, no recycle bin era ๐ฅ
Standard options โญ
Here are the Standard options specific to sugarsync (Sugarsync).
--sugarsync-app-idโ Sugarsync App ID.
Leave blank to use rclone's.
Properties:
- Config:
app_id - Env Var:
RCLONE_SUGARSYNC_APP_ID - Type:
string - Required:
false
--sugarsync-access-key-idโ Sugarsync Access Key ID.
Leave blank to use rclone's.
Properties:
- Config:
access_key_id - Env Var:
RCLONE_SUGARSYNC_ACCESS_KEY_ID - Type:
string - Required:
false
--sugarsync-private-access-keyโ Sugarsync Private Access Key.
Leave blank to use rclone's.
Properties:
- Config:
private_access_key - Env Var:
RCLONE_SUGARSYNC_PRIVATE_ACCESS_KEY - Type:
string - Required:
false
--sugarsync-hard-deleteโ Permanently delete files if true otherwise put them in the deleted files.
Properties:
- Config:
hard_delete - Env Var:
RCLONE_SUGARSYNC_HARD_DELETE - Type:
bool - Default:
false
Advanced options ๐ง
Here are the Advanced options specific to sugarsync (Sugarsync).
--sugarsync-refresh-tokenโ Sugarsync refresh token.
Leave blank normally, will be auto configured by rclone.
Properties:
- Config:
refresh_token - Env Var:
RCLONE_SUGARSYNC_REFRESH_TOKEN - Type:
string - Required:
false
--sugarsync-authorizationโ Sugarsync authorization.
Leave blank normally, will be auto configured by rclone.
Properties:
- Config:
authorization - Env Var:
RCLONE_SUGARSYNC_AUTHORIZATION - Type:
string - Required:
false
--sugarsync-authorization-expiryโ Sugarsync authorization expiry.
Leave blank normally, will be auto configured by rclone.
Properties:
- Config:
authorization_expiry - Env Var:
RCLONE_SUGARSYNC_AUTHORIZATION_EXPIRY - Type:
string - Required:
false
--sugarsync-userโ Sugarsync user.
Leave blank normally, will be auto configured by rclone.
Properties:
- Config:
user - Env Var:
RCLONE_SUGARSYNC_USER - Type:
string - Required:
false
--sugarsync-root-idโ Sugarsync root id.
Leave blank normally, will be auto configured by rclone.
Properties:
- Config:
root_id - Env Var:
RCLONE_SUGARSYNC_ROOT_ID - Type:
string - Required:
false
--sugarsync-deleted-idโ Sugarsync deleted folder id.
Leave blank normally, will be auto configured by rclone.
Properties:
- Config:
deleted_id - Env Var:
RCLONE_SUGARSYNC_DELETED_ID - Type:
string - Required:
false
--sugarsync-encodingโ The encoding for the backend.
See the encoding section in the overview (https://rclone.org/overview/#encoding) for more info.
Properties:
- Config:
encoding - Env Var:
RCLONE_SUGARSYNC_ENCODING - Type:
Encoding - Default:
Slash,Ctl,InvalidUtf8,Dot
--sugarsync-descriptionโ Description of the remote.
Properties:
- Config:
description - Env Var:
RCLONE_SUGARSYNC_DESCRIPTION - Type:
string - Required:
false
Limitations ๐ธ
rclone about is not supported by the SugarSync backend. Backends without this capability cannot determine free space for an rclone mount or use policy mfs (most free space) as a member of an rclone union remote. yeah, it just doesn't know how much room is left, don't ask her ๐
See List of backends that do not support rclone about (https://rclone.org/overview/#optional-features) and rclone about (https://rclone.org/commands/rclone_about/).
โจ Uloz.to โจ
Ok bestie, so paths here are literally just written like remote:path ๐
And they can go as deep as you need, no cap โ like remote:directory/subdirectory.
The whole initial setup is just you filling in your user credentials, and rclone config holds your hand through the entire thing ๐ซถ
๐ Configuration
Here's a whole example of how to make a remote called remote. First, run:
rclone config
It'll walk you through an interactive setup, like this:
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
name> remote
Type of storage to configure.
Choose a number from below, or type in your own value
[snip]
XX / Uloz.to
\ "ulozto"
[snip]
Storage> ulozto
Option app_token.
The application token identifying the app. An app API key can be either found in the API doc
https://uloz.to/upload-resumable-api-beta or obtained from customer service.
Enter a value. Press Enter to leave empty.
app_token> token_value
Option username.
The username of the principal to operate as.
Enter a value. Press Enter to leave empty.
username> user
Option password.
The password for the user.
Choose an alternative below. Press Enter for the default (n).
y) Yes, type in my own password
g) Generate random password
n) No, leave this optional password blank (default)
y/g/n> y
Enter the password:
password:
Confirm the password:
password:
Edit advanced config?
y) Yes
n) No (default)
y/n> n
Keep this "remote" remote?
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d> y
Once that's all set up, you can use rclone like this (and swap remote out for whatever name you gave yours):
List the folders sitting in your root level folder:
rclone lsd remote:
List every single file in your root folder:
rclone ls remote:
And to copy a local folder into a Uloz.to folder called backup:
rclone copy /home/source remote:backup
๐ธ User credentials
The only reliable method is authenticating the user with a username and password, periodt. Uloz.to does also offer an API key, but that one's reserved for Uloz.to's own in-house application, and using it in other circumstances is likeโฆ unreliable bestie ๐ญ
๐ฆ Modification times and hashes
Uloz.to does not let you set a custom modification time, and you can't retrieve the hashes after upload either. So what does the integration do? It uses a free form field that the API provides to encode client-provided timestamps and hashes. Timestamps are stored with microsecond precision โจ
A server calculated MD5 hash of the file gets verified on upload. After that though, the backend only serves the client-side calculated hashes. You can also grab hashes when you create a file download link, but honestly that's impractical for list-like use cases.
๐ง Restricted filename characters
On top of the default restricted characters set (https://rclone.org/overview/#restricted-characters), these characters get replaced too:
\โ value0x5Cโ replacement๏ผผ
Invalid UTF-8 bytes get replaced as well (https://rclone.org/overview/#invalid-utf8), because they literally can't be used inside JSON strings. Bye ๐
๐ฅ Transfers
All files are currently uploaded using a single HTTP request, so if you're uploading big files you need a stable connection, no cap. Rclone will upload up to --transfers chunks at the same time, shared across all uploads.
๐ Deleting files
By default, files get moved to the recycle bin, whereas folders are deleted immediately. Trashed files are permanently deleted after 30 days in the recycle bin.
Emptying the trash is currently not implemented in rclone. So don't come for me.
๐ Root folder ID
You can set the root_folder_slug for rclone. This is the folder (identified by its Folder slug) that rclone treats as the root of your Uloz.to drive.
Normally you just leave this blank and rclone figures out the correct root by itself. But you can set it to restrict rclone to one specific folder hierarchy.
To do that, you'll need to find the Folder slug of the folder you want as root. It's the last segment of the URL when you open that folder in the Uloz.to web interface.
So for example, for exploring a folder with URL https://uloz.to/fm/my-files/foobar, you'd use foobar as the root slug.
root_folder_slug can be used alongside a specific path in the remote path too. Like, if your remote's root_folder_slug corresponds to /foo/bar, then remote:baz/qux refers to ABSOLUTE_ULOZTO_ROOT/foo/bar/baz/qux.
โญ Standard options
Here are the Standard options specific to ulozto (Uloz.to).
๐ --ulozto-app-token
The application token identifying the app. An app API key can be either found in the API doc https://uloz.to/upload-resumable-api-beta or obtained from customer service.
Properties:
- Config:
app_token - Env Var:
RCLONE_ULOZTO_APP_TOKEN - Type: string
- Required: false
๐ --ulozto-username
The username of the principal to operate as.
Properties:
- Config:
username - Env Var:
RCLONE_ULOZTO_USERNAME - Type: string
- Required: false
๐ --ulozto-password
The password for the user.
NB: input to this must be obscured โ see rclone obscure (https://rclone.org/commands/rclone_obscure/).
Properties:
- Config:
password - Env Var:
RCLONE_ULOZTO_PASSWORD - Type: string
- Required: false
๐ Advanced options
Here are the Advanced options specific to ulozto (Uloz.to).
๐ธ --ulozto-root-folder-slug
If set, rclone will use this folder as the root folder for all operations. For example, if the slug identifies 'foo/bar/', 'ulozto:baz' is equivalent to 'ulozto:foo/bar/baz' with no root slug set.
Properties:
- Config:
root_folder_slug - Env Var:
RCLONE_ULOZTO_ROOT_FOLDER_SLUG - Type: string
- Required: false
๐ธ --ulozto-list-page-size
The size of a single page for list commands. 1-500
Properties:
- Config:
list_page_size - Env Var:
RCLONE_ULOZTO_LIST_PAGE_SIZE - Type: int
- Default:
500
๐ธ --ulozto-encoding
The encoding for the backend.
See the encoding section in the overview (https://rclone.org/overview/#encoding) for more info.
Properties:
- Config:
encoding - Env Var:
RCLONE_ULOZTO_ENCODING - Type: Encoding
- Default:
Slash,BackSlash,Del,Ctl,InvalidUtf8,Dot
๐ธ --ulozto-description
Description of the remote.
Properties:
- Config:
description - Env Var:
RCLONE_ULOZTO_DESCRIPTION - Type: string
- Required: false
๐ Limitations
Uloz.to file names can't have the \ character in them. rclone maps this to and from an identical looking unicode equivalent ๏ผผ (U+FF3C Fullwidth Reverse Solidus).
Uloz.to only supports filenames up to 255 characters in length.
Uloz.to rate limits access to the API, but the exact details are undisclosed ๐ Practical testing reveals that hitting the rate limit during normal use is very rare, though not impossible with a higher number of concurrently uploaded files.
rclone about is not supported by the Uloz.to backend. Even though there's an endpoint to retrieve that info for the UI, it's not exposed in the API. Backends without this capability can't determine free space for an rclone mount, and they can't use policy mfs (most free space) as a member of an rclone union remote.
See List of backends that do not support rclone about (https://rclone.org/overview/#optional-features) and rclone about (https://rclone.org/commands/rclone_about/).
๐ Union ๐
The union backend joins several remotes together so you get one single unified view of all of them. It's giving main character energy, honestly ๐
During the initial setup with rclone config you'll specify the upstream remotes as a space separated list. Those upstream remotes can be local paths or other remotes, whatever you vibe with.
The attributes :ro, :nc and :writeback can be attached to the end of the remote to tag it as read only, no create, or writeback โ like remote:directory/subdirectory:ro or remote:directory/subdirectory:nc.
:romeans files will only be read from here and never written:ncmeans new files or directories won't be created here:writebackmeans files found in different remotes will be written back here. See the writeback section for more info.
Subfolders can be used in upstream remotes too. Say you have a union remote named backup with the remotes mydrive:private/backup. Then running rclone mkdir backup:desktop is exactly the same as running rclone mkdir mydrive:private/backup/desktop.
There is no special handling of paths containing .. segments. Running rclone mkdir backup:../desktop is exactly the same as running rclone mkdir mydrive:private/backup/../desktop. Yeah, fr fr, it doesn't clean that up for you ๐ญ
๐ Configuration
Here's an example of how to make a union called remote for local folders. First, run:
rclone config
This will guide you through an interactive setup process:
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
name> remote
Type of storage to configure.
Choose a number from below, or type in your own value
[snip]
XX / Union merges the contents of several remotes
\ "union"
[snip]
Storage> union
List of space separated upstreams.
Can be 'upstreama:test/dir upstreamb:', '"upstreama:test/space:ro dir" upstreamb:', etc.
Enter a string value. Press Enter for the default ("").
upstreams> remote1:dir1 remote2:dir2 remote3:dir3
Policy to choose upstream on ACTION class.
Enter a string value. Press Enter for the default ("epall").
action_policy>
Policy to choose upstream on CREATE class.
Enter a string value. Press Enter for the default ("epmfs").
create_policy>
Policy to choose upstream on SEARCH class.
Enter a string value. Press Enter for the default ("ff").
search_policy>
Cache time of usage and free space (in seconds). This option is only useful when a path preserving policy is used.
Enter a signed integer. Press Enter for the default ("120").
cache_time>
Remote config
Configuration complete.
Options:
- type: union
- upstreams: remote1:dir1 remote2:dir2 remote3:dir3
Keep this "remote" remote?
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d> y
Current remotes:
Name Type
==== ====
remote union
e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
e/n/d/r/c/s/q> q
Okay bestie so that's the whole interactive setup, start to finish, and then the fun part starts ๐
Once you've got it configured you can justโฆ use rclone like a normal person. Like this:
- Listing directories in the top level across
remote1:dir1,remote2:dir2andremote3:dir3:
rclone lsd remote:
- Listing all the files in
remote1:dir1,remote2:dir2andremote3:dir3:
rclone ls remote:
- Copying another local directory into the union directory called
source, which is gonna land inremote3:dir3:
rclone copy C:\source remote:source
๐ธ Behavior / Policies ๐ธ
The whole vibe of this union backend is inspired by trapexit/mergerfs (https://github.com/trapexit/mergerfs). Every function gets sorted into one of 3 categories: action, create and search. Those functions (and the categories themselves) get handed a policy, and that policy decides which file or directory gets picked when that behavior runs ๐
Any policy can technically be assigned to any function or category โ but some combos are, and I say this with love, not it. For instance: rand (random) is lowkey perfect for file creation (create), but if you used it for delete and there was more than one copy of a file, the behavior would get extremely weird. So. Don't.
๐ง Function / Category classifications ๐ง
actionโ Writing existing file โ functions:move,rmdir,rmdirs,delete,purgeandcopy,sync(as destination when file exist)createโ Create non-existing file โ functions:copy,sync(as destination when file not exist)searchโ Reading and listing file โ functions:ls,lsd,lsl,cat,md5sum,sha1sumandcopy,sync(as source)- N/A โ
size,about
๐ Path Preservation ๐
Okay so the policies below come in two flavors: path preserving and non-path preserving.
Every policy that starts with ep (epff, eplfs, eplus, epmfs, eprand) is path preserving. And ep literally stands for existing path, no cap โจ
A path preserving policy will only consider upstreams where the relative path you're touching already exists.
When you're using non-path preserving policies, paths get created in the target upstreams as needed. Simple as that.
๐ Quota Relevant Policies ๐
Some policies are nosy โ they rely on quota info. Those ones should only be used if your upstreams actually support the respective quota fields.
lfs,eplfsโ required field: Freemfs,epmfsโ required field: Freelus,eplusโ required field: Usedlno,eplnoโ required field: Objects
Wanna check if your upstream supports the field? Just run rclone about remote: [flags] and see if the required field exists. Easy ๐
๐ Filters ๐
Policies basically go search your upstream remotes and build a list of files / paths for the functions to work on. The policy is the one doing the filtering and the sorting. The policy type defines the sorting, but the filtering is mostly uniform, and here's how it goes:
- No search policies filter.
- All action policies will filter out remotes which are tagged as read-only.
- All create policies will filter out remotes which are tagged read-only or no-create.
And if all remotes get filtered, an error comes back at you. Sorry not sorry ๐ญ
๐ Policy descriptions ๐
These policy definitions are inspired by trapexit/mergerfs (https://github.com/trapexit/mergerfs) but they're not exactly the same โ some definitions had to change because of the much larger latency of remote file systems. Fr fr.
allโ Search category: same asepall. Action category: same asepall. Create category: act on all upstreams.epall(existing path, all) โ Search category: Given this order configured, act on the first one found where the relative path exists. Action category: apply to all found. Create category: act on all upstreams where the relative path exists.epff(existing path, first found) โ Act on the first one found, by the time upstreams reply, where the relative path exists.eplfs(existing path, least free space) โ Of all the upstreams on which the relative path exists choose the one with the least free space.eplus(existing path, least used space) โ Of all the upstreams on which the relative path exists choose the one with the least used space.eplno(existing path, least number of objects) โ Of all the upstreams on which the relative path exists choose the one with the least number of objects.epmfs(existing path, most free space) โ Of all the upstreams on which the relative path exists choose the one with the most free space.eprand(existing path, random) โ Callsepalland then randomizes. Returns only one upstream.ff(first found) โ Search category: same asepff. Action category: same asepff. Create category: Act on the first one found by the time upstreams reply.lfs(least free space) โ Search category: same aseplfs. Action category: same aseplfs. Create category: Pick the upstream with the least available free space.lus(least used space) โ Search category: same aseplus. Action category: same aseplus. Create category: Pick the upstream with the least used space.lno(least number of objects) โ Search category: same aseplno. Action category: same aseplno. Create category: Pick the upstream with the least number of objects.mfs(most free space) โ Search category: same asepmfs. Action category: same asepmfs. Create category: Pick the upstream with the most available free space.newestโ Pick the file / directory with the largestmtime.rand(random) โ Callsalland then randomizes. Returns only one upstream.
๐ฆ Writeback ๐ฆ
You can slap the tag :writeback on an upstream remote to build yourself a little cache system, like this:
[union]
type = union
action_policy = all
create_policy = all
search_policy = ff
upstreams = /local:writeback remote:dir
So when files are opened for read: if the file is in remote:dir but not in /local, then rclone will copy that file entirely into /local before returning a reference to the file in /local. That copy is done with the equivalent of rclone copy, so it'll use --multi-thread-streams if you configured it. And every copy gets logged with an INFO log ๐
When files are written, they get written to both remote:dir and /local. Both. Slay.
You can add as many remotes as you want to upstreams, but there should only be one :writeback tag.
Heads up bestie: rclone does not manage the :writeback remote in any way other than writing files back to it. So if you need to expire old files or manage the size, that's on you. You'll have to do this yourself ๐
โจ Standard options โจ
Here are the Standard options specific to union (Union merges the contents of several upstream fs).
--union-upstreams
List of space separated upstreams.
Can be 'upstreama:test/dir upstreamb:', '"upstreama:test/space:ro dir" upstreamb:', etc.
Properties:
- Config:
upstreams - Env Var:
RCLONE_UNION_UPSTREAMS - Type:
string - Required:
true
--union-action-policy
Policy to choose upstream on ACTION category.
Properties:
- Config:
action_policy - Env Var:
RCLONE_UNION_ACTION_POLICY - Type:
string - Default:
"epall"
--union-create-policy
Policy to choose upstream on CREATE category.
Properties:
- Config:
create_policy - Env Var:
RCLONE_UNION_CREATE_POLICY - Type:
string - Default:
"epmfs"
--union-search-policy
Policy to choose upstream on SEARCH category.
Properties:
- Config:
search_policy - Env Var:
RCLONE_UNION_SEARCH_POLICY - Type:
string - Default:
"ff"
--union-cache-time
Cache time of usage and free space (in seconds).
This option is only useful when a path preserving policy is used.
Properties:
- Config:
cache_time - Env Var:
RCLONE_UNION_CACHE_TIME - Type:
int - Default:
120
๐ Advanced options ๐
Here are the Advanced options specific to union (Union merges the contents of several upstream fs).
--union-min-free-space
Minimum viable free space for lfs/eplfs policies.
If a remote has less than this much free space then it won't be considered for use in lfs or eplfs policies.
Properties:
- Config:
min_free_space - Env Var:
RCLONE_UNION_MIN_FREE_SPACE- Type: SizeSuffix
- Default:
1Gi
--union-descriptionโ a lil description of the remote, just for you bestie ๐
Properties:
- Config:
description - Env Var:
RCLONE_UNION_DESCRIPTION - Type: string
- Required: false
๐ Metadata
Any metadata that the underlying remote supports? Yeah, rclone reads it and writes it. Full send both ways ๐
Peep the metadata docs for the whole scoop: https://rclone.org/docs/#metadata
๐ WebDAV
Paths go like remote:path โ that's the whole vibe.
And they can be as deep as you want, no cap. Like remote:directory/subdirectory, go off ๐ฆ
โ๏ธ Configuration
okay so to set up a WebDAV remote you're gonna need three things: a URL for it, plus a username and a password. And here's the tea โ if you already know what kind of system you're connecting to, rclone can flip on some extra features for you โจ
So like, here's how you make a remote called remote. First things first, run:
rclone config
It's gonna hold your hand through an interactive setup, fr fr:
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
name> remote
Type of storage to configure.
Choose a number from below, or type in your own value
[snip]
XX / WebDAV
\ "webdav"
[snip]
Storage> webdav
URL of http host to connect to
Choose a number from below, or type in your own value
1 / Connect to example.com
\ "https://example.com"
url> https://example.com/remote.php/webdav/
Name of the WebDAV site/service/software you are using
Choose a number from below, or type in your own value
1 / Fastmail Files
\ (fastmail)
2 / Nextcloud
\ (nextcloud)
3 / Owncloud
\ (owncloud)
4 / Sharepoint Online, authenticated by Microsoft account
\ (sharepoint)
5 / Sharepoint with NTLM authentication, usually self-hosted or on-premises
\ (sharepoint-ntlm)
6 / rclone WebDAV server to serve a remote over HTTP via the WebDAV protocol
\ (rclone)
7 / Other site/service or software
\ (other)
vendor> 2
User name
user> user
Password.
y) Yes type in my own password
g) Generate random password
n) No leave this optional password blank
y/g/n> y
Enter the password:
password:
Confirm the password:
password:
Bearer token instead of user/pass (e.g. a Macaroon)
bearer_token>
Remote config
Configuration complete.
Options:
- type: webdav
- url: https://example.com/remote.php/webdav/
- vendor: nextcloud
- user: user
- pass: *** ENCRYPTED ***
- bearer_token:
Keep this "remote" remote?
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d> y
Once you've got it all configured, you can use rclone like this โ just swap remote out for whatever name you gave yours ๐
List directories in top level of your WebDAV
rclone lsd remote:
List all the files in your WebDAV
rclone ls remote:
To copy a local directory to an WebDAV directory called backup
rclone copy /home/source remote:backup
๐ Modification times and hashes
Plain WebDAV? It does not support modified times, periodt. But the way that it does work with Fastmail Files, ownCloud or Nextcloud? rclone will support modified times there ๐ฅ
Same deal with hashes โ plain WebDAV doesn't support them, but when you're rolling with Fastmail Files, ownCloud or Nextcloud, rclone supports SHA1 and MD5 hashes. And depending on the exact version of ownCloud or Nextcloud, hashes might show up on all objects, or only on objects that had a hash uploaded along with them. With Nextcloud specifically, rclone asks the server to calculate the SHA1 for uploads that had no hash to send โ like streamed uploads โ and then after it sets the modification time, that stored hash gets discarded. Rip ๐ญ
๐ Standard options
Here are the Standard options specific to webdav (WebDAV). Slay.
--webdav-url
URL of http host to connect to.
E.g. https://example.com.
Properties:
- Config:
url - Env Var:
RCLONE_WEBDAV_URL - Type: string
- Required: true
--webdav-vendor
Name of the WebDAV site/service/software you are using.
Properties:
- Config:
vendor - Env Var:
RCLONE_WEBDAV_VENDOR - Type: string
- Required: false
- Examples:
"fastmail"- Fastmail Files
"nextcloud"- Nextcloud
"owncloud"- Owncloud 10 PHP based WebDAV server
"infinitescale"- ownCloud Infinite Scale
"sharepoint"- Sharepoint Online, authenticated by Microsoft account
"sharepoint-ntlm"- Sharepoint with NTLM authentication, usually self-hosted or on-premises
"rclone"- rclone WebDAV server to serve a remote over HTTP via the WebDAV protocol
"other"- Other site/service or software
--webdav-user
User name.
Heads up bestie: if NTLM authentication is being used, the username has to be in the format 'Domain' ๐
Properties:
- Config:
user - Env Var:
RCLONE_WEBDAV_USER - Type: string
- Required: false
--webdav-pass
Password.
NB! What you put in here has to be obscured โ see rclone obscure (https://rclone.org/commands/rclone_obscure/) ๐ซถ
Properties:
- Config:
pass - Env Var:
RCLONE_WEBDAV_PASS - Type: string
- Required: false
--webdav-bearer-token
Bearer token instead of user/pass (e.g. a Macaroon).
Properties:
- Config:
bearer_token - Env Var:
RCLONE_WEBDAV_BEARER_TOKEN - Type: string
- Required: false
๐ Advanced options
Here are the Advanced options specific to webdav (WebDAV). Oh we're going deeper, obsessed ๐ธ
--webdav-bearer-token-command
Command to run to get a bearer token.
Properties:
- Config:
bearer_token_command - Env Var:
RCLONE_WEBDAV_BEARER_TOKEN_COMMAND - Type: string
- Required: false
--webdav-encoding
The encoding for the backend.
Check the encoding section in the overview (https://rclone.org/overview/#encoding) for more info, iykyk.
Default encoding is Slash,LtGt,DoubleQuote,Colon,Question,Asterisk,Pipe,Hash,Percent,BackSlash,Del,Ctl,LeftSpace,LeftTilde,RightSpace,RightPeriod,InvalidUtf8 for sharepoint-ntlm, or identity otherwise.
Properties:
- Config:
encoding - Env Var:
RCLONE_WEBDAV_ENCODING - Type: string
- Required: false
--webdav-headers
Set HTTP headers for all transactions.
Use this to set additional HTTP headers for every single transaction, fr fr.
The input format is a comma separated list of key,value pairs. Standard CSV encoding (https://godoc.org/encoding/csv) may be used.
So like, to set a Cookie, use 'Cookie,name=value', or '"Cookie","name=value"'.
And you can set multiple headers, e.g. '"Cookie","name=value","Authorization","xxx"'.
Here's the important bit though: the headers are only sent to the host in the configured URL. If the server redirects to another host (including a subdomain or a different port), the headers are not sent to it, or to any further hop in that redirect chain. The one exception is the directory listing and file download requests when auth_redirect is set โ because that keeps all credentials across redirects ๐
Properties:
- Config:
headers - Env Var:
RCLONE_WEBDAV_HEADERS - Type: CommaSepList
- Default:
--webdav-pacer-min-sleep
Minimum time to sleep between API calls.
Properties:
- Config:
pacer_min_sleep - Env Var:
RCLONE_WEBDAV_PACER_MIN_SLEEP - Type: Duration
- Default:
10ms
--webdav-nextcloud-chunk-size
Nextcloud upload chunk size.
We recommend configuring your NextCloud instance to increase the max chunk size to 1 GB for better upload performances, no cap. Peep this: https://docs.nextcloud.com/server/latest/admin_manual/configuration_files/big_file_upload_configuration.html#adjust-chunk-size-on-nextcloud-side
Set to 0 to disable chunked uploading.
Properties:
- Config:
nextcloud_chunk_size - Env Var:
RCLONE_WEBDAV_NEXTCLOUD_CHUNK_SIZE - Type: SizeSuffix
- Default:
10Mi
--webdav-owncloud-exclude-shares
Exclude ownCloud shares
Properties:
- Config:
owncloud_exclude_shares - Env Var:
RCLONE_WEBDAV_OWNCLOUD_EXCLUDE_SHARES - Type: bool
- Default:
false
--webdav-owncloud-exclude-mounts
Exclude ownCloud mounted storages
Properties:
- Config:
owncloud_exclude_mounts - Env Var:
RCLONE_WEBDAV_OWNCLOUD_EXCLUDE_MOUNTS - Type: bool
- Default:
false
--webdav-unix-socket
Path to a unix domain socket to dial to, instead of opening a TCP connection directly
Properties:
- Config:
unix_socket - Env Var:
RCLONE_WEBDAV_UNIX_SOCKET - Type: string
- Required: false
--webdav-auth-redirect
Preserve authentication on redirect.
Okay so here's the situation: if the server redirects rclone to a new domain while it's trying to read a file, rclone will normally drop the Authorization: header from the request.
That's standard security practice, bestie โ it's literally to avoid sending your credentials to some unknown webserver ๐
But sometimes you actually want that. So if you're getting an error like "401 Unauthorized" when rclone is attempting to read files from the webdav server, you can try this option.
โ ๏ธ Note that enabling this also permits sending your credentials over a plaintext HTTP connection if the server redirects from HTTPS to HTTP โ which rclone otherwise refuses to do. So like, be careful, that's giving risky behavior ๐
Properties:
- Config:
auth_redirect - Env Var:
RCLONE_WEBDAV_AUTH_REDIRECT - Type: bool
- Default:
false
--webdav-description
Description of the remote.
Properties:
- Config:
description - Env Var:
RCLONE_WEBDAV_DESCRIPTION - Type: string
- Required: false
๐๏ธ Provider notes
Scroll down for the tea on specific providers ๐
๐ง Fastmail Files
Use https://webdav.fastmail.com/ or a subdirectory as the URL, and your Fastmail email username@domain.tld as the username. Follow this documentation (https://www.fastmail.help/hc/en-us/articles/360058752854-App-passwords) to create an app password with access to Files (WebDAV), and use that as the password ๐
Fastmail supports modified times using the X-OC-Mtime header. Iconic.
โ๏ธ ownCloud
Okay bestie, first thing: hit that settings cog thingy in the bottom right of the page and it'll show you the WebDAV URL that rclone is begging for during the config step. It's gonna look something like https://example.com/remote.php/webdav/. Write it down, screenshot it, tattoo it on your arm, idk, just have it ready. ๐
Also ownCloud supports modified times via the X-OC-Mtime header. Cute.
๐ธ Nextcloud
Literally configured the exact same way as ownCloud, no cap. One thing though โ Nextcloud initially did not support streaming of files (rcat) while ownCloud did, but this (https://github.com/nextcloud/nextcloud-snap/issues/365) seems to be fixed as of 2020-11-27 (tested with rclone v1.53.1 and Nextcloud Server v19). So like, it's giving fixed. ๐ซถ
๐ฆ ownCloud Infinite Scale
The WebDAV URL for Infinite Scale lives in the details panel of any space in Infinite Scale โ but only if that display was enabled in the personal settings of the user through a checkbox there. So go check that box first, bestie, otherwise you're just staring at nothing. ๐
Infinite Scale works with the chunking tus (https://tus.io) upload protocol. The chunk size is currently fixed 10 MB. That's the vibe, don't fight it.
โญ Sharepoint Online
Rclone can be used with Sharepoint provided by OneDrive for Business or Office365 Education Accounts. Ngl this feature is only needed for a few of these accounts, mostly the Office365 Education ones. These accounts are sometimes not verified by the domain owner โ github#1975 (https://github.com/rclone/rclone/issues/1975).
Which means: these accounts can't be added using the official API (other Accounts should work with the "onedrive" option). But plot twist โ it is possible to access them using webdav. โจ
To use a sharepoint remote with rclone, add it like this. First, you need to get your remote's URL:
- Go here (
https://onedrive.live.com/about/en-us/signin/) to open your OneDrive or to sign in - Now take a look at your address bar, the URL should look like this:
https://[YOUR-DOMAIN]-my.sharepoint.com/personal/[YOUR-EMAIL]/_layouts/15/onedrive.aspx
You'll only need this URL up to the email address. After that, you'll most likely want to add "/Documents". That subdirectory contains the actual data stored on your OneDrive.
Add the remote to rclone like this: configure the url as https://[YOUR-DOMAIN]-my.sharepoint.com/personal/[YOUR-EMAIL]/Documents and use your normal account email and password for user and pass. If you have 2FA enabled, you have to generate an app password. Set the vendor to sharepoint.
Your config file should look like this:
[sharepoint]
type = webdav
url = https://[YOUR-DOMAIN]-my.sharepoint.com/personal/[YOUR-EMAIL]/Documents
vendor = sharepoint
user = YourEmailAddress
pass = encryptedpassword
๐ Sharepoint with NTLM Authentication
Use this option in case your (hosted) Sharepoint is not tied to OneDrive accounts and uses NTLM authentication. Different beast entirely, iykyk.
To get the url configuration, similarly to the above, first navigate to the desired directory in your browser to get the URL, then strip everything after the name of the opened directory. Snip snip. โ๏ธ
Example: if the URL is: <https://example.sharepoint.com/sites/12345/Documents/Forms/AllItems.aspx>
The configuration to use would be: <https://example.sharepoint.com/sites/12345/Documents>
Set the vendor to sharepoint-ntlm.
NTLM uses domain and user name combination for authentication, set user to DOMAIN\username.
Your config file should look like this:
[sharepoint]
type = webdav
url = https://[YOUR-DOMAIN]/some-path-to/Documents
vendor = sharepoint-ntlm
user = DOMAIN\user
pass = encryptedpassword
๐ฉ Required Flags for SharePoint
Okay so SharePoint does some special things with uploaded documents, which means you won't be able to use the documents size or the documents hash to compare if a file has been changed since the upload / which file is newer. It's giving mysterious. ๐
For Rclone calls copying files (especially Office files such as .docx, .xlsx, etc.) from/to SharePoint (like copy, sync, etc.), you should append these flags to ensure Rclone uses the "Last Modified" datetime property to compare your documents:
--ignore-size --ignore-checksum --update
Lowkey important: skip these and your sync comparisons will not be doing what you think they're doing. Just add them, bestie. ๐
๐ Rclone
Use this option if you are hosting remotes over WebDAV provided by rclone itself. Read rclone serve webdav for more details. Main character energy, honestly. โจ
rclone serve supports modified times using the X-OC-Mtime header.
๐ dCache
dCache is a storage system that supports many protocols and authentication/authorisation schemes. For WebDAV clients, it allows users to authenticate with username and password (BASIC), X.509, Kerberos, and various bearer tokens, including Macaroons (https://www.dcache.org/manuals/workshop-2017-05-29-Umea/000-Final/anupam_macaroons_v02.pdf) and OpenID-Connect (https://en.wikipedia.org/wiki/OpenID_Connect) access tokens. So many options, so little time. ๐
Configure as normal using the other type. Don't enter a username or password โ instead enter your Macaroon as the bearer_token.
The config will end up looking something like this.
[dcache]
type = webdav
url = https://dcache...
vendor = other
user =
pass =
bearer_token = your-macaroon
There is a script (https://github.com/sara-nl/GridScripts/blob/master/get-macaroon) that obtains a Macaroon from a dCache WebDAV endpoint, and creates an rclone config file. Obsessed. ๐
Macaroons may also be obtained from the dCacheView web-browser/JavaScript client that comes with dCache.
๐ OpenID-Connect
dCache also supports authenticating with OpenID-Connect access tokens. OpenID-Connect is a protocol (based on OAuth 2.0) that allows services to identify users who have authenticated with some central service. Very "who are you and why are you here" of it.
Support for OpenID-Connect in rclone is currently achieved using another software package called oidc-agent (https://github.com/indigo-dc/oidc-agent). This is a command-line tool that facilitates obtaining an access token. Once installed and configured, an access token is obtained by running the oidc-token command. The following example shows a (shortened) access token obtained from the XDC OIDC Provider.
paul@celebrimbor:~$ oidc-token XDC
eyJraWQ[...]QFXDt0
paul@celebrimbor:~$
Note โ Before theoidc-tokencommand will work, the refresh token must be loaded into the oidc agent. This is done with theoidc-addcommand (e.g.,oidc-add XDC). This is typically done once per login session. Full details on this and how to register oidc-agent with your OIDC Provider are provided in the oidc-agent documentation (https://indigo-dc.gitbooks.io/oidc-agent/). Don't skip this step, bestie, or nothing works and you'll be sad. ๐ญ
The rclone bearer_token_command configuration option is used to fetch the access token from oidc-agent.
Configure as a normal WebDAV endpoint, using the 'other' vendor, leaving the username and password empty. When prompted, choose to edit the advanced config and enter the command to get a bearer token (e.g., oidc-agent XDC).
The following example config shows a WebDAV endpoint that uses oidc-agent to supply an access token from the XDC OIDC Provider.
[dcache]
type = webdav
url = https://dcache.example.org/
vendor = other
bearer_token_command = oidc-token XDC
๐ธ Yandex Disk ๐ธ
okay so Yandex Disk is a cloud storage solution created by Yandex ๐ โ you can find it at https://disk.yandex.com, and the company itself lives at https://yandex.com.
โจ Configuration โจ
here's a whole example of making a yandex config, bestie. first you run
rclone config
and it walks you through the interactive setup like this:
No remotes found, make a new one?
n) New remote
s) Set configuration password
n/s> n
name> remote
Type of storage to configure.
Choose a number from below, or type in your own value
[snip]
XX / Yandex Disk
\ "yandex"
[snip]
Storage> yandex
Yandex Client Id - leave blank normally.
client_id>
Yandex Client Secret - leave blank normally.
client_secret>
Remote config
Use web browser to automatically authenticate rclone with remote?
* Say Y if the machine running rclone has a web browser you can use
* Say N if running rclone on a (remote) machine without web browser access
If not sure try Y. If Y failed, try N.
y) Yes
n) No
y/n> y
If your browser doesn't open automatically go to the following link: http://127.0.0.1:53682/auth
Log in and authorize rclone for access
Waiting for code...
Got code
Configuration complete.
Options:
- type: yandex
- client_id:
- client_secret:
- token: {"access_token":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","token_type":"OAuth","expiry":"2016-12-29T12:27:11.362788025Z"}
Keep this "remote" remote?
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d> y
ngl there's a whole doc for setting this up on a machine that does not have an internet-connected web browser available โ it's the remote setup docs at https://rclone.org/remote_setup/. go read it if that's your situation ๐ซถ
heads up, bestie: rclone spins up a webserver on your local machine to grab the token that Yandex Disk sends back. it only runs from the exact moment it opens your browser to the exact moment you get the verification code back. it lives at http://127.0.0.1:53682/ โญ so if you're running a host firewall, you might need to temporarily unblock it. just temporary, okay? ๐
once you're configured, you can use rclone like this (swap remote for the name you gave your remote):
see the top level directories ๐
rclone lsd remote:
make a new directory โจ
rclone mkdir remote:directory
list what's inside a directory ๐
rclone ls remote:directory
sync /home/local/directory over to the remote path, and delete any excess files that are chillin' in the path (yes it deletes, that's the whole point):
rclone sync --interactive /home/local/directory remote:directory
Yandex paths can be as deep as you want, like remote:directory/subdirectory. go off ๐ฆ
๐ฐ๏ธ Modification times and hashes ๐ฐ๏ธ
Modified times? supported, babes. they're stored accurate to 1 ns in custom metadata called rclone_modified, in RFC3339 with nanoseconds format. absurdly precise. iconic.
and the MD5 hash algorithm is natively supported by Yandex Disk, no extra work needed ๐
๐๏ธ Emptying Trash ๐๏ธ
wanna empty your trash? you can run:
rclone cleanup remote:
and it will permanently delete all your trashed files. like, gone gone. no undo. ๐ญ
this command does not take any path arguments, so don't try to be cute with it.
๐ Quota information ๐
to peek at your current quota, run:
rclone about remote:
and it'll show you your usage limit (the quota) plus your current usage. know your numbers, bestie โจ
๐ซ Restricted filename characters ๐ซ
the default restricted characters set gets replaced โ that's the one documented at https://rclone.org/overview/#restricted-characters if you wanna see the list.
Invalid UTF-8 bytes also get replaced (https://rclone.org/overview/#invalid-utf8), because fr fr they just can't be used in JSON strings. it's giving "not allowed, sorry" ๐
โญ Standard options โญ
here are the Standard options that are specific to yandex (Yandex Disk):
--yandex-client-id
OAuth Client Id.
Leave blank normally.
Properties:
- Config:
client_id - Env Var:
RCLONE_YANDEX_CLIENT_ID - Type: string
- Required: false
--yandex-client-secret
OAuth Client Secret.
Leave blank normally.
Properties:
- Config:
client_secret - Env Var:
RCLONE_YANDEX_CLIENT_SECRET - Type: string
- Required: false
๐ฅ Advanced options ๐ฅ
and here are the Advanced options that are specific to yandex (Yandex Disk):
--yandex-token
OAuth Access Token as a JSON blob.
Properties:
- Config:
token - Env Var:
RCLONE_YANDEX_TOKEN - Type: string
- Required: false
--yandex-auth-url
Auth server URL.
Leave blank to use the provider defaults.
Properties:
- Config:
auth_url - Env Var:
RCLONE_YANDEX_AUTH_URL - Type: string
- Required: false
--yandex-token-url
Token server url.
Leave blank to use the provider defaults.
Properties:
- Config:
token_url - Env Var:
RCLONE_YANDEX_TOKEN_URL - Type: string
- Required: false
--yandex-client-credentials
Use client credentials OAuth flow.
this uses the OAUTH2 client Credentials Flow as described in RFC 6749. fancy โจ
note that this option is NOT supported by all backends. so like, don't assume.
Properties:
- Config:
client_credentials - Env Var:
RCLONE_YANDEX_CLIENT_CREDENTIALS - Type: bool
- Default: false
--yandex-hard-delete
Delete files permanently rather than putting them into the trash.
Properties:
- Config:
hard_delete - Env Var:
RCLONE_YANDEX_HARD_DELETE - Type: bool
- Default: false
--yandex-encoding
The encoding for the backend.
See the encoding section in the overview (https://rclone.org/overview/#encoding) for more info.
Properties:
- Config:
encoding - Env Var:
RCLONE_YANDEX_ENCODING - Type: Encoding
- Default:
Slash,Del,Ctl,InvalidUtf8,Dot
--yandex-spoof-ua
Set the user agent to match an official version of the yandex disk client. May help with upload performance.
Properties:
- Config:
spoof_ua - Env Var:
RCLONE_YANDEX_SPOOF_UA - Type: bool
- Default: true
--yandex-upload-wait
Wait this long after an upload before setting the modification time.
so here's the tea: Yandex Disk finalizes an upload asynchronously on its servers after the upload has completed. if you set the modification time while that finalization is still in progress, the server sends back 500 Internal Server Error errors. ๐
if you're getting 500 errors on upload, setting this to 2s is normally enough to stop them โ at the cost of slowing down uploads. tradeoffs, bestie.
Yandex support recommend a value of 1.5s - 3s.
Properties:
- Config:
upload_wait - Env Var:
RCLONE_YANDEX_UPLOAD_WAIT - Type: Duration
- Default:
0s
--yandex-description
Description of the remote.
Properties:
- Config:
description - Env Var:
RCLONE_YANDEX_DESCRIPTION - Type: string
- Required: false
๐ญ Limitations ๐ญ
when you're uploading very large files (bigger than about 5 GiB) you're gonna need to bump up the --timeout parameter. why? because Yandex pauses (maybe to calculate the MD5SUM for the entire file, we don't fully know) before it returns confirmation that the file has been uploaded. and the default timeout handling in rclone assumes a 5 minute pause is an error and closes the connection โ so you'll see net/http: timeout awaiting response headers errors in the logs if that's what's happening. ๐ซ
setting the timeout to twice the max size of file in GiB should be enough. so if you wanna upload a 30 GiB file, set a timeout of 2 * 30 = 60m, i.e. --timeout 60m.
if you get 500 Internal Server Error errors just after uploads โ especially when uploading many files in parallel โ then try setting --yandex-upload-wait 2s. Yandex Disk finalizes uploads asynchronously on its servers and can report an upload as complete slightly before the file is actually ready, so touching the file's metadata too soon causes these errors. Yandex support recommend waiting 1.5s - 3s after each upload. ๐
and one more critical thing: having a Yandex Mail account is mandatory to use the Yandex.Disk subscription. Token generation will work without a mail account, but Rclone won't be able to complete any actions. so like, you'll have a token and zero functionality. ๐
[403 - DiskUnsupportedUserAccountTypeError] User account type is not supported.
๐ฆ Zoho Workdrive ๐ฆ
Zoho WorkDrive (https://www.zoho.com/workdrive/) is a cloud storage solution created by Zoho (https://zoho.com). periodt โจ
โจ Configuration โจ
here's an example of making a zoho configuration. first run
rclone config
and it'll guide you through the interactive setup process:
No remotes found, make a new one?
n) New remote
s) Set configuration password
n/s> n
name> remote
Type of storage to configure.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
[snip]
XX / Zoho
\ "zoho"
[snip]
Storage> zoho
** See help for zoho backend at: https://rclone.org/zoho/ **
okay bestie the wizard is still going, and it looks like this:
OAuth Client Id
Leave blank normally.
Enter a string value. Press Enter for the default ("").
client_id>
OAuth Client Secret
Leave blank normally.
Enter a string value. Press Enter for the default ("").
client_secret>
Edit advanced config? (y/n)
y) Yes
n) No (default)
y/n> n
Remote config
Use web browser to automatically authenticate rclone with remote?
* Say Y if the machine running rclone has a web browser you can use
* Say N if running rclone on a (remote) machine without web browser access
If not sure try Y. If Y failed, try N.
y) Yes (default)
n) No
y/n>
If your browser doesn't open automatically go to the following link: http://127.0.0.1:53682/auth?state=LVn0IHzxej1ZkmQw31d0wQ
Log in and authorize rclone for access
Waiting for code...
Got code
Choose a number from below, or type in your own value
1 / MyTeam
\ "4u28602177065ff22426787a6745dba8954eb"
Enter a Team ID> 1
Choose a number from below, or type in your own value
1 / General
\ "4u2869d2aa6fca04f4f2f896b6539243b85b1"
Enter a Workspace ID> 1
Configuration complete.
Options:
- type: zoho
- token: {"access_token":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","token_type":"Zoho-oauthtoken","refresh_token":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","expiry":"2020-10-12T00:54:52.370275223+02:00"}
- root_folder_id: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Keep this "remote" remote?
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d>
periodt, that's the whole ritual ๐
If you're setting this up on a machine that has no internet-connected web browser available, go read the remote setup docs at https://rclone.org/remote_setup/ โ they walk you through that exact situation, no cap.
So here's the tea: rclone spins up a lil webserver on your local computer to collect the authorization token from Zoho Workdrive. It's only alive from the moment your browser opens until the token comes back. That webserver lives at http://127.0.0.1:53682/. ๐ซถ And if local port 53682 is protected by a firewall, you may need to temporarily unblock the firewall so the authorization can actually finish. (Sorry bestie, it's giving "brief firewall breakup".)
Once it's configured you can just use rclone like this โ and yeah, swap remote for whatever name you gave your remote:
See top level directories:
rclone lsd remote:
Make a new directory:
rclone mkdir remote:directory
List the contents of a directory:
rclone ls remote:directory
Sync /home/local/directory to the remote path, deleting any excess files in the path:
rclone sync --interactive /home/local/directory remote:directory
Zoho paths may be as deep as required, eg remote:directory/subdirectory. ๐ธ
๐ฆ Modification times and hashes ๐ฆ
Modified times are currently not supported for Zoho Workdrive ๐ญ
No hash algorithms are supported. ๐
๐ Usage information ๐
Want to see your current quota? Run rclone about remote: and it'll display your current usage. Go off. โจ
๐ Restricted filename characters ๐
Only control characters and invalid UTF-8 are replaced. That's it, that's the list. BUT โ heads up โ most Unicode full-width characters aren't supported at all and will be removed from filenames during upload. Not a vibe, but forewarned is forearmed. ๐
๐ Standard options ๐
Here are the Standard options specific to zoho (Zoho). Bestie these are the ones you'll actually touch:
--zoho-client-idโ OAuth Client Id. Leave blank normally.- Config:
client_id - Env Var:
RCLONE_ZOHO_CLIENT_ID - Type:
string - Required:
false
- Config:
--zoho-client-secretโ OAuth Client Secret. Leave blank normally.- Config:
client_secret - Env Var:
RCLONE_ZOHO_CLIENT_SECRET - Type:
string - Required:
false
- Config:
--zoho-regionโ Zoho region to connect to. You'll have to use the region your organization is registered in. If you're not sure, use the same top level domain as the one you connect to in your browser. ๐- Config:
region - Env Var:
RCLONE_ZOHO_REGION - Type:
string - Required:
false - Examples:
"com"โ United states / Global"eu"โ Europe"in"โ India"jp"โ Japan"com.cn"โ China"com.au"โ Australia
- Config:
โจ Advanced options โจ
Here are the Advanced options specific to zoho (Zoho). iykyk, don't poke these unless you must:
--zoho-tokenโ OAuth Access Token as a JSON blob.- Config:
token - Env Var:
RCLONE_ZOHO_TOKEN - Type:
string - Required:
false
- Config:
--zoho-auth-urlโ Auth server URL. Leave blank to use the provider defaults.- Config:
auth_url - Env Var:
RCLONE_ZOHO_AUTH_URL - Type:
string - Required:
false
- Config:
--zoho-token-urlโ Token server url. Leave blank to use the provider defaults.- Config:
token_url - Env Var:
RCLONE_ZOHO_TOKEN_URL - Type:
string - Required:
false
- Config:
--zoho-client-credentialsโ Use client credentials OAuth flow. This will use the OAUTH2 client Credentials Flow as described in RFC 6749.
Warning bestie: this option is NOT supported by all backends. ๐
- Config:
client_credentials - Env Var:
RCLONE_ZOHO_CLIENT_CREDENTIALS - Type:
bool - Default:
false
--zoho-root-folder-idโ ID of the root folder. Leave blank normally. Fill this in to make rclone use a non root folder as its starting point.- Config:
root_folder_id - Env Var:
RCLONE_ZOHO_ROOT_FOLDER_ID - Type:
string - Required:
false
- Config:
--zoho-upload-cutoffโ Cutoff for switching to large file upload api (>= 10 MiB).- Config:
upload_cutoff - Env Var:
RCLONE_ZOHO_UPLOAD_CUTOFF - Type:
SizeSuffix - Default:
10Mi
- Config:
--zoho-tpslimitโ Max number of API transactions per second.
Here's the situation: Zoho WorkDrive rate limits its API and returns HTTP 429 (error F7008, "Request rate limit exceeded") when you call it too quickly, so the data API calls (list, upload, download, copy, move, delete) are paced to this rate. ๐ฆ
Set to 0 to disable the cap, matching the global --tpslimit; but pacing still can't be turned off entirely because backoff and Retry-After always apply. Periodt.
The default of 6 is a safe sustainable rate. Higher values can trigger long 429 Retry-After stalls that make throughput WORSE, so only raise it if your account tolerates more. ๐ญ
- Config:
tpslimit - Env Var:
RCLONE_ZOHO_TPSLIMIT - Type:
float64 - Default:
6
--zoho-tpslimit-burstโ Number of API calls to allow back-to-back without sleeping, for--zoho-tpslimit.
This is the token-bucket capacity. Keep it at 1 for Zoho: a burst > 1 lets several calls fire at once after an idle gap, which can trigger synchronized clusters of 429 errors. ๐ฅ
- Config:
tpslimit_burst - Env Var:
RCLONE_ZOHO_TPSLIMIT_BURST - Type:
int - Default:
1
--zoho-list-folder-limitโ Max listings of the SAME folder allowed per--zoho-list-folder-window.
Zoho WorkDrive rate limits its listing API (GET files/{id}/files) PER folder, independently of --zoho-tpslimit: listing one folder too often in a short time returns HTTP 429 (error F7008) with a multi-minute Retry-After penalty, which a tight polling loop can hit even at a low overall rate. Measured live, Zoho allows ~19 listings of one folder in any rolling ~60s window and the 20th fails, which the defaults (19 per 60s) model exactly. ๐ค
This is a true per-window cap for any traffic pattern: each window starts with --zoho-list-folder-burst listings passing back-to-back (the burst re-arms at every window boundary) and the rest are spaced --zoho-list-folder-window/(limit - burst) apart (the defaults give ~4.6s), while a sliding log of recent listings enforces the cap across window boundaries. 0 disables the limiter. Only REPEATED listings of one folder are delayed; different folders, or a folder listed fewer than --zoho-list-folder-burst times, never are. ๐ฆ
A HIGHER value means MORE listings per window, not more safety: raising it above 19 trips F7008. Lower it for a wider margin at the cost of listing responsiveness.
- Config:
list_folder_limit - Env Var:
RCLONE_ZOHO_LIST_FOLDER_LIMIT - Type:
int - Default:
19
--zoho-list-folder-windowโ The window for--zoho-list-folder-limit.
The default of 60s (shown as 1m0s) matches Zoho's real sliding window: at most --zoho-list-folder-limit listings of one folder are allowed in any window of this length. A bare number is parsed as seconds ("60" = "60s"). โณ
Widen it (or lower the limit) for a bigger safety margin; the sustained spacing between same-folder listings is window/(limit - burst).
- Config:
list_folder_window - Env Var:
RCLONE_ZOHO_LIST_FOLDER_WINDOW - Type:
Duration - Default:
1m0s
--zoho-list-folder-burstโ Same-folder listings allowed back-to-back before--zoho-list-folder-limitpaces them.
The burst is carved out of --zoho-list-folder-limit, so raising it never raises the per-window total: this many listings may fire immediately and the remaining limit - burst are spaced window/(limit - burst) apart. The burst RE-ARMS at every window boundary, so sustained re-listing gets a fresh burst each window while a sliding log of recent listings still enforces the per-window cap. A folder listed only a handful of times (the common case โ a sync re-listing one directory a few times then moving on) never waits. ๐
The default 6 is the largest burst validated live under the default 19-per-60s cap (bursts of 4, 5 and 6 all ran clean; an over-cap probe tripped F7008 exactly at the 20th listing in a window). Keep it well below ~15 โ Zoho also has an instantaneous back-to-back cap around 15-16 regardless of the window. Set to 1 to pace from the second listing. Values >= the limit are clamped to limit - 1.
- Config:
list_folder_burst - Env Var:
RCLONE_ZOHO_LIST_FOLDER_BURST - Type:
int - Default:
6
--zoho-encodingโ The encoding for the backend. See the encoding section in the overview athttps://rclone.org/overview/#encodingfor more info.- Config:
encoding - Env Var:
RCLONE_ZOHO_ENCODING - Type:
Encoding - Default:
Del,Ctl,InvalidUtf8
- Config:
--zoho-descriptionโ Description of the remote. ๐- Config:
description - Env Var:
RCLONE_ZOHO_DESCRIPTION - Type:
string - Required:
false
- Config:
โจ Setting up your own client_id โจ
For Zoho we advise you to set up your own client_id. To do so you have to complete the following steps, bestie, no skipping ๐
- Log in to the Zoho API Console (
https://api-console.zoho.com) - Create a new client of type "Server-based Application". The name and website don't matter at all, but you must add the redirect URL
http://localhost:53682/. - Once the client is created, you can go to the settings tab and enable it in other regions.
The client id and client secret can now be used with rclone. slay โจ
๐ฆ Local Filesystem ๐ฆ
Local paths are specified as normal filesystem paths, e.g. /path/to/wherever, so
rclone sync --interactive /home/source /tmp/destination
Will sync /home/source to /tmp/destination. iconic, it's literally just paths, that's the whole vibe ๐ซถ
๐ธ Configuration ๐ธ
For consistencies sake one can also configure a remote of type local in the config file, and access the local filesystem using rclone remote paths, e.g. remote:path/to/wherever, but it is probably easier not to. ngl just use the paths directly ๐
โฐ Modification times โฐ
Rclone reads and writes the modification times using an accuracy determined by the OS. Typically this is 1ns on Linux, 10 ns on Windows and 1 Second on OS X.
๐ Filenames ๐
Filenames should be encoded in UTF-8 on disk. This is the normal case for Windows and OS X.
There is a bit more uncertainty in the Linux world, but new distributions will have UTF-8 encoded files names. If you are using an old Linux filesystem with non UTF-8 file names (e.g. latin1) then you can use the convmv tool to convert the filesystem to UTF-8. This tool is available in most distributions' package managers. go little tool go ๐ง
If an invalid (non-UTF8) filename is read, the invalid characters will be replaced with a quoted representation of the invalid bytes. The name gro\xdf will be transferred as groโDF. rclone will emit a debug message in this case (use -v to see), e.g.
Local file system at .: Replacing invalid UTF-8 characters in "gro\xdf"
๐ซ Restricted characters ๐ซ
With the local backend, restrictions on the characters that are usable in file or directory names depend on the operating system. To check what rclone will replace by default on your system, run rclone help flags local-encoding. do it, it's free info โจ
On non Windows platforms the following characters are replaced when handling file names.
NULโ0x00โโ/โ0x2Fโ๏ผ
When running on Windows the following characters are replaced. This list is based on the Windows file naming conventions (https://docs.microsoft.com/windows/desktop/FileIO/naming-a-file#naming-conventions). it's a lot, brace yourself bestie ๐ญ
NULโ0x00โโSOHโ0x01โโSTXโ0x02โโETXโ0x03โโEOTโ0x04โโENQโ0x05โโACKโ0x06โโBELโ0x07โโBSโ0x08โโHTโ0x09โโLFโ0x0AโโVTโ0x0BโโFFโ0x0CโโCRโ0x0DโโSOโ0x0EโโSIโ0x0FโโDLEโ0x10โโDC1โ0x11โโDC2โ0x12โโDC3โ0x13โโDC4โ0x14โโNAKโ0x15โโSYNโ0x16โโETBโ0x17โโCANโ0x18โโEMโ0x19โโSUBโ0x1AโโESCโ0x1BโโFSโ0x1CโโGSโ0x1DโโRSโ0x1EโโUSโ0x1Fโโ/โ0x2Fโ๏ผ"โ0x22โ๏ผ*โ0x2Aโ๏ผ:โ0x3Aโ๏ผ<โ0x3Cโ๏ผ>โ0x3Eโ๏ผ?โ0x3Fโ๏ผ\โ0x5Cโ๏ผผ|โ0x7Cโ๏ฝ
File names on Windows can also not end with the following characters. These only get replaced if they are the last character in the name:
SPโ0x20โโ.โ0x2Eโ๏ผ
Invalid UTF-8 bytes will also be replaced (https://rclone.org/overview/#invalid-utf8), as they can't be converted to UTF-16. fr fr, those bytes simply cannot come ๐
๐ช Paths on Windows ๐ช
On Windows there are many ways of specifying a path to a file system resource. Local paths can be absolute, like C:\path\to\wherever, or relative, like ..\wherever. Network paths in UNC format, \\server\share, are also supported. Path separator can be either \ (as in C:\path\to\wherever) or / (as in C:/path/to/wherever). Length of these paths are limited to 259 characters for files and 247 characters for directories, but there is an alternative extended-length path format increasing the limit to (approximately) 32,767 characters. This format requires absolute paths and the use of prefix \\?\, e.g. \\?\D:\some\very\long\path. For convenience rclone will automatically convert regular paths into the corresponding extended-length paths, so in most cases you do not have to worry about this (read more below). Using the same prefix \\?\ it is also possible to specify path to volumes identified by their GUID, e.g. \\?\Volume{b75e2c83-0000-0000-0000-602f00000000}\some\path. volume GUID paths, main character energy ๐
๐ Long paths ๐
Rclone handles long paths automatically, by converting all paths to extended-length path format (https://docs.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation), which allows paths up to 32,767 characters.
This conversion will ensure paths are absolute and prefix them with the \\?\. This is why you will see that your paths, for instance .\files is shown as path \\?\C:\files in the output, and \\server\share as \\?\UNC\server\share.
However, in rare cases this may cause problems with buggy file system drivers like EncFS (https://github.com/rclone/rclone/issues/261). To disable UNC conversion globally, add this to your .rclone.conf file:
[local]
nounc = true
If you want to selectively disable UNC, you can add it to a separate entry like this:
[nounc]
type = local
nounc = true
And use rclone like this:
rclone copy c:\src nounc:z:\dst
This will use UNC paths on c:\src but not on z:\dst. Of course this will cause problems if the absolute path length of a file exceeds 259 characters on z, so only use this option if you have to. โ ๏ธ only if you HAVE to, bestie, I'm serious
๐ Symlinks / Junction points ๐
Normally rclone will ignore symlinks or junction points (which behave like symlinks under Windows).
If you supply --copy-links or -L then rclone will follow the symlink and copy the pointed to file or directory. Note that this flag is incompatible with --links / -l. pick one, you cannot have both ๐
This flag applies to all commands.
For example, supposing you have a directory structure like this
$ tree /tmp/a
/tmp/a
โโโ b -> ../b
โโโ expected -> ../expected
โโโ one
โโโ two
โโโ three
Then you can see the difference with and without the flag like this
$ rclone ls /tmp/a
6 one
6 two/three
and
$ rclone -L ls /tmp/a
4174 expected
6 one
6 two/three
6 b/two
6 b/one
๐ --local-links, --links, -l ๐
Normally rclone will ignore symlinks or junction points (which behave like symlinks under Windows).
If you supply this flag then rclone will copy symbolic links from the local storage, and store them as text files, with a .rclonelink suffix in the remote storage.
The text file will contain the target of the symbolic link (see example). yes, the actual target text, stored as a file, wild right?
This flag applies to all commands.
For example, supposing you have a directory structure like this
$ tree /tmp/a
/tmp/a
โโโ file1 -> ./file4
โโโ file2 -> /home/user/file3
Copying the entire directory with '-l'
rclone copy -l /tmp/a/ remote:/tmp/a/
The remote files are created with a .rclonelink suffix
$ rclone ls remote:/tmp/a
5 file1.rclonelink
14 file2.rclonelink
The remote files will contain the target of the symbolic links
$ rclone cat remote:/tmp/a/file1.rclonelink
./file4
$ rclone cat remote:/tmp/a/file2.rclonelink
/home/user/file3
Copying them back with '-l'
$ rclone copy -l remote:/tmp/a/ /tmp/b/
$ tree /tmp/b
/tmp/b
โโโ file1 -> ./file4
โโโ file2 -> /home/user/file3
However, if copied back without '-l'
$ rclone copyto remote:/tmp/a/ /tmp/b/
$ tree /tmp/b
/tmp/b
โโโ file1.rclonelink
โโโ file2.rclonelink
If you want to copy a single file with -l then you must use the .rclonelink suffix.
$ rclone copy -l remote:/tmp/a/file1.rclonelink /tmp/c
$ tree /tmp/c
/tmp/c
โโโ file1 -> ./file4
Note that --local-links just enables this feature for the local backend. --links and -l enable the feature for all supported backends and the VFS.
Note that this flag is incompatible with -copy-links / -L.
๐ฏ Symlink targets and the destination ๐ฏ
When rclone recreates a .rclonelink file as a symlink on local storage, the symlink can point anywhere โ including, with an absolute path or one using ../ โ to a location outside the directory you are copying into. This is normal โ rclone reproduces whatever target the link had, so backups round-trip faithfully. it's giving faithful reproduction, we love that ๐
What rclone will not do is write through such a link. If a remote you are copying from contains both a symlink and a file or directory that would be placed inside it โ for example a dir.rclonelink pointing somewhere outside the destination, alongside a dir/file.txt โ rclone refuses to follow the symlink when writing dir/file.txt. The offending file is skipped with an error, the rest of the transfer continues, and the skipped file is counted in the error summary printed at the end of the run. so watch that error summary, it's telling on the skipped file ๐
This protects you from a malicious or compromised remote using -l / --links to plant a symlink and then write through it to somewhere outside your destination. Ordinary symlink round-trips, and symlinks that stay inside the destination, are unaffected. so like, normal use = untouched, sketchy use = blocked. slay. ๐
If you have intentionally pre-created a symlinked directory inside your destination and you want rclone to write into the directory it points at, then do not use -l / --links for that copy, or just remove the symlink first. no cap.
๐ก๏ธ Restricting filesystems with --one-file-system
Normally rclone will recurse through filesystems as mounted. it just goes wherever the tree goes, zero drama, zero boundaries.
However if you set --one-file-system or -x this tells rclone to stay in the filesystem specified by the root and not to recurse into different file systems. like okay bestie, this is your lane, stay in it ๐
For example if you have a directory hierarchy like this
root
โโโ disk1 - disk1 mounted on the root
โ โโโ file3 - stored on disk1
โโโ disk2 - disk2 mounted on the root
โ โโโ file4 - stored on disk12
โโโ file1 - stored on the root disk
โโโ file2 - stored on the root disk
Using rclone --one-file-system copy root remote: will only copy file1 and file2. E.g.
$ rclone -q --one-file-system ls root
0 file1
0 file2
$ rclone -q ls root
0 disk1/file3
0 disk2/file4
0 file1
0 file2
NB Rclone (like most unix tools such asdu,rsyncandtar) treats a bind mount to the same device as being on the same filesystem. iykyk ๐ซถ
NB This flag is only available on Unix based systems. On systems where it isn't supported (e.g. Windows) it will be ignored. it's literally just gonna pretend you never said it ๐
๐ Advanced options
Here are the Advanced options specific to local (Local Disk). the deep lore, the secret menu, the good stuff โจ
--local-nounc
Disable UNC (long path names) conversion on Windows.
Properties:
- Config:
nounc - Env Var:
RCLONE_LOCAL_NOUNC - Type:
bool - Default:
false - Examples:
"true"- Disables long file names.
--copy-links / -L
Follow symlinks and copy the pointed to item. like, go get the actual thing it points at, not the lil shortcut ๐ฆ
Properties:
- Config:
copy_links - Env Var:
RCLONE_LOCAL_COPY_LINKS - Type:
bool - Default:
false
--local-links
Translate symlinks to/from regular files with a .rclonelink extension for the local backend.
Properties:
- Config:
links - Env Var:
RCLONE_LOCAL_LINKS - Type:
bool - Default:
false
--skip-links
Don't warn about skipped symlinks.
This flag disables warning messages on skipped symlinks or junction points, as you explicitly acknowledge that they should be skipped. you've accepted it, you've made peace with it, rclone stops nagging ๐
Properties:
- Config:
skip_links - Env Var:
RCLONE_LOCAL_SKIP_LINKS - Type:
bool - Default:
false
--skip-specials
Don't warn about skipped pipes, sockets and device objects.
This flag disables warning messages on skipped pipes, sockets and device objects, as you explicitly acknowledge that they should be skipped. same energy, different weird file type ๐
Properties:
- Config:
skip_specials - Env Var:
RCLONE_LOCAL_SKIP_SPECIALS - Type:
bool - Default:
false
--local-zero-size-links
Assume the Stat size of links is zero (and read them instead) (deprecated).
Rclone used to use the Stat size of links as the link size, but this fails in quite a few places:
- Windows
- On some virtual filesystems (such as LucidLink)
- Android
So rclone now always reads the link. periodt, that's just how it works now ๐
Properties:
- Config:
zero_size_links - Env Var:
RCLONE_LOCAL_ZERO_SIZE_LINKS - Type:
bool - Default:
false
--local-unicode-normalization
Apply unicode NFC normalization to paths and filenames.
This flag can be used to normalize file names into unicode NFC form that are read from the local filesystem.
Rclone does not normally touch the encoding of file names it reads from the file system. hands off, it leaves your names exactly as it found them ๐คฒ
This can be useful when using macOS as it normally provides decomposed (NFD) unicode which in some language (eg Korean) doesn't display properly on some OSes.
Note that rclone compares filenames with unicode normalization in the sync routine so this flag shouldn't normally be used. fr fr, leave it off unless you have a reason
Properties:
- Config:
unicode_normalization - Env Var:
RCLONE_LOCAL_UNICODE_NORMALIZATION - Type:
bool - Default:
false
--local-no-check-updated
Don't check to see if the files change during upload.
Normally rclone checks the size and modification time of files as they are being uploaded and aborts with a message which starts "can't copy - source file is being updated" if the file changes during upload. it will literally stop mid-upload and yell at you ๐ญ
However on some file systems this modification time check may fail (e.g. Glusterfs #2206 (https://github.com/rclone/rclone/issues/2206)) so this check can be disabled with this flag.
If this flag is set, rclone will use its best efforts to transfer a file which is being updated. If the file is only having things appended to it (e.g. a log) then rclone will transfer the log file with the size it had the first time rclone saw it. best efforts behavior, no promises ๐ซ
If the file is being modified throughout (not just appended to) then the transfer may fail with a hash check failure.
In detail, once the file has had stat() called on it for the first time we:
- Only transfer the size that
statgave - Only checksum the size that
statgave - Don't update the
statinfo for the file
NB do not use this flag on a Windows Volume Shadow (VSS). For some unknown reason, files in a VSS sometimes show different sizes from the directory listing (where the initialstatvalue comes from on Windows) and whenstatis called on them directly. Other copy tools always use the directstatvalue and setting this flag will disable that. like genuinely don't, this one bites ๐
Properties:
- Config:
no_check_updated - Env Var:
RCLONE_LOCAL_NO_CHECK_UPDATED - Type:
bool - Default:
false
--one-file-system / -x
Don't cross filesystem boundaries (unix/macOS only). stay in your lane bestie ๐ฃ๏ธ
Properties:
- Config:
one_file_system - Env Var:
RCLONE_LOCAL_ONE_FILE_SYSTEM - Type:
bool - Default:
false
--local-case-sensitive
Force the filesystem to report itself as case sensitive.
Normally the local backend declares itself as case insensitive on Windows/macOS and case sensitive for everything else. Use this flag to override the default choice. you're just telling rclone what to believe about itself ๐
Properties:
- Config:
case_sensitive - Env Var:
RCLONE_LOCAL_CASE_SENSITIVE - Type:
bool - Default:
false
--local-case-insensitive
Force the filesystem to report itself as case insensitive.
Normally the local backend declares itself as case insensitive on Windows/macOS and case sensitive for everything else. Use this flag to override the default choice. the mirror twin of the last one, same lore different direction ๐ช
Properties:
- Config:
case_insensitive - Env Var:
RCLONE_LOCAL_CASE_INSENSITIVE - Type:
bool - Default:
false
--local-no-clone
Disable reflink cloning for server-side copies.
Normally, for local-to-local transfers, rclone will "clone" the file when possible, and fall back to "copying" only when cloning is not supported.
Cloning creates a shallow copy (or "reflink") which initially shares blocks with the original file. Unlike a "hardlink", the two files are independent and neither will affect the other if subsequently modified. independent icons, no shared drama ๐
Cloning is usually preferable to copying, as it is much faster and is deduplicated by default (i.e. having two identical files does not consume more storage than having just one.) However, for use cases where data redundancy is preferable, --local-no-clone can be used to disable cloning and force "deep" copies. want every byte physically separate? this is your flag ๐
Currently, cloning is only supported when using APFS on macOS (support for other platforms may be added in the future.) macOS APFS girlies only rn ๐
Properties:
- Config:
no_clone - Env Var:
RCLONE_LOCAL_NO_CLONE - Type:
bool - Default:
false
--local-no-preallocate
Disable preallocation of disk space for transferred files.
Preallocation of disk space helps prevent filesystem fragmentation. However, some virtual filesystem layers (such as Google Drive File Stream) may incorrectly set the actual file size equal to the preallocated space, causing checksum and file size checks to fail. Use this flag to disable preallocation. the vibes get messed up and then checksums fail ๐ญ
Properties:
- Config:
no_preallocate - Env Var:
RCLONE_LOCAL_NO_PREALLOCATE - Type:
bool - Default:
false
--local-no-sparse
Disable sparse files for multi-thread downloads.
On Windows platforms rclone will make sparse files when doing multi-thread downloads. This avoids long pauses on large files where the OS zeros the file. However sparse files may be undesirable as they cause disk fragmentation and can be slow to work with. tradeoffs, bestie, it's always tradeoffs โ๏ธ
Properties:
- Config:
no_sparse - Env Var:
RCLONE_LOCAL_NO_SPARSE - Type:
bool - Default:
false
--local-no-set-modtime
Disable setting modtime.
Normally rclone updates modification time of files after they are done uploading. This can cause permissions issues on Linux platforms when the user rclone is running as does not own the file uploaded, such as when copying to a CIFS mount owned by another user. If this option is enabled, rclone will no longer update the modtime after copying a file. permission problems? gone. modtime updating? also gone. choices were made ๐
Properties:
- Config:
no_set_modtime - Env Var:
RCLONE_LOCAL_NO_SET_MODTIME - Type:
bool - Default:
false
--local-metadata-restore-special-bits
Restore the setuid, setgid and sticky bits from metadata.
When restoring metadata with --metadata rclone applies the "mode" from the source. By default rclone applies only the permission bits and strips the setuid, setgid and sticky bits.
The "mode" comes from the source remote which may not be trusted. Restoring a setuid or setgid bit onto freshly written, source-controlled content can plant a setuid binary, which is dangerous in particular when restoring from an untrusted source while running as root. For this reason these bits are not restored by default. like actually dangerous, not cutesy dangerous ๐ run it as root from a sketchy source and you are cooked
If you trust the source and want the setuid, setgid and sticky bits restored - for example when restoring a system backup made by rclone - set this flag. own backup, own source, own rules ๐
Properties:
- Config:
metadata_restore_special_bits - Env Var:
RCLONE_LOCAL_METADATA_RESTORE_SPECIAL_BITS - Type:
bool - Default:
false
--local-fatal-if-no-space
Make out-of-space errors fatal during transfers.
When enabled, an ENOSPC error during a write returns a fatal error so that rclone aborts rather than retrying the operation. Useful for backup scripts that should halt loudly on a full disk rather than spin retrying. disk full? we scream about it immediately instead of spinning forever ๐
Properties:
- Config:
fatal_if_no_space - Env Var:
RCLONE_LOCAL_FATAL_IF_NO_SPACE - Type: bool
- Default: false
โฆokay so that's the rest of that one's properties, bestie, we're back ๐
--local-time-type
Sets what kind of time gets returned. โจ
Normally rclone does literally everything on the mtime, aka the Modification time. That's the default vibe.
But if you flip this flag, rclone will hand you back the Modified time as whatever you set here instead. So if you do rclone lsl --local-time-type ctime then you'll see ctimes in the listing. Cute, right?
And if your OS doesn't support returning the time_type you asked for, rclone will silently swap it for the modification time instead, because every OS supports that one. No error, no drama, just a quiet substitution. ๐ซถ
mtimeis supported by all OSesatimeis supported on all OSes except:plan9,jsbtimeis only supported on:Windows,macOS,freebsd,netbsdctimeis supported on all OSes except:Windows,plan9,js
Heads up bestie: setting the time will still set the modified time, so this flag is only useful for reading. It's a viewing thing, not a writing thing. ๐
Properties:
- Config:
time_type - Env Var:
RCLONE_LOCAL_TIME_TYPE - Type:
mtime|atime|btime|ctime - Default:
mtime - Examples:
"mtime"- The last modification time.
"atime"- The last access time.
"btime"- The creation time.
"ctime"- The last status change time.
--local-hashes
Comma separated list of supported checksum types. ๐
Properties:
- Config:
hashes - Env Var:
RCLONE_LOCAL_HASHES - Type: CommaSepList
- Default: (blank โ no checksum types out of the box)
--local-encoding
The encoding for the backend. ๐
See the encoding section in the overview (https://rclone.org/overview/#encoding) for more info.
Properties:
- Config:
encoding - Env Var:
RCLONE_LOCAL_ENCODING - Type: Encoding
- Default:
Slash,Dot
--local-description
Description of the remote. Just a lil label for your baby. ๐
Properties:
- Config:
description - Env Var:
RCLONE_LOCAL_DESCRIPTION - Type: string
- Required: false
โจ Metadata โจ
Depending on which OS is in use, the local backend may return only some of the system metadata. Setting system metadata is supported on all OSes, but setting user metadata is only supported on linux, freebsd, netbsd, macOS and Solaris. It is not supported on Windows yet (see pkg/attrs#47 (https://github.com/pkg/xattr/issues/47)). ๐
User metadata is stored as extended attributes (which may not be supported by all file systems) under the "user.*" prefix.
Metadata is supported on files and directories. Both. The whole slay.
โ ๏ธ Okay important one, listen up: when restoring metadata with--metadatarclone applies the"mode","uid"and"gid"from the source. These come from the source remote, which may not be trusted, so restoring metadata asrootfrom an untrusted source can change file ownership and is not recommended. Thesetuid,setgidand sticky bits are not restored by default โ see the--local-metadata-restore-special-bitsflag.
Here are the possible system metadata items for the local backend. ๐
atimeโ Help: Time of last access ยท Type: RFC 3339 ยท Example:2006-01-02T15:04:05.999999999Z07:00ยท Read Only:Nbtimeโ Help: Time of file birth (creation) ยท Type: RFC 3339 ยท Example:2006-01-02T15:04:05.999999999Z07:00ยท Read Only:Ngidโ Help: Group ID of owner ยท Type: decimal number ยท Example:500ยท Read Only:Nmodeโ Help: File type and mode ยท Type: octal, unix style ยท Example:0100664ยท Read Only:Nmtimeโ Help: Time of last modification ยท Type: RFC 3339 ยท Example:2006-01-02T15:04:05.999999999Z07:00ยท Read Only:Nrdevโ Help: Device ID (if special file) ยท Type: hexadecimal ยท Example:1abcยท Read Only:Nuidโ Help: User ID of owner ยท Type: decimal number ยท Example:500ยท Read Only:N
See the metadata (https://rclone.org/docs/#metadata) docs for more info.
Backend commands ๐ ๏ธ
Here are the commands specific to the local backend. iykyk, not every backend has these.
Run them with:
rclone backend COMMAND remote:
The help below will explain what arguments each command takes.
See the backend (https://rclone.org/commands/rclone_backend/) command for more info on how to pass options and arguments.
These can be run on a running backend using the rc command backend/command (https://rclone.org/rc/#backend-command).
noop
A null operation for testing backend commands. It does nothing and that's the whole point, iconic honestly. ๐
rclone backend noop remote: [options] [<arguments>+]
This is a test command which has some options you can try to change the output.
Options:
"echo": Echo the input arguments."error": Return an error based on option value.
Changelog ๐
v1.75.2 - 2026-10-09
See commits (https://github.com/rclone/rclone/compare/v1.75.1...v1.75.2)
Security ๐ (the big one, bestie โ read it all)
b2: Fix account token and SSE-C key leaking on redirects from--b2-download-urlGHSA-gpw7-77cq-9f72 CVE-PENDING (Nick Craig-Wood)build- Fix multiple CVEs by upgrading to
go1.26.9(Nick Craig-Wood)CVE-2026-97032: net/http: HTTP/2 server crash due to HPACK encoder raceCVE-2026-78659: net/http: HTTP/2 server memory exhaustion due to Trailer headersCVE-2026-97031: crypto/tls: reject malformed ECH outer extension referencesCVE-2026-94444: cmd/go: checksum bypass for golang.org/fips140CVE-2026-94447: cmd/go: checksum database bypass for golang.org/toolchainCVE-2026-94448: html/template: reset context tracking on consecutive template expressionsCVE-2026-97030: html/template: recognize |yield| as regexp preceder keywordCVE-2026-94440: net/textproto, mime/multipart: memory limit bypass when parsing MIME headersCVE-2026-56866: net/http: HTTP/1 client connection desynchronization after CONNECT rejectionCVE-2026-94439: net/http: HTTP/1 server connection desynchronization after 2xx CONNECT responseCVE-2026-78669: net/http: excessive CPU consumption from repeated initial window changesCVE-2026-78660: net/http: HTTP/2 transport accepts malformed framing-related headersCVE-2026-56857: os: Root.Mkdir(All) can follow junctions out of the root on WindowsCVE-2026-78667: net/http: lack of limit on size of parsed Range headersCVE-2026-78663: net/http: double flow control refund on HTTP/2 server streams
- Update
golang.org/x/nettov0.60.0to fix multiple CVEs (Nick Craig-Wood)CVE-2026-78659: net/http: HTTP/2 server memory exhaustion due to Trailer headersCVE-2026-78669: net/http: excessive CPU consumption from repeated initial window changesCVE-2026-78663: net/http: double flow control refund on HTTP/2 server streamsCVE-2026-97032: net/http: HTTP/2 server crash due to HPACK encoder race
- Update
google.golang.org/grpcto fixCVE-2026-84445(dependabot[bot])CVE-2026-84445: xds: server panic on a request missing both:authorityandHostheaders
- Fix multiple CVEs by upgrading to
fshttp: Drop--headervalues over HTTP after HTTPS downgrade GHSA-rrwf-2qr6-p832 CVE-PENDING (Nick Craig-Wood)http: Stop a path starting with//moving the remote to another host GHSA-xqmq-v4wj-rw5m CVE-PENDING (Nick Craig-Wood)lib/http: Require authentication forOPTIONSrequests GHSA-gj73-fh6v-92fj CVE-PENDING (Nick Craig-Wood)local: Fix.rclonelinknames escaping the root with--linksGHSA-55qp-jrwr-x827 CVE-PENDING (Nick Craig-Wood)netstorage- Stop a path starting with
//moving the remote to another host GHSA-xqmq-v4wj-rw5m CVE-PENDING (Nick Craig-Wood) - Stop a listing resume token moving signed requests to another host GHSA-xqmq-v4wj-rw5m CVE-PENDING (Nick Craig-Wood)
- Stop a path starting with
pcloud- Fix OAuth config accepting callbacks without state GHSA-hvpr-p4pv-4f46 CVE-PENDING (Nick Craig-Wood)
- Only accept pCloud hosts from the hostname in the OAuth callback GHSA-hvpr-p4pv-4f46 (Nick Craig-Wood)
selfupdate- Fix hash check trusting unsigned data in the signed
SHA256SUMSGHSA-w33h-3qgq-8mv8 CVE-PENDING (Nick Craig-Wood) - Fix release verification instructions trusting unsigned hashes GHSA-w33h-3qgq-8mv8 CVE-PENDING (Nick Craig-Wood)
- Fix hash check trusting unsigned data in the signed
serve nfs: Fix path traversal by refusing unsafe file names in the VFS GHSA-44pm-2q5p-fm63 CVE-PENDING (Nick Craig-Wood)serve s3- Fix presigned URL being turned into a copy of any object GHSA-w3h7-jxxq-vfrp CVE-PENDING (Nick Craig-Wood)
- Stop auth proxy users listing or using each other's multipart uploads and metadata GHSA-35g6-9fjv-rmx5 CVE-PENDING (Nick Craig-Wood)
- Fix multipart buffer limits being bypassed by overflowing part sizes GHSA-qjw8-8hmp-c3m6 (Nick Craig-Wood)
- Add
--multipart-max-uploadsto limit uploads in progress (Nick Craig-Wood) - Add
--multipart-streaming-buffer-totalto limit memory across uploads (Nick Craig-Wood) - Add
--metadata-max-objectsto limit the metadata kept in memory (Nick Craig-Wood)
serve webdav: Fix path traversal above the served directory GHSA-44pm-2q5p-fm63 CVE-PENDING (Nick Craig-Wood)webdav: Fix headers option leaking to other hosts on redirect GHSA-3rqf-7h69-gg5v CVE-PENDING (Nick Craig-Wood)
Bug Fixes ๐
accounting- Stop averaging when the last check finishes (Kunpeng Xie)
- Keep speed averaging active when transfers overlap (kaii9)
dedupe: Fix rename mode giving up after 100 names and make it faster (Nick Craig-Wood)- doc fixes (Dhevenddra K G, enkvadrat, GhostCoder6969, James Truitt, maximilize, n4n5, Nick Craig-Wood, PSR94, Rohit Behera, shaurya, subomi)
docker: Fix files uploaded with the wrong mime type (hsdfat)fs- Fix about showing a negative total when a quota reaches the int64 maximum (youdie006)
- Fix bandwidth limits below 1 KiB being multiplied by 1024 (Roland)
- Fix
--bwlimittimetables written out of order using the wrong limit (Rohit Behera) ๐- Make
BwTimetable.Setreplace the timetable instead of appending to it (youdie006) ๐ - Retry "network is unreachable" and "network is down" errors (nielash) ๐ก
- Make
fserrorsโ Fix out of space detection on Windows (ferrumclaudepilgrim)lib/restโ Limit the size of HTTP response bodies read into memory (Nick Craig-Wood)logโ Fix race when adding a log output while logging (Nick Craig-Wood)oauthutilโ FixRenew.Shutdownnil timer panic and race (TastyHeadPhones)- operations
- Stop
--copy-destreplacing files with--immutable(phatlc) - Fix ignored error in
rcatprobe reads (Wang Chencheng) - Fix hang when deleting files and a fatal error occurs (Nick Craig-Wood)
- Fix hang and lost context when moving a directory file by file (Nick Craig-Wood)
- Don't sleep for a
Retry-Aftererror when the transfer is cancelled (Nick Craig-Wood)
- Stop
- rc
- Make
job/statusandjob/listrequire authentication (Nick Craig-Wood) ๐ - Fix rc API accepting an out of range number and overflowing 64 bits (KBS)
- Reject out of range integer parameters instead of truncating them (Nick Craig-Wood)
- Fix large numeric parameters being rejected on 32 bit builds (Jeremy Schoemaker)
- Make
selfupdateโ Fix--version X.Ydepending on./in the download site links (Nick Craig-Wood)- serve
- Fix
--auth-proxystopping VFS cache uploads after 5 minutes (Nick Craig-Wood) - Fix
--auth-proxybackends never being shut down after simultaneous logins (Nick Craig-Wood)
- Fix
serve dlnaโ Log unescaped paths (phatlc)serve dockerโ Fix volume path being lost when the plugin restarts (phatlc)serve ftp- Fix transfers failing after 5 minutes with
--auth-proxy(Nick Craig-Wood) - Fix VFS leak when the server fails to start (Nick Craig-Wood)
- Fix transfers failing after 5 minutes with
serve http- Fix downloads failing after 5 minutes with
--auth-proxy(Nick Craig-Wood) - Escape filename in zip download
Content-Dispositionheader (Harsh Raj Singhania)
- Fix downloads failing after 5 minutes with
serve restic- Fix repositories named
data(kaii9) - Prevent concurrent append-only overwrites (Vasek Sraier)
- Fix repositories named
serve s3- Apply the multipart upload limits and
--metadata-max-objectsto each user separately (Nick Craig-Wood) - Stream in-order multipart parts without buffering them (Nick Craig-Wood)
- Start the upload to the backend on the first multipart part (Nick Craig-Wood)
- Don't buffer re-uploads of multipart parts already streamed (Nick Craig-Wood)
- Count buffered multipart parts in whole memory pages (Nick Craig-Wood)
- Time out multipart parts waiting for buffer space (Nick Craig-Wood)
- Limit the memory requests can use (Nick Craig-Wood)
- Forget expired multipart uploads completely (Nick Craig-Wood)
- Forget the metadata of deleted objects (Nick Craig-Wood)
- List objects lazily so paging a deep hierarchy is fast (Nick Craig-Wood)
- Fix multipart upload corruption if the backend write of an early part fails (Nick Craig-Wood)
- Fix uploads failing when the auth proxy expires the user's backend (Nick Craig-Wood)
- Fix stale metadata being returned for objects changed elsewhere (Nick Craig-Wood)
- Fix
--etag-hash autocrashing or using the wrong hash with--auth-proxy(Nick Craig-Wood) - Fix
CopyObjectof a missing object not returningNoSuchKey(Nick Craig-Wood) - Fix log messages with bad format strings (Nick Craig-Wood)
- Document memory use and bring the docs up to date (Nick Craig-Wood) ๐
- Apply the multipart upload limits and
serve webdav- Fix transfers failing after 5 minutes with
--auth-proxy(Nick Craig-Wood) - Fix crash when the server fails to start (Nick Craig-Wood)
- Escape filename in zip download
Content-Dispositionheader (Harsh Raj Singhania)
- Fix transfers failing after 5 minutes with
vfscacheโ Fix hang when the cache cleaner is disabled (ferrumclaudepilgrim)
- Mount
- Fix
--daemonfailing when--rcis enabled (somaz) - Ignore
com.apple.*xattrs on the macOS FSKit backend (Eugene)
- Fix
- VFS
- Fix reads returning zeros after a file changes during handle caching (Neil Cawse)
- Stop setting a file's modtime from discarding its cached data (Neil Cawse)
- Fix crash reading the metadata of a file which is being written (Nick Craig-Wood)
- Fix a VFS being reused while it is being shut down (Nick Craig-Wood)
- Fix
AddVirtualignoringisDir(phatlc) - Stop
--linksobjects called"...rclonelink"appearing as".."in directory listings (Nick Craig-Wood)
- Local
- Fix directories named
*.rclonelinkbeing treated as links with--links(Nick Craig-Wood)
- Fix directories named
- Archive
- Fix corrupt listings when listing a zip directory more than once (Nick Craig-Wood)
- Fix zip file entries named for a directory causing confusion (Nick Craig-Wood)
- Fix listing entries with a leading slash as if they were in the root (Nick Craig-Wood)
- Fix crash when creating archive to stdout (Vladimir Babin)
- Fix a squashfs path to a single file listing its whole directory (Nick Craig-Wood)
- Azure Blob
- Use the released Azure SDK for Apache Arrow listing (Nick Craig-Wood)
- Box
- Fix log messages with bad format strings (Nick Craig-Wood)
- Chunker
- Fix panic listing a directory after an interrupted upload with
meta_format none(Nick Craig-Wood)
- Fix panic listing a directory after an interrupted upload with
- Compress
- Fix crash on ranged reads when gzip metadata is corrupted (Acts1631)
- Drime
- Fix server-side copy over an existing file leaving a
"name (1)"copy (Nick Craig-Wood) - Fix deleted files and directories still being listed with
hard_delete(Nick Craig-Wood)
- Fix server-side copy over an existing file leaving a
- Drive
- Document the Branding step needed to publish your own
client_id(Sanjay Kanth A)
- Document the Branding step needed to publish your own
- Dropbox
- Fix shared folder mount for roots nested more than one level deep (phatlc)
- Match shared-folder and received-file names case-insensitively (phatlc)
- Filescom
- Fix corrupted uploads after a retried upload error (Nick Craig-Wood)
- Document that names with
/or in can't be stored (Nick Craig-Wood)
- HTTP
- Fix crash when the server fails to start (Nick Craig-Wood)
- Iclouddrive
- Fix potential crash looking up items (Nick Craig-Wood)
- Imagekit
- Fix potential crash in
rmdirandpurge(Nick Craig-Wood)
- Fix potential crash in
- Internxt
- Fix lookups of files starting with a dot and dropped uploads (jzunigax2)
- Fix sync with
--backup-diror--suffixdeleting the backed up file (Nick Craig-Wood) - Fix server-side moves failing with "Not Found" or "already exists" (Nick Craig-Wood)
- Fix "directory not empty" and stale directories after moves and deletes (Nick Craig-Wood)
- Fix server-side directory move failing after a gateway timeout (Nick Craig-Wood)
- Onedrive
- Update docs for versions, links and time precision on personal accounts (Nick Craig-Wood)
- Document that shared with me shortcuts may fail to list on personal (Nick Craig-Wood)
- Update
--onedrive-hard-deletedocs to mention personal account support (foecmke)
- Oracleobjectstorage
- Fix SSE-C server-side copies (tomaszni)
- Upload empty streams without multipart (tomaszni)
- Pixeldrain
- Fix corrupted uploads after a retried upload error (Nick Craig-Wood)
- Premiumizeme
- Fix uploading files with
";"in their names (Nick Craig-Wood)
- Fix uploading files with
- S3
- Disable signing
Accept-Encodingfor Ceph and Linode (Aditya) - Fix version-at listings with URL encoded keys (jxj)
- Fix storage class missing from
--s3-versionslistings (Dirk Petersen)
- Disable signing
- Seafile
- Fix corrupted uploads after a retried upload error (Nick Craig-Wood)
- SFTP
- Fix failed uploads leaving disk space in use on the server (Nick Craig-Wood)
- Shade
- Fix potential crash in directory move (Nick Craig-Wood)
- Smb
- Save the user name in the config even if it matches the current user (phatlc)
- WebDAV
- Fix duplicated listing entries after retried
PROPFIND(ZRHann) - Fix "XML syntax error" on paths which don't exist with ownCloud 10.16 (Nick Craig-Wood)
- Fix duplicated listing entries after retried
v1.75.1 - 2026-09-04
See commits โ https://github.com/rclone/rclone/compare/v1.75.0...v1.75.1 ๐ซถ
Security
archive๐ฅ- Fix zip slip path traversal in untrusted zip files
GHSA-66hp-wgxq-6f5qCVE-PENDING(Nick Craig-Wood) - Hide any archive entry which escapes the directory being listed
GHSA-66hp-wgxq-6f5q(Nick Craig-Wood) - Reject unsafe entry names when mounting squashfs images
GHSA-66hp-wgxq-6f5q(Nick Craig-Wood) - Fix zip subdirectory root matching sibling directories
GHSA-66hp-wgxq-6f5q(Nick Craig-Wood) - Fix zip entry named
"."hiding every other fileGHSA-66hp-wgxq-6f5q(Nick Craig-Wood) - Fix "directory not found" for archive paths containing
"./"or"//"GHSA-66hp-wgxq-6f5q(Nick Craig-Wood)
- Fix zip slip path traversal in untrusted zip files
build- Fix multiple CVEs by upgrading to
go1.26.6(Nick Craig-Wood)CVE-2026-56860:net/url: quadratic complexity inresolvePathCVE-2026-56858:html/template: JavaScript regexp context trackingCVE-2026-56862:crypto/tls: limit handshake messages accepted post-handshakeCVE-2026-56853:net/http: applyReadHeaderTimeoutto unencrypted HTTP/2 checkCVE-2026-56859:encoding/xml: recursion depth guard during decodeCVE-2026-33818:encoding/asn1: enforce maximum recursion depthCVE-2026-46600:net: panic parsing an invalid SVCB or HTTPS RR indnsmessageCVE-2026-39821:net/http: reject ASCII-only Punycode-encoded labels inidna
- Update
golang.org/x/cryptotov0.56.0to fix multiple CVEs (Nick Craig-Wood) ๐
- Fix multiple CVEs by upgrading to
CVE-2026-56854โ ssh: source-address critical option not enforced for non-public-key auth callbacks ๐คCVE-2026-78662โ ssh: a malicious peer could flood an undecided channel's incoming requests, deadlocking the connection ๐CVE-2026-56855โ ssh: a malicious peer could send crafted messages on an established channel, deadlocking the connection ๐ญ- Update
golang.org/x/imagetov0.45.0to fixCVE-2026-46603(Nick Craig-Wood)CVE-2026-46603: excessive memory allocation during VP8L decoding ๐
fs: Confine directory listing entries that escape the rootGHSA-3vxh-3pcx-9m8qGHSA-38xv-hf3p-h7mqCVE-PENDING(Nick Craig-Wood)fshttp: Don't send--headervalues to other hosts on redirectGHSA-486v-q2wf-fp2rCVE-PENDING(Nick Craig-Wood)http: Don't leak configured headers to other hosts or over plaintext on redirectGHSA-486v-q2wf-fp2rCVE-PENDING(Nick Craig-Wood)lib/rest: Check HTTPS downgrades against the original request on redirectGHSA-486v-q2wf-fp2rCVE-PENDING(Nick Craig-Wood)local- Fix dir metadata escaping the root through a planted symlink
GHSA-f8g7-2xjc-7mfhCVE-PENDING(Nick Craig-Wood) - Fix
btimeescaping the root via a planted symlinkGHSA-f8g7-2xjc-7mfhCVE-PENDING(Nick Craig-Wood) - Fix panic on
Rangerequest past the end of a symlinkGHSA-p6m2-r3w9-mpxwCVE-PENDING(Nick Craig-Wood)
- Fix dir metadata escaping the root through a planted symlink
serve docker- Reject volume names that escape the base directory
GHSA-p6vx-hf7p-98j6(Nick Craig-Wood) - Reject volume names resolving to the base directory itself
GHSA-p6vx-hf7p-98j6(Nick Craig-Wood) - Re-derive volume mountpoint from name when restoring state
GHSA-p6vx-hf7p-98j6(Nick Craig-Wood)
- Reject volume names that escape the base directory
serve ftp: Fix auth-proxy sessions sharing credentials by usernameGHSA-c476-6w5q-jw77CVE-PENDING(Nick Craig-Wood)serve s3- Fix memory exhaustion from client-declared multipart part size
GHSA-2p48-j3qc-rx9fCVE-PENDING(Nick Craig-Wood) - Reject bogus multipart part sizes in the reorder buffer
GHSA-2p48-j3qc-rx9f(Nick Craig-Wood) - Fix auth proxy accepting any request signed with an empty secret
GHSA-xwwr-4h3p-r22cCVE-PENDING(Nick Craig-Wood)
- Fix memory exhaustion from client-declared multipart part size
NB the auth proxy protocol for <code>serve s3</code> has changed - the proxy program is now given the access key ID as user and must return the secret as _secret_access_key ๐
- Fix each server accepting the
--auth-keycredentials of all the others (Nick Craig-Wood) - Fix misleading anonymous access log when using an auth proxy via rc
GHSA-p569-5gjg-9cmjCVE-PENDING(Nick Craig-Wood)
serve sftp: Fix auth proxy configured via rc being silently ignoredGHSA-p569-5gjg-9cmjCVE-PENDING(Nick Craig-Wood)
๐ Bug Fixes ๐
- accounting
- Fix memory leak on long-running
rcd(nielash) - Fix memory leak from stats groups on long-running
rcd(nielash) - Fix
bwlimitburst overflow (Rayan Salhab)
- Fix memory leak on long-running
- bisync
- Fix memory leak when running via the rc (nielash)
- Fix failed transfers of empty files being recorded as synced (Nick Craig-Wood)
- build: Make
go1.26the minimum required version as needed bygolang.org/x/crypto v0.56.0(Nick Craig-Wood) - config: Redact env var config values in logs (Pastalikek65)
- doc fixes (Anton Karpov, CAOShurong, Dean Chen, Nick Craig-Wood, Recoordinate, Rodrigo Rodrigues, Shantanav Mukherjee, shaurya)
lib/batcher: Prevent commits racing shutdown (Loi Nguyen)lib/transform: Fix panic intruncate_keep_extension(VXNCXNX)- multipart: Fix chunked uploads storing truncated objects when the source ends early (Nick Craig-Wood)
- operations: Fix silent truncation of streaming uploads whose source ends early (Nick Craig-Wood)
- serve
- Fix VFS instance leaks on server startup failures and shutdown (Hakan ฤฐSMAฤฐL)
- Pass the client IP address to the auth proxy (am-at-enrollvb)
serve http: Prevent scrolling to the top on page reload (Sune Mรธlgaard)serve nfs: FixEIOwhen creating symlinks with--vfs-links(SillyZir)serve s3- Fix failed uploads deleting or corrupting the object at the key (Nick Craig-Wood)
- Fix crash when a multipart upload is aborted while a part is uploading (Nick Craig-Wood)
- Fix modtime not being set when only mtime metadata is supplied on
PUT(Nick Craig-Wood) - Upload all multipart uploads via the VFS so they obey
--bwlimitand show in stats (Nick Craig-Wood) - Reserve the
.rclone_temp_prefix for temporary objects (Nick Craig-Wood) - Clean up abandoned multipart uploads after
--multipart-expiry(Nick Craig-Wood)
vfscache- Fix reader deadlock when the item size drops below the read offset (Dave)
- Fix log message growing without bound on repeated write errors (Vijay Misal)
walk: Stop directory traversal when the context is cancelled (Rahman Yilmaz)- VFS
- Synchronize poll updates with shutdown (Loi Nguyen)
- Make poll shutdown lifecycle deterministic (Loi Nguyen)
- Crypt
- Fix hash mismatches with
no_data_encryptionon backends which check upload hashes (Nick Craig-Wood) - Fix directory names which look like versioned file names (TowyTowy)
- Warn about directories with legacy version-like encrypted names (Nick Craig-Wood)
- Fix hash mismatches with
- Azure Blob
- Fix Entra ID server-side copy source authentication (Edward Klesel)
- Fix spurious vfs cache corruption errors during chunked reads (Nick Craig-Wood)
- Azurefiles
- Fix zero padded files being created when the source ends early (Nick Craig-Wood)
- Box
- Fix truncated files being uploaded successfully when the source ends early (Rohit Behera)
- Compress
- Fix corrupted objects being created when the source ends early (Nick Craig-Wood)
- Drive
- Don't list trashed files when removing a directory into the trash (alliasgher)
- Dropbox
- Preserve Paper export paths on lookup (Loi Nguyen)
- Fix context cancellation (e.g.
--max-durationlimit) not stopping in-flight requests (debaditya) - Fix chunked uploads of truncated files never finishing (Nick Craig-Wood)
- Don't retry chunked upload requests when the upload has been cancelled (Nick Craig-Wood)
- Decode received shared-file names (Sanjay Kanth A)
- Fix
ChangeNotifywhen the root's case differs from Dropbox's (Loi Nguyen)
- Filelu
- Fix truncated files being uploaded successfully when the source ends early (Nick Craig-Wood)
- Fix duplicate root path during multipart folder creation (kingston125)
- Huaweidrive
- Fix truncated files being uploaded successfully when the source ends early (Rohit Behera)
- Iclouddrive
- Fix uploads into an app container failing with
412(Christian De Santis)
- Fix uploads into an app container failing with
- Internetarchive
- Fix corrupted files being created when the source ends early (Nick Craig-Wood)
- Internxt
- Persist rotated token returned by the user info call (0rangeSeaW0lf)
- Onedrive
- Fix
403 Forbiddenfor configuration personal onedrive (machsix) - Fall back to manual drive ID entry when drive listing fails (SillyZir)
- Don't retry multipart upload chunk on
404(upload session not found) (water)
- Fix
- Overview
- Fix
"internal error: no overview data found"on 32 bit architectures (Nick Craig-Wood)
- Fix
- Pikpak
- Fix truncated files being created when the source ends early (Nick Craig-Wood)
- Fix truncated single part uploads reported as ok when source ends early (Nick Craig-Wood)
- Protondrive
- Fix files uploaded with
v1.75.0not being readable in the Proton apps (Nick Craig-Wood) - Fix corrupted uploads after a retried upload error (Nick Craig-Wood)
- Fix files uploaded with
- Quatrix
- Fix chunk upload retries and fix memory leak (Nick Craig-Wood)
- S3
- Update Mega endpoints (Nick Craig-Wood)
- Treat
UploadPartsuccess without ETag as retryable error (CAOShurong) - Fix server side copy failing with
--s3-no-head-object(Anatoly Tarnavsky)
- Sia
- Fix corrupted files being created when the source ends early (Nick Craig-Wood)
- Smb
- Reuse the upload connection for
SetModTime(alliasgher)
- Reuse the upload connection for
- WebDAV
- Fix
SetModTimefailing and hashes missing on Nextcloud (Nick Craig-Wood)
- Fix
- Yandex
- Fix truncated files being uploaded successfully when the source ends early (Rohit Behera)
๐ v1.75.0 - 2026-07-31 ๐
See commits (https://github.com/rclone/rclone/compare/v1.74.0...v1.75.0) โจ
๐ New S3 Providers
- Scality (
https://rclone.org/s3/#scality) (RING / ARTESCA) - Zero Services (
https://rclone.org/s3/#zero-z3) (ZERO-Z3)
๐ Security
- archive: Don't crash on malformed squashfs images
GHSA-6jcg-q3wp-x2f4(Nick Craig-Wood) - ftp: Fix ftp command injection when encoding doesn't include CRLF
GHSA-8c48-q9wj-3w37CVE-2026-71311(Nick Craig-Wood) lib/http: Use TLS on all--addrlisteners when--certand--keyare setGHSA-mfvx-7rcj-9m5g(Nick Craig-Wood)lib/proxy: Fix unbounded HTTP CONNECT headers causing OOMGHSA-xhf4-832v-7xcrCVE-2026-71310(Nick Craig-Wood)local: Stop source file names escaping the destination directoryGHSA-7p4m-qxvv-g567CVE-2026-71313(Nick Craig-Wood)- rc
- Don't expose pprof debug handlers on an unauthenticated server
GHSA-mfvx-7rcj-9m5gCVE-PENDING(Nick Craig-Wood) - Require authentication to list the remotes with
--rc-serveGHSA-mfvx-7rcj-9m5g(Nick Craig-Wood) - Fix leaking stack traces on panics
GHSA-gwfq-86j8-7qhv(Nick Craig-Wood)
- Don't expose pprof debug handlers on an unauthenticated server
- s3
- Fix redirect credential leaks, reject HTTPS->HTTP and strip secrets
GHSA-8mxv-9xhp-86h4(Nick Craig-Wood) - Strip S3 Express session token on cross-host redirects
GHSA-8mxv-9xhp-86h4(Nick Craig-Wood)
- Fix redirect credential leaks, reject HTTPS->HTTP and strip secrets
serve ftp: Use constant time comparison for password checkGHSA-mfvx-7rcj-9m5g(Nick Craig-Wood)- serve restic โ path traversal above the served directory?? absolutely not ๐
โโ๏ธ that's GHSA-45pq-889g-fcgh and CVE-2026-71309, fixed. ty Nick Craig-Wood ๐
- serve sftp โ one bad request used to crash the WHOLE server, which is genuinely giving horror movie ๐ now it doesn't. GHSA-6jcg-q3wp-x2f4 โ Nick Craig-Wood ๐ซถ
- sftp โ command injection via crafted filenames on PowerShell remotes ๐ญ like that's terrifying. it's fixed. GHSA-2m8m-jhrm-w6j2 ยท CVE-2026-71312 โ Nick Craig-Wood ๐ฅ
- vfs โ if a backend panicked on a background goroutine it took the entire process down with it. no more crashing ๐ GHSA-6jcg-q3wp-x2f4 โ Nick Craig-Wood โจ
- webdav
- HTTPS to HTTP redirects were leaking credentials ๐ GHSA-h4mf-4v27-hggj โ Nick Craig-Wood
- Tus: potential nil pointer crash, now unfucked ๐ GHSA-3x6r-wxxg-53vv โ Nick Craig-Wood
- bumped
google.golang.org/grpcto fix multiple security problems ๐ก๏ธ โ Nick Craig-Wood
- New Features โจ
buildโ all the dependencies got updated, fresh out the box ๐ โ Nick Craig-Woodconfig- new
config unsetcommand to remove options from a remote ๐ โ Nick Craig-Wood tieradded to the config wizard ๐ธ โ dougal
- new
docker serve- volume restore got a timeout so slow remotes don't block startup โณ โ Nick Craig-Wood
- volumes restore concurrently now, so one slow remote doesn't block all the others ๐ฆ โ Nick Craig-Wood
Createis idempotent so you don't get "volume already exists" after a restart ๐ โ Nick Craig-Wood
- doc fixes ๐ โ blackflytech, dougal, Giridhar, KTibow, mathieulongtin, Nick Craig-Wood, p1, Socialpranker, Sรธren Lindberg, yashanil98
filter- nested
{}alternates are supported in glob filters now ๐ โ maximilize - new
--files-from0to support NUL-delimited input ๐ โ Gaurav
- nested
fserrorsโ http2 "server sent GOAWAY" is a retriable error now ๐ โ phatlcfshttp--dump errorsdumps only the failed HTTP transactions ๐ต๏ธ โ Nick Craig-Wood--dump tracelogs connection level events via httptrace ๐ โ Nick Craig-Wood
gui- static files get served with gzip/deflate compression ๐๏ธ โ Leon Brocard
- an explicit
--rc-allow-origingets respected now instead of always deriving it from the bind address ๐ โ Kyue - embedded release updated to
1.1.11โจ โ Nick Craig-Wood
mount2โ new--allow-idmapto advertiseFUSE_ALLOW_IDMAP๐ โ Valerij Fredriksennfsmountโ callsmount_nfsdirectly on OpenBSD so-Tis accepted ๐ก โ Socialprankerrc- responds
202if theprefer-asyncheader is passed โก โ FTCHD - new
config/oauthstopandconfig/oauthstatusto control the oauth listener ๐๏ธ โ FTCHD - the OAuth authorization URL is included in the rc
config/oauthstatusresponse ๐ โ Hakan ฤฐSMAฤฐL - rc config and filter options can be set as flat parameters ๐ โ Hakan ฤฐSMAฤฐL
- responds
serve- custom http response headers supported ๐ โ kkocdko
- serve remote control accepts nested as well as flat options ๐ช โ Hakan ฤฐSMAฤฐL
serve dlnaโ SOAP request bodies are bounded now ๐ก๏ธ โ Acts1631serve nfs- NFS clients can mount subpaths of the served remote ๐๏ธ โ Nick Craig-Wood
- advertises
AUTH_UNIXso the *BSD NFS clients can mount ๐ก โ Socialpranker
serve s3โ multipart uploads stream to the backend instead of buffering in memory ๐ฐ โ Nick Craig-Woodserve sftp- implements
statvfs@openssh.comto report disk usage ๐พ โ Nick Craig-Wood - uses the requested atime when setting file times โฐ โ Nick Craig-Wood
- implements
serve webdavโ gzip compression for compressible responses ๐๏ธ โ Leon Brocardserve httpโ new--disable-dir-listflag ๐ซ โ Leon Brocard
- Bug Fixes ๐
archive/squashfsโ reading images with no fragment or xattr table works now ๐ โ maximilizechunkedreaderโ spurious errors when a parallel stream is closed early, gone ๐ โ Nick Craig-Woodconfigconfig_template_fileandconfig_templatewere getting ignored viaconfig/create, not anymore ๐ โ hexbinoct- normalization when obscuring passwords is fixed ๐ โ Nick Craig-Wood
docker serveโ plugin timeout on restart when volumes have active mounts, fixed โฑ๏ธ โ Nick Craig-Woodfsโ passwords and tokens were showing up in the debug log duringrclone config๐ญ no more โ Nick Craig-Woodguiโ cross-origin API requests when bound to a wildcard address, fixed ๐ โ FTCHDhashโxxh128hasher size fixed ๐ โ Yuhang Caologโ side effects when importing rclone as a library, fixed ๐งน โ Sven Rebhanmarch- no more unnecessarily listing the dst directory when the src listing finished ๐ถ โ Nick Craig-Wood
- goroutine leak on completed async rc jobs, fixed ๐งต โ Yash Anil
nfsmountโmount_nfsoptions incompatible with OpenBSD, fixed ๐ก โ Socialprankerrcoperations/statfor directories with large parent dirs, fixed ๐ โ Nick Craig-Wood_filterand_configparameters were being ignored bymount/*commands, fixed ๐๏ธ โ Hakan ฤฐSMAฤฐL
serveโ auth proxy was using stale config parameters when making a backend, fixed ๐ซถ โ Nick Craig-Woodserve s3- aborted multipart uploads were appearing as ghosts ๐ป fixed โ Nick Craig-Wood
- streamed multipart uploads weren't atomic, fixed ๐ โ Nick Craig-Wood
- OOM and
InvalidParterrors with concurrent multipart uploads, fixed ๐ฅ โ Nick Craig-Wood
syncโ--fix-caserename on backends that need upload before overwrite, fixed ๐ โ Nick Craig-Wood
- Mount ๐ป
- flat VFS and Mount options are supported in the mount RC command ๐ โ Hakan ฤฐSMAฤฐL
- VFS ๐ฆ
- IO error fixed by recreating the cache file if it's been removed ๐ฉน โ Nick Craig-Wood
- "invalid seek position" error when cache files are larger than the remote, fixed ๐ โ Nick Craig-Wood
- the vfs cache writeback timer wasn't stopping when
--transferswas reached, fixed โฒ๏ธ โ Nick Craig-Wood - crash when multiple mounts or servers share the same VFS, fixed ๐ โ Nick Craig-Wood
- Local ๐
- new
--local-fatal-if-no-spaceflag ๐พ โ ferrumclaudepilgrim - relative roots no longer get resolved to absolute paths ๐ โ Nick Craig-Wood
- new
- Archive ๐๏ธ
- squashfs listings failing with invalid argument after the update, fixed ๐ โ Nick Craig-Wood
- Azure Blob โ๏ธ
- MD5 was getting dropped on range reads, which made the vfs cache re-download everything โ fixed ๐พ โ Nick Craig-Wood
- new
use_arrow_listflag for experimental Apache Arrow listing ๐น โ Nick Craig-Wood - very large containers now list in parallel with
list_parallelism๐ โ Nick Craig-Wood
- Azurefiles โ๏ธ
- incorrect modtime after uploading a file or setting its modtime, fixed โฐ โ Nick Craig-Wood
- modtime precision went from
1sto100ns๐ฎ โ Nick Craig-Wood
- Combine ๐งฉ
- no more returning an error message as the remote name for a bad object ๐ซ โ Nick Craig-Wood
- Drime ๐
- stale
mux_statusfield removed fromItem๐งน โ Nick Craig-Wood
- stale
- Drive ๐๏ธ
- the config wizard now warns you before using the shared
client_idโ ๏ธ โ Nick Craig-Wood - shortcut loops get detected so no more infinite recursion ๐ โ Nick Craig-Wood
- the config wizard now warns you before using the shared
- Dropbox ๐ฆ
impersonate_adminsupported ๐ โ Gaurav- new
--dropbox-skip-shared-foldersand--dropbox-skip-unowned-folders๐ โ Gaurav Rmdiruses one less API call ๐ฏ โ Socialpranker- much less memory used when uploading small files ๐ โ Nick Craig-Wood
- an unnecessary API call removed when uploading small files โ๏ธ โ Nick Craig-Wood
- Filen ๐
- incorrect modtime after updating a file or setting its modtime, fixed โฐ โ Nick Craig-Wood
- Filescom ๐
- missing MD5 hash after uploading a file, fixed ๐ โ Nick Craig-Wood
- FTP ๐
- incorrect modtime after uploading a file or setting its modtime, fixed โฐ โ Nick Craig-Wood
- Googlephotos ๐ท
- the config wizard now warns before using the shared
client_idโ ๏ธ โ Nick Craig-Wood
- the config wizard now warns before using the shared
- Hasher #๏ธโฃ
Updatewasn't storing hashes in the bolt DB after a file replacement, fixed ๐พ โ Nick Craig-Wood
- Hdfs ๐
- incorrect modtime after uploading a file or setting its modtime, fixed โฐ โ Nick Craig-Wood
- Hidrive ๐
- incorrect modtime after setting a file's modtime, fixed โฐ โ Nick Craig-Wood
- HTTP ๐
- no more listing the parent directory when pointing at a single file ๐ฏ โ Nick Craig-Wood
Preferadded to the CORSAccess-Control-Allow-Headersheader ๐ โ sijie-Z
- Iclouddrive โ๏ธ
- "cannot unmarshal number" error when listing photo albums, fixed ๐ท โ Nick Craig-Wood
2FAwas failing with409even when the code was valid, fixed ๐ โ Punya Jain
- Imagekit ๐ผ๏ธ
Openwith aRangeOptionwas returning the wrong data, fixed ๐ โ Nick Craig-Woodmtimeadded to the available metadata โฐ โ Nick Craig-Wood
- Internxt ๐
- new
MoveandDirMovemethods for server-side file and directory operations ๐ โ jzunigax2 - file size limit errors during uploads are handled now ๐ฆ โ jzunigax2
- re-login error surfaces when re-auth fails in
NewFs๐ โ 0rangeSeaW0lf
- new
- Jottacloud ๐
- incorrect modtime after setting a file's modtime, fixed โฐ โ Nick Craig-Wood
- Linkbox ๐ค
- bot protection HTML challenge responses get retried instead of just failing ๐ โ Nick Craig-Wood
- Mailru ๐
- incorrect modtime after updating a file or setting its modtime, fixed โฐ โ Nick Craig-Wood
- Mega ๐ป
- files were reappearing in listings after being renamed, fixed ๐ โ Nick Craig-Wood
- moved files disappearing from listings between remotes, fixed ๐ โ Nick Craig-Wood
- Netstorage ๐
- missing MD5 hash after uploading a file, fixed ๐ โ Nick Craig-Wood
- Onedrive ๐
no admin modesupported ๐ โ TaterLi- non-2xx preauth downloads are treated as errors now ๐จ โ ifloppy
- malware-flagged files download via the Graph
Preferheader ๐ฆ โ ifloppy
- Opendrive ๐
- uploaded objects were returning the wrong hash and modtime, fixed ๐ โ Nick Craig-Wood
- Oracleobjectstorage ๐๏ธ
- crash when downloading objects with unknown length, fixed ๐ โ Nick Craig-Wood
- new
--oos-decompressflag to download gzip-encoded files ๐๏ธ โ Nick Craig-Wood
- Pixeldrain ๐
- incorrect modtime and missing hash after uploading a file, fixed ๐ โ Nick Craig-Wood
- Protondrive ๐
- proper retry logic implemented ๐ โ tomholford
gopenpgp: invalid data: user ID signature with wrong typeon custom-domain accounts, fixed ๐ โ Nick Craig-Wood- long hangs on permanent validation failures, fixed โณ โ Nick Craig-Wood
- incorrect modtime after uploading a file, fixed โฐ โ Nick Craig-Wood
- Putio
- Fix incorrect modtime after setting a file's modtime (Nick Craig-Wood) ๐ the classic "when did it even change" situation
- Fix sync deletions failing with
400 TRASH_LOCK_TIMEOUTerrors (Nick Craig-Wood) ๐๏ธ no more fighting the trash - Quatrix โจ
- Fix incorrect modtime after uploading a file (Nick Craig-Wood)
- S3 ๐ชฃ honestly the main character of backends
- Add Zero Services (ZERO-Z3) provider (Zero Services GmbH)
- Add Scality (RING / ARTESCA) provider (Dzmitry Nianakhau)
- Seafile ๐
- Fix
rclone syncfiles with identical size again and again (TowyTowy) โ bestie it was looping, it's fixed, we're calm
- Fix
- SFTP ๐
- Add
--sftp-pin-host-key- Trust On First Use host key pinning (Nick Craig-Wood) - Add
--sftp-encodingsupport (Puneet Dixit) - Don't retry permanent connection errors (Nick Craig-Wood)
- Allow silencing no hostkey validation warning (Noah Zalev)
- Fix cmd shell execution of paths containing variable-expansion or newline characters (Nick Craig-Wood)
- Add
- Shade ๐ธ
- Retry server errors instead of failing the transfer (Nick Craig-Wood)
- Fix uploads failing with
EOFwhen completing multipart uploads (Nick Craig-Wood)
- Smb ๐ง
- Fix Kerberos credentials being reloaded for every connection (Nick Craig-Wood)
- Fix TCP connection leak when connection setup fails (Nick Craig-Wood)
- Fix server-side move of directories with special characters in the name (Nick Craig-Wood)
- Fix spurious
Directory already existserrors when moving directories (Nick Craig-Wood)
- Ulozto ๐พ
- Fix server side moves between differently rooted remotes losing files (Nick Craig-Wood)
- WebDAV ๐
- Fix incorrect modtime after setting a file's modtime (Nick Craig-Wood)
- Yandex ๐
- Fix 500 errors by waiting for uploads to complete before setting modtime (Nick Craig-Wood)
- Fix missing MD5 hash after uploading a file (Nick Craig-Wood)
- Fix modtime randomly reverting to the upload time after upload (Nick Craig-Wood)
- Add
--yandex-upload-waitto fix 500 errors when uploading (Nick Craig-Wood)
- Zoho ๐
- Honour
Retry-Afterheader on429(Erol Ozcan) - Add
--zoho-tpslimitand--zoho-tpslimit-burst(Erol Ozcan) - Log throttling once per episode at NOTICE (Erol Ozcan)
- Rate limit repeated listings of the same folder (Erol Ozcan)
- Fix flaky folder list limiter test under concurrent listings (Nick Craig-Wood)
- Fix large file overwrite creating a duplicate instead of replacing (Erol Ozcan)
- Treat
R008unauthorized as directory not found (Erol Ozcan) - Preserve
root_folder_idon reconnect and allow setting it (Erol Ozcan)
- Honour
๐ v1.74.4 - 2026-07-08 ๐
See commits (https://github.com/rclone/rclone/compare/v1.74.3...v1.74.4)
- Bug Fixes ๐
- accounting
- Fix goroutine leak in
ResetCounters(Nick Craig-Wood) - Fix goroutine leak in
NewStatsGroupfor zero-transfer rc jobs (Sanjays2402)
- Fix goroutine leak in
- archive extract: Fix path traversal letting archives escape the destination
CVE-2026-59732(Nick Craig-Wood) ๐ not the archive pulling a sneaky on us - build ๐๏ธ
- Fix multiple CVEs by upgrading to
go1.26.5(Nick Craig-Wood)CVE-2026-39822:os: Root escape via symlink plus trailing slashCVE-2026-42505:crypto/tls: Encrypted Client Hello privacy leak
- Update
golang.org/x/imagetov0.43.0to fix image decoding vulnerabilities (Nick Craig-Wood)CVE-2026-46604: panic decoding a TIFF image with an out-of-bounds strip offsetCVE-2026-46602: unbounded memory use from lack of a limit on TIFF tile sizesCVE-2026-46601: panic on a WEBP VP8 alpha channel size mismatchCVE-2026-33813: panic decoding a large WEBP image on 32-bit platforms
- Fix multiple CVEs by upgrading to
- cmd/mount2 โฐ๏ธ
- Fix NFS file creation by implementing
Mknod(Sandy Luppino) - Fix
ESTALEover NFS by reporting stable inode numbers (Sandy Luppino) - Fix NFS directory listings by supporting non-zero
Seekdiroffsets (Sandy Luppino)
- Fix NFS file creation by implementing
- completion: Fix powershell completion corrupting non-ASCII names (Yash Anil)
- doc fixes (Bryan Stenson, Castronaut, Filippo, Gaurav, happysnaker, Jan-Philipp Reรler, Nick Craig-Wood, user77) ๐ ty all fr
- filter: Fix
--files-fromcopy stopping at the first unreadable file (Nick Craig-Wood) - fs
- Fix command line flag being ignored when set to its default value (Nick Craig-Wood)
- Fix negative offset when a suffix Range request exceeds object size (Amit Mishra)
- gui: Update embedded release to
1.1.10(Nick Craig-Wood) - ncdu: Fix duplicated keystrokes on Windows by pinning
tcelltov2.9.0(Nick Craig-Wood) - serve restic: Fix
--private-reposisolation bypassCVE-2026-59733(Nick Craig-Wood) ๐ฅ big deal, pls update - serve s3
- Fix spurious
404onHEAD/GETduring VFS writeback (max) - Fix path traversal letting clients see files in the root
GHSA-8v25-v8p6-qf7v(Nick Craig-Wood)
- Fix spurious
- serve webdav: Fix
MOVEoverwrite failing withoutOverwriteheader (Sanjay Santhanam) - serve/http: Fix
--disable-zipso it works over rc (Nick Craig-Wood)
- accounting
- VFS ๐๏ธ
- Fix hang reopening a file during the handle-caching grace period (Nick Craig-Wood)
- Local ๐
- Stop
--linkssymlinks escaping the destination directoryCVE-2026-54572(Nick Craig-Wood) - Don't restore setuid/setgid/sticky bits from metadata by default
GHSA-945v-v9p3-v5xw(Nick Craig-Wood)
- Stop
- Drive ๐
- Warn when non-exportable Google documents are skipped (Nick Craig-Wood)
- Fix stray
%!(EXTRA)in unexportable google document log message (Nick Craig-Wood) - Warn when using rclone's shared
client_id(Nick Craig-Wood)
- Filelu
- Fix recursive listing path handling and file filtering (kingston125)
- Googlephotos ๐ธ
- Warn when using rclone's shared
client_id(Nick Craig-Wood)
- Warn when using rclone's shared
- Mega โ๏ธ
- Wait for server events after upload, delete and move (Nick Craig-Wood)
- Fix hard deleted files reappearing in listings (Nick Craig-Wood)
- S3 ๐ชฃ
- Remove session token on cross-host redirects (IceLocke)
- Strip STS security token on same-host HTTPS->HTTP redirect
GHSA-cf44-9pgv-m4xc(Nick Craig-Wood) - Fix error mapping in
GetObjectto matchHeadObject(lewoberst) - Correct documented
copy_cutoffminimum to1byte (max) - Fix mounting a prefix failing with
403whenHEADis not permitted (Nick Craig-Wood)
- Smb ๐ง
- Fix for IBM iSeries and signature verification (dithwick)
- WebDAV ๐
- Fix mixed property statuses in multi-status responses (nako-ruru)
๐ v1.74.3 - 2026-06-05 ๐
See commits (https://github.com/rclone/rclone/compare/v1.74.2...v1.74.3)
- Bug Fixes ๐
- rc
- Fix unauthenticated command execution via
--rc-serveinline remotesCVE-2026-49980(Nick Craig-Wood) ๐ญ yeah this one was serious, go update - Stop
global.*connection string options changing configCVE-2026-49980(Nick Craig-Wood)
- Fix unauthenticated command execution via
- build: Fix multiple CVEs by upgrading to
go1.26.4(Nick Craig-Wood)CVE-2026-42504:mime: quadratic complexity inWordDecoder.DecodeHeaderCVE-2026-42507:net/textproto: arbitrary input are included in errors without any escapingCVE-2026-27145:crypto/x509: split candidate hostname only once
- log: Fix wrong source
file:linein JSON logs from release builds (Nick Craig-Wood) - mount2: Fix empty directory listings on re-read (Janne Beate Bakeng)
- serve s3: Fix multipart
ListPartspagination returning wrong part numbers (Nick Craig-Wood) - serve sftp
- Fix file corruption when a client resumes an upload (Nick Craig-Wood)
- Fix truncate request being silently ignored (Nick Craig-Wood)
- rc
- Local ๐
- Fix
getXattrreturning empty map instead of nil (Leon Brocard)
- Fix
- Drime
- Fix server-side copy and move failing with Cloudflare
520error (Nick Craig-Wood) - Fix files being uploaded to the wrong directory (Nick Craig-Wood)
- Remove duplicate
upload_cutoffconfig option (Nick Craig-Wood) - Fix directory rename leaving the renamed folder empty in VFS (Nick Craig-Wood)
- Fix server-side copy and move failing with Cloudflare
- Drive ๐
- Fix server-side move failing on shared drives with duplicate dirs (Nick Craig-Wood)
- Iclouddrive ๐
- Fix ADP/PCS cookie acquisition for iCloud Drive (Yakov Till)
- Fix
Index has invalid dataerror listing iCloud Photos (Nick Craig-Wood)
๐ฆ v1.74.2 - 2026-05-22 ๐ฆ
See commits (https://github.com/rclone/rclone/compare/v1.74.1...v1.74.2)
- Bug Fixes ๐
- build
- Update
golang.org/x/nettov0.55.0to address:CVE-2026-42506:html: incorrect handling of namespaced elements in foreign contentCVE-2026-39821:idna: failure to reject ASCII-only Punycode-encoded labelsCVE-2026-42502:html: incorrect handling of HTML elements in foreign contentCVE-2026-25680:html: denial of service when parsing arbitrary HTMLCVE-2026-25681:html: incorrect handling of character references in DOCTYPE nodesCVE-2026-27136:html: duplicate attributes can cause XSS
- Update
golang.org/x/cryptotov0.52.0to address:CVE-2026-46598:ssh/agent: pathological inputs can lead to client panicCVE-2026-46597:ssh: byte arithmetic causes underflow and panicCVE-2026-39828:ssh: bypass of certificate restrictionsCVE-2026-39835:ssh: server panic duringCheckHostKey/AuthenticateCVE-2026-39833:ssh/agent: key constraints not enforcedCVE-2026-39832:ssh/agent: agent constraints dropped when forwarding keysCVE-2026-39827:ssh: memory leak when rejecting channels can lead to DoSCVE-2026-39830:ssh: client can cause server deadlock on unexpected responsesCVE-2026-39829:ssh: pathological RSA/DSA parameters may cause DoSCVE-2026-39831:ssh: bypass of FIDO/U2F security keys physical interactionCVE-2026-39834:ssh: infinite loop on large channel writesCVE-2026-42508:ssh/knownhosts: auth bypass via unenforced@revokedstatusCVE-2026-46595:ssh:VerifiedPublicKeyCallbackpermissions skip enforcement
- Update
golang.org/x/imagetov0.41.0to address:
- Update
- build
CVE-2026-42500โ bestie. ๐bmpwas straight up panicking when it read a palette index that was out of bounds. Fixed.CVE-2026-33809โtiffwas out here eating WAY too many resources in PackBits decompression, the resource consumption was excessive ๐ญgolang.org/x/sysbumped tov0.45.0to take care of:CVE-2026-39824โwindows: integer overflow inNewNTUnicodeString๐ชโจ
github.com/go-git/go-billy/v5โ5.9.0โ this is the one that fixesCVE-2026-44740๐bisyncโ fixed the--conflict-loserpathname when you're running--conflict-resolve newer(nielash)guiโ embedded release updated to1.1.8(Nick Craig-Wood) ๐lib/httpโ said bye to the deprecatedh2c.NewHandler, hellohttp.Server.Protocols(Nick Craig-Wood)rcโ removed the duplicatemetrics_addroption registration (Nick Craig-Wood) ๐vfs/vfscacheโ fixed the silent write failure when mounting withremote:.(Lucky945H) โ silent failures are NOT it- doc fixes (FTCHD, Iizuki, Leon Brocard, Nick Craig-Wood) ๐
- Drime ๐
- Fixed the
file doesn't existserror that popped off when you tried to delete (John Volk) - Fixed the
500errors when listing shared folders (Alvinwylim)
- Fixed the
- Jottacloud ๐
- Support for the whitelabel service Phonero Sky (Tore Anderson)
- Protondrive ๐
- Fixed
corrupted on transfer: sha1 hashes differ(William Tange)
- Fixed
- S3 โ๏ธ
- Added the new MEGA S4 endpoints on
megas4.com, Asia-Pacific region included (Nick Craig-Wood)
- Added the new MEGA S4 endpoints on
- WebDAV ๐
- Honour
auth_redirecton listAllPROPFIND(Sai Asish Y)
- Honour
๐ฆ v1.74.1 โ 2026-05-08
See commits: https://github.com/rclone/rclone/compare/v1.74.0...v1.74.1
๐ Bug Fixes
bisyncโ fixed the "retryable without--resync" error message for when--resynchas a critical failure (Gustavo V. F.)build- Fix multiple CVEs by upgrading to
go1.26.3(Nick Craig-Wood)CVE-2026-42501:cmd/go: malicious module proxy can bypass checksum databaseCVE-2026-39825:net/http/httputil: ReverseProxy forwards queries with more thanurlmaxqueryparamsparametersCVE-2026-39836:net: panic in Dial and LookupPort when handling NUL byte on WindowsCVE-2026-42499:net/mail: quadratic string concatenation in consumePhraseCVE-2026-39820:net/mail: quadratic string concatentation in consumeCommentCVE-2026-39819:cmd/go: "go bug" follows symlinks in predictable temporary filenamesCVE-2026-39817:cmd/go: "go tool pack" does not sanitize output pathsCVE-2026-33814:net/http: infinite loop in HTTP/2 transport when given bad SETTINGS_MAX_FRAME_SIZECVE-2026-39826:html/template: escaper bypass leads to XSSCVE-2026-33811:net: crash when handling long CNAME responseCVE-2026-39823:html/template: bypass of meta content URL escaping causes XSS
- Updated
golang.org/x/nettov0.53.0to fixCVE-2026-33814(Nick Craig-Wood)
- Fix multiple CVEs by upgrading to
cmd/serve/s3โ object listings now come back in key order (Leon Brocard) ๐ฅ- Cloudinary ๐ธ
- Fixed it retrying every single error, and fixed the pacer sleep units (Nick Craig-Wood)
- Drime ๐
- Fixed large file uploads landing in the drive root instead of the folder you actually configured (Nick Craig-Wood)
- Fixed uploads of
100..200Mfiles (Nick Craig-Wood)
- Protondrive ๐
- HTTP now routes through rclone's transport (Nick Craig-Wood)
- Library logging now routes through rclone's logger (Nick Craig-Wood)
- Fixed a segfault when copying files that were missing revision metadata (Nick Craig-Wood)
- S3 โ๏ธ
- Fixed the STS call happening per request by caching AssumeRole credentials (Nick Craig-Wood)
- Added new Fastly Object Storage regions (Leon Brocard)
๐ v1.74.0 โ 2026-05-01
See commits: https://github.com/rclone/rclone/compare/v1.73.0...v1.74.0
- New backends โจ
- Huawei Drive โ
https://rclone.org/huaweidrive/(็ไธ่ตซ) - iCloud Photos โ
https://rclone.org/iclouddrive/#icloud-photos(read only) (Yakov Till) - New S3 providers
- Fastly Object Storage โ
https://rclone.org/s3/#fastly(Leon Brocard) - HCP โ
https://rclone.org/s3/#hcp(Chris) - Impossible Cloud โ
https://rclone.org/s3/#impossible-cloud(Nick Craig-Wood) - UCloud US3 โ
https://rclone.org/s3/#us3(jinkeyuu) - Zadara โ
https://rclone.org/s3/#zadara(Shlomi Avihou)
- Fastly Object Storage โ
- Huawei Drive โ
- New commands ๐
guiโhttps://rclone.org/gui/: launches the new embedded web based GUI for basic rclone operations (FTCHD, Nick Craig-Wood)
- New Features ๐
build- Updated
golang.org/x/image/webptov0.39.0to fixCVE-2026-33813(Nick Craig-Wood) - Bumped
github.com/Azure/go-ntlmsspto0.1.1to fixCVE-2026-32952(dependabot[bot]) - Updated to
go1.26and madego1.25the minimum required version (Nick Craig-Wood) - Updated all dependencies (Nick Craig-Wood)
- Modernized the Go code with
go fixforgo1.25(Nick Craig-Wood) - Fixed the
loong64ands390xbuild (Suyun)
- Updated
docs๐- Modernized the rclone.org site design (Nick Craig-Wood)
- fixes (albertony, Enduriel, Jason, Luke Cyca, mathieulongtin, Nick Craig-Wood, SyoBoN)
fshttpโ added--dump curlfor dumping HTTP requests as curl commands (Nick Craig-Wood)graphicsโ images optimised losslessly with ImageOptim (Leon Brocard)listremotesโ added the--exactflag for filtering (Anton Bordwine)rc- Flipped the auth default so all endpoints require auth unless you opt out (Nick Craig-Wood)
- Added
core/disksto enumerate attached disks (Nick Craig-Wood) - Added the
deletedDirsstat to thecore/statshelp output (Billy Hughes)
serve http- Added fallback embedded favicon (Leon Brocard)
- Added gzip compression for text responses (Leon Brocard)
- Dark mode for the file browser (FTCHD)
- Added HTTP/2 cleartext support for all http servers (TheBabu)
touchโ adds metadata when you use--metadata-set(Prakhar Chhalotre)
- Bug Fixes ๐
accounting- Updated the
Stringmethod output format for clarity in transfer rate representation (Prakhar Chhalotre) - Fixed
rcat/copyurlforfiles.com(Nick Craig-Wood)
- Updated the
bisync- Added the missing rc params (nielash)
- Added more structured info to the rc output (nielash)
- Auto-generated the rc help docs (nielash)
- Fixed handling of unreadable lockfiles (lif)
- Fixed the flaky
TestBisyncConcurrentby increasing random name entropy (Nick Craig-Wood) - Fixed the integration tests after the sftp log changes (Nick Craig-Wood)
copyurlโ fixed the ignored--upload-headersand--download-headers(Andriy Senyshyn)librclone/ctestโ added Windows support and fixed memory management (BizaNator)logโ fixed the data race on theOutputHandler.formatfield (Nick Craig-Wood)operations- Multithread copy: grab memory before making the go routines (Nick Craig-Wood)
serve dlnaโ fixed Samsung TV compatibility (Nick Craig-Wood)serve nfsโ fixed the EOF flag in the READ response not being set when the read reaches the end of file (Nick Craig-Wood)
- Mount ๐ป
rcโ fixed mounts created withmountPoint"*"overwriting each other (Nick Craig-Wood)
- VFS ๐ฆ
- Fixed slow nfs serve by adding
--vfs-handle-caching(Nick Craig-Wood) - Added a context parameter to
New()for config propagation (Nick Craig-Wood) - Replaced
context.TODO/Backgroundwith the stored VFS context (Nick Craig-Wood)
- Fixed slow nfs serve by adding
- Local ๐ป
- Removed the
fadvisecalls that cause spinlock contention (Patrick Farrell)
- Removed the
- Azure Blob ๐
- Added
--azureblob-copy-total-concurrencyto limit total multipart copy concurrency (Duncan F) - Added server side copy real time accounting (Nick Craig-Wood)
- Added the
--azureblob-decompressflag to download gzip-encoded files (Nick Craig-Wood)
- Added
- Azurefiles ๐
- Fixed the missing
x-ms-file-request-intentheader with OAuth (Nick Craig-Wood)
- Fixed the missing
- B2 ๐ง
- Added server side copy real time accounting (Nick Craig-Wood)
- Drime ๐
- Implemented
About(Cohinem) - Fixed listings of large directories (John Volk)
- Implemented
- Drive ๐
- Added an integration test for handling folder names with single quotes (Prakhar Chhalotre)
- Filelu ๐ธ
- Added the multipart init response type (kingston125)
- Migrated API calls to
lib/rest(kingston125)
- Filen ๐
- Made multi-threaded upload chunks individually retryable (Enduriel)
- Iclouddrive โ๏ธ
- Replaced plaintext signin with SRP authentication (Mike GIllan)
- Use a dynamic origin for SRP auth headers (Xiangzhe)
- Lowercased the Apple ID for SRP authentication (Mike GIllan)
- Added read only iCloud Photos support and SRP authentication (Yakov Till)
- Internxt ๐
- Implemented multi-part uploads (Josรฉ Zรบniga)
- Jottacloud ๐
- Added encoding of the percent character to the default backend encoding (albertony)
- Linkbox ๐
- Fixed downloading files by using the web API (Nick Craig-Wood)
- Mega ๐ซถ
- Fixed the crash when logging in with previous auth keys fails (Andrew Gunnerson)
- Pcloud โ๏ธ
- Fixed recursive listing from the root (Nick Craig-Wood)
- Pikpak โญ
- Support custom filenames for the
addurlbackend command (wiserain)
- Support custom filenames for the
- Protondrive ๐
- Aligned the backend with the newer Proton SDK stack (tdawe)
- Updated to the latest
go-proton-apito use the new host (dlaumen) - Fixed server-side
movetoandDirMoveagainst the current API (Nick Craig-Wood)
- S3 โ๏ธ๐
- Added the Fastly Object Storage provider (Leon Brocard)
- Added the HCP provider and the
list_versions_oldest_firstquirk (Chris) - Added Impossible Cloud as a new S3 provider (Nick Craig-Wood)
- Added the UCloud Object Storage provider (
#9230) (jinkeyuu) - Added the Zadara Object Storage provider (Shlomi Avihou)
- Removed the StackPath Object Storage provider (Leon Brocard)
- Added server side copy real time accounting (Nick Craig-Wood)
- Added OVHcloud storage classes (Bjoern Franke)
- Added Object Lock support (Chris)
- Added new Fastly Object Storage regions (Leon Brocard)
- Scaleway:
ONEZONE_IAis available in all zones,GLACIERonly inFR-PAR(Bjoern Franke) - Ionos: updated regions & endpoints (hxnd)
- IBM COS: provide
ibm_iam_endpointas a configurable param for IBM IAM-based auth (Bhagyashreek8) - Fixed
Content-MD5for Object Lock uploads and added the GCS quirk (Chris) - Fixed the regression where
PutObjectfails with non-seekable readers (Chris)
- Fix the
--s3-versionsflag getting ignored bycleanup-hiddenwhenGetBucketVersioningfails (Chris) ๐ - Fix bucket creation failing on Ceph/radosgw (Jan Heylen)
๐ธ SFTP
- Warn the user if no host key validation is configured (Nick Craig-Wood) โ it will literally pop off about it
๐ธ WebDAV
- Permit redirects on
PROPFINDfor metadata (Brian Bockelman) - Request only the properties we actually need in
listAllso it's way faster (ZRHan) - Optimize performance by using
Depth=0for metadata requests (ZRHan) โ speed, slay
โจ v1.73.5 - 2026-04-19 โจ
See commits โ https://github.com/rclone/rclone/compare/v1.73.4...v1.73.5
- Bug Fixes
- operations: Add
AuthRequiredtooperations/fsinfoto prevent backend creationCVE-2026-41179(Nick Craig-Wood) ๐ฅ - rc
- Add
AuthRequiredtooptions/setto prevent auth bypassCVE-2026-41176(Nick Craig-Wood) - Snapshot
NoAuthat startup to prevent runtime auth bypassCVE-2026-41176(Nick Craig-Wood)
- Add
- filter: Fix debug logs that fire before the logger is configured (Nick Craig-Wood)
- operations: Add
- Azureblob
- Add Microsoft Partner Network User-Agent prefix (Nick Craig-Wood)
- Drime
- Fix
User.EntryPermissionsJSON unmarshalling (a1pcm)
- Fix
- Iclouddrive
- Fix 'directory not found' error when the directory contains accent marks (Brais Couce)
- S3
- Fix TencentCOS CDN endpoint failing on bucket check (Mozi)
- Fix empty delimiter parameter rejected by Archiware P5 server (Nick Craig-Wood)
๐ v1.73.4 - 2026-04-08 ๐
See commits โ https://github.com/rclone/rclone/compare/v1.73.3...v1.73.4
- Bug Fixes
- build
- Update to go 1.25.9 to fix multiple CVEs (Nick Craig-Wood)
CVE-2026-32282: os: Root.Chmod can follow symlinks out of the root on LinuxCVE-2026-32289: html/template: JS template literal context incorrectly trackedCVE-2026-33810: crypto/x509: excluded DNS constraints not properly applied to wildcard domainsCVE-2026-27144: cmd/compile: no-op interface conversion bypasses overlap checkingCVE-2026-27143: cmd/compile: possible memory corruption after bound check eliminationCVE-2026-32288: archive/tar: unbounded allocation when parsing old format GNU sparse mapCVE-2026-32283: crypto/tls: multiple key update handshake messages can cause connection to deadlockCVE-2026-27140: cmd/go: trust layer bypass when using cgo and SWIGCVE-2026-32280: crypto/x509: unexpected work during chain buildingCVE-2026-32281: crypto/x509: inefficient policy validation
- Fix Denial of Service due to Panic in AWS SDK for Go v2 SDK EventStream Decoder (dependabot[bot])
- Update
golang.org/x/imageto 0.38.0 to fixCVE-2026-33809(dependabot[bot])
- Update to go 1.25.9 to fix multiple CVEs (Nick Craig-Wood)
- docs
- Fix header level for metadata option (Clรฉment Notin)
- Fix markdown issues in mount docs (albertony)
- Fix link to not be language specific (Ross Smith II)
- Note macOS 10.15 (Catalina) support with version v1.70.3 (kapitainsky)
- build
- Filen
- Update SDK version (Enduriel)
๐ v1.73.3 - 2026-03-23 ๐
See commits โ https://github.com/rclone/rclone/compare/v1.73.2...v1.73.3
- Bug Fixes
- build
- Update to
google.golang.org/grpc1.79.3 to fixCVE-2026-33186(dependabot[bot]) - Update to
github.com/buger/jsonparser1.1.2 to fixGHSA-6g7g-w4f8-9c9x(dependabot[bot])
- Update to
- doc fixes
- Added text to the label showing version-introduced info (Jan-Philipp Reรler)
- Clarify Filen password change requires updating both password and API key in
rclone config(Jason) - s3: clarify multi tenant support for Cubbit (Marco Ferretti)
- jottacloud: Fix broken link (albertony)
- lib/rest: Fix
URLPathEscapeAllbreaking WebDAV servers (eg nzbdav) with strict path matching (Andrew Furman) - list: Fix nil pointer panic in
Sorterwhen temp file creation fails (Nick Craig-Wood) ๐ญ
- build
๐ฆ v1.73.2 - 2026-03-06 ๐ฆ
See commits โ https://github.com/rclone/rclone/compare/v1.73.1...v1.73.2
- Bug Fixes
- build
- Update to go 1.25.8 to fix
CVE-2026-27137CVE-2026-27138CVE-2026-25679CVE-2026-27142(Nick Craig-Wood) - Update
github.com/cloudflare/circlto v1.6.3 to fixCVE-2026-1229(Nick Craig-Wood) - Update to
golang.org/x/netv0.51.0 to fixCVE-2026-27141(Nick Craig-Wood)
- Update to go 1.25.8 to fix
- docs fixes:
- bisync: Add group Sync to the bisync command (Jan-Philipp Reรler)
- Note that
--use-server-modtimeonly works on some backends (Nick Craig-Wood) - Document unsupported S3 object keys with double slashes (Adam Kasztenny)
- Fix headers hierarchy for
mount.md(Dark Dragon) - Fix new drive flag typo in changelog (razorloves)
- build
- Archive
- Extract: fix extraction with
"./"prefix from tar entry paths (Varun Chawla)
- Extract: fix extraction with
- Drime
- Fix chunk-uploaded files ignoring workspace ID (a1pcm)
- Internxt
- Fix
Entry doesn't belong in directoryerrors on windows (jzunigax2)
- Fix
- WebDAV
- Escape reserved characters in URL path segments (Varun Chawla)
- Add missing headers for CORS (Romฤns Potaลกovs)
๐ v1.73.1 - 2026-02-17 ๐
See commits โ https://github.com/rclone/rclone/compare/v1.73.0...v1.73.1
- Bug Fixes
- accounting: Fix missing server side stats from
core/statsrc (Nick Craig-Wood) - build
- Fix
CVE-2025-68121by updating go to 1.25.7 or later (Nick Craig-Wood) - Bump
github.com/go-chi/chi/v5from 5.2.3 to 5.2.5 to fixGO-2026-4316(albertony)
- Fix
- docs: Extend copyurl docs with an example of CSV
FILENAMEsstarting with a path. (Jack Kelly) - march: Fix runtime: program exceeds 10000-thread limit (Nick Craig-Wood)
- pacer
- Fix deadlock between pacer token and
--max-connections(Nick Craig-Wood) - Re-read the sleep time as it may be stale (Nick Craig-Wood)
- Fix deadlock between pacer token and
- accounting: Fix missing server side stats from
- Drime
- Fix files and directories being created in the default workspace (Nick Craig-Wood)
- Filelu
- Avoid buffering entire file in memory (kingston125)
- Add multipart upload support with configurable cutoff (kingston125)
- Filen
- Fix 32 bit targets not being able to list directories (Enduriel)
- Fix potential panic in case of error during upload (Enduriel)
- Internxt
- Implement re-login under refresh logic, improve retry logic (Josรฉ Zรบniga) -S3
- Set
list_versionto 2 for FileLu S3 configuration (kingston125)
๐ v1.73.0 - 2026-01-30 ๐
See commits โ https://github.com/rclone/rclone/compare/v1.72.0...v1.73.0
- New backends
- Shade โ
https://rclone.org/shade/(jhasse-shade) - Drime โ
https://rclone.org/drime/(dougal) - Filen โ
https://rclone.org/filen/(Enduriel) - Internxt โ
https://rclone.org/internxt/(jzunigax2) - New S3 providers
- Bizfly Cloud Simple Storage โ
https://rclone.org/s3/#bizflycloud(vupn0712)
- Bizfly Cloud Simple Storage โ
- Shade โ
- New Features
- docs: Add Support Tiers โ
https://rclone.org/tiers/to the documentation (Nick Craig-Wood) - rc: Add
operations/hashsumfileโhttps://rclone.org/rc/#operations-hashsumfileto sum a single file only (Nick Craig-Wood) - serve webdav: Implement download directory as Zip (Leo)
- docs: Add Support Tiers โ
- Bug Fixes
- fs: fix bwlimit: correct reporting (Mikel Olasagasti Uranga)
- log: fix systemd adding extra newline (dougal)
- docs: fixes (albertony, darkdragon-001, Duncan Smart, hyusap, Marc-Philip, Nick Craig-Wood, vicerace, vyv03354, yuval-cloudinary, yy)
- serve s3: Make errors in
--s3-auth-keyfatal (Nick Craig-Wood)
- Mount
- Fix OpenBSD mount support. (Nick Owens)
- Azure Blob
- Add metadata and tags support across upload and copy paths (Cliff Frey)
- Factor the common auth into a library (Nick Craig-Wood)
- Azurefiles
- Factor the common auth into a library (Nick Craig-Wood)
- B2
- Support authentication with new bucket restricted application keys (DianaNites)
- Drive
- Add
--drive-metadata-enforce-expansive-accessflag (Nick Craig-Wood) - Fix crash when trying to creating shortcut to a Google doc (Nick Craig-Wood)
- Add
- FTP
- Add http proxy authentication support (Nicolas Dessart)
- Mega
- Reverts TLS workaround (necaran)
- Memory
- Add
--memory-discardflag for speed testing (Nick Craig-Wood)
- Add
- OneDrive
- Fix cancelling multipart upload (Nick Craig-Wood)
- Fix setting modification time on directories for OneDrive Personal (Nick Craig-Wood)
- Fix OneDrive Personal no longer supports description (Nick Craig-Wood)
- Fix require sign in for OneDrive Personal (Nick Craig-Wood)
- Fix permissions on OneDrive Personal (Nick Craig-Wood)
- Oracle Object Storage
- Eliminate unnecessary heap allocation (Qingwei Li)
- Pcloud
- Add support for ChangeNotify to enable real-time updates in mount (masrlinu)
- Protondrive
- Update to use forks of upstream modules to unblock development (Nick Craig-Wood)
- S3
- Add ability to specify an IAM role for cross-account interaction (Vladislav Tropnikov)
- Linode: updated endpoints to use ISO 3166-1 alpha-2 standard (jbagwell-akamai)
- Fix Copy ignoring storage class (vupn0712)
- SFTP
- Add http proxy authentication support (Nicolas Dessart)
- Eliminate unnecessary heap allocation (Qingwei Li)
๐ง v1.72.1 - 2025-12-10 ๐ง
See commits โ https://github.com/rclone/rclone/compare/v1.72.0...v1.72.1
- Bug Fixes
- build: update to go1.25.5 to fix
CVE-2025-61729โhttps://pkg.go.dev/vuln/GO-2025-4155 - doc fixes (Duncan Smart, Nick Craig-Wood)
- configfile: Fix piped config support (Jonas Tingeborn)
- log
- Fix PID not included in JSON log output (Tingsong Xu)
- Fix backtrace not going to the
--log-file(Nick Craig-Wood)
- build: update to go1.25.5 to fix
- Google Cloud Storage
- Improve endpoint parameter docs (Johannes Rothe)
- S3
- Add missing regions for Selectel provider (Nick Craig-Wood)
๐ v1.72.0 - 2025-11-21 ๐
See commits โ https://github.com/rclone/rclone/compare/v1.71.0...v1.72.0
- New backends
- Archive backend to read archives on cloud storage. (Nick Craig-Wood)
- New S3 providers ๐
- Cubbit Object Storage (https://rclone.org/s3/#Cubbit) (Marco Ferretti)
- FileLu S5 Object Storage (https://rclone.org/s3/#filelu-s5) (kingston125)
- Hetzner Object Storage (https://rclone.org/s3/#hetzner) (spiffytech)
- Intercolo Object Storage (https://rclone.org/s3/#intercolo) (Robin Rolf)
- Rabata S3-compatible secure cloud storage (https://rclone.org/s3/#Rabata) (dougal)
- Servercore Object Storage (https://rclone.org/s3/#servercore) (dougal)
- SpectraLogic (https://rclone.org/s3/#spectralogic) (dougal)
- New commands โจ
rclone archive(https://rclone.org/commands/rclone_archive/): the command that makes archive files AND reads them back, like a lil two-for-one (Fawzib Rojas)rclone config string(https://rclone.org/commands/rclone_config_string/): for making connection strings, bestie (Nick Craig-Wood)rclone test speed(https://rclone.org/commands/rclone_test_speed/): a whole new command to test how fast a specified remote actually is (dougal)
- New Features ๐
- backends: a whole bunch of backends got a paged listing (
ListP) interface added- this is giving progress bars while listing huge directories AND lower memory usage, we love to see it ๐ซถ
- build
- Bump
golang.org/x/cryptofrom0.43.0to0.45.0to fixCVE-2025-58181(dependabot[bot]) - Modernize code and tests (Nick Craig-Wood, russcoss, juejinyuxitu, reddaisyy, dulanting, Oleksandr Redko)
- Update all dependencies (Nick Craig-Wood)
- Enable support for
aix/ppc64(Lakshmi-Surekha)
- Bump
check: Improved reporting of differences in sizes and contents (albertony)copyurl: Added--urlto read URLs from a CSV file (S-Pegg1, dougal)- docs:
- markdown linting (albertony)
- fixes (albertony, Andrew Gunnerson, anon-pradip, Claudius Ellsel, dougal, iTrooz, Jean-Christophe Cura, Joseph Brownlee, kapitainsky, Matt LaPaglia, n4n5, Nick Craig-Wood, nielash, SublimePeace, Ted Robertson, vastonus)
fs: remove unnecessarySeekcall on log file (Aneesh Agrawal)hashsum: Improved output format when listing algorithms (albertony)lib/http: Cleanup indentation and other whitespace in the http serve template (albertony)lsf: Add support forunixandunixnanotime formats (Motte)oauthutil: Improved debug logs from token refresh (albertony)rc- Add
job/batch(https://rclone.org/rc/#job-batch) for sending batches of rc commands to run concurrently (Nick Craig-Wood) - Add
runningIdsandfinishedIdstojob/list(https://rclone.org/rc/#job-list) (n4n5) - Add
osVersion,osKernelandosArchtocore/version(https://rclone.org/rc/#core-version) (Nick Craig-Wood) - Make sure fatal errors run via the rc don't crash rclone (Nick Craig-Wood)
- Add
executeIdto job statuses injob/list(https://rclone.org/rc/#job-list) (Nikolay Kiryanov) config/unlock: rename parameter toconfigPassword, accept old as well (Nick Craig-Wood)
- Add
serve http: Download folders as zip (dougal)
- backends: a whole bunch of backends got a paged listing (
- Bug Fixes ๐
- build
- Fix
tls: failed to verify certificate: x509: negative serial number(Nick Craig-Wood)
- Fix
march- Fix
--no-traversebeing very slow (Nick Craig-Wood)
- Fix
serve s3: Fix log output to remove theEXTRAmessages (iTrooz)
- build
- Mount
- Windows: improve error message on missing WinFSP (divinity76)
- Local
- Add
--skip-specialsto ignore special files (Adam Dinwoodie)
- Add
- Azure Blob
- Add
ListPinterface (dougal)
- Add
- Azurefiles
- Add
ListPinterface (Nick Craig-Wood)
- Add
- B2
- Add
ListPinterface (dougal) - Add Server-Side encryption support (fries1234)
- Fix
"expected a FileSseMode but found: ''"(dougal) - Allow individual old versions to be deleted with
--b2-versions(dougal)
- Add
- Box
- Add
ListPinterface (Nick Craig-Wood) - Allow configuration with config file contents (Dominik Sander)
- Add
- Compress
- Add zstd compression (Alex)
- Drive
- Add
ListPinterface (Nick Craig-Wood)
- Add
- Dropbox
- Add
ListPinterface (Nick Craig-Wood) - Fix error moving just created objects (Nick Craig-Wood)
- Add
- FTP
- Fix SOCKS proxy support (dougal)
- Fix transfers from servers that return
250 okmessages (jijamik)
- Google Cloud Storage
- Add
ListPinterface (dougal) - Fix
--gcs-storage-classto work with server side copy for objects (Riaz Arbi)
- Add
- HTTP
- Add basic metadata and provide it via serve (Oleg Kunitsyn)
- Jottacloud
- Add support for Let's Go Cloud (from MediaMarkt) as a whitelabel service (albertony)
- Add support for MediaMarkt Cloud as a whitelabel service (albertony)
- Added support for traditional oauth authentication also for the main service (albertony)
- Abort attempts to run unsupported
rclone authorizecommand (albertony) - Improved token refresh handling (albertony)
- Fix legacy authentication (albertony)
- Fix authentication for whitelabel services from Elkjรธp subsidiaries (albertony)
- Mega
- Implement 2FA login (iTrooz)
- Memory
- Add
ListPinterface (dougal)
- Add
- Onedrive
- Add
ListPinterface (Nick Craig-Wood)
- Add
- Oracle Object Storage
- Add
ListPinterface (dougal)
- Add
- Pcloud
- Add
ListPinterface (Nick Craig-Wood)
- Add
- Proton Drive
- Automated 2FA login with OTP secret key (Microscotch)
- S3
- Make it easier to add new S3 providers (dougal)
- Add
--s3-use-data-integrity-protectionsquirk to fixBadDigesterror in Alibaba, Tencent (hunshcn) - Add support for
--upload-header,If-MatchandIf-None-Match(Sean Turner) - Fix single file copying behavior with low permission (hunshcn)
- SFTP
- Fix zombie SSH processes with
--sftp-ssh(Copilot)
- Fix zombie SSH processes with
- Smb
- Optimize smb mount performance by avoiding stat checks during initialization (Sudipto Baral)
- Swift
- Add
ListPinterface (dougal) - If
storage_policyisn't set, use the root containers policy (Andrew Ruthven) - Report disk usage in segment containers (Andrew Ruthven)
- Add
- Ulozto
- Implement the About functionality (Lukas Krejci)
- Fix downloads returning HTML error page (aliaj1)
- WebDAV
- Optimize bearer token fetching with singleflight (hunshcn)
- Add
ListPinterface (Nick Craig-Wood) - Use
SpaceSepListto parse bearer token command (hunshcn) - Add
Access-Control-Max-Ageheader for CORS preflight caching (viocha) - Fix out of memory with
sharepoint-ntlmwhen uploading large file (Nick Craig-Wood)
v1.71.2 - 2025-10-20 ๐ธ
See commits (https://github.com/rclone/rclone/compare/v1.71.1...v1.71.2)
- Bug Fixes
- build
- update Go to
1.25.3 - Update Docker image Alpine version to fix
CVE-2025-9230
- update Go to
bisync: Fix race whenCaptureOutputis used concurrently (Nick Craig-Wood)- doc fixes (albertony, dougal, iTrooz, Matt LaPaglia, Nick Craig-Wood)
index: Add missing providers (dougal)serve http: Fix: logging URL on start (dougal)
- build
- Azurefiles
- Fix server side copy not waiting for completion (Vikas Bhansali)
- B2
- Fix 1TB+ uploads (dougal)
- Google Cloud Storage
- Add region
us-east5(Dulani Woods)
- Add region
- Mega
- Fix 402 payment required errors (Nick Craig-Wood)
- Pikpak
- Fix unnecessary retries by using URL expire parameter (Youfu Zhang)
v1.71.1 - 2025-09-24 โจ
See commits (https://github.com/rclone/rclone/compare/v1.71.0...v1.71.1)
- Bug Fixes
bisync: Fix error handling for renamed conflicts (nielash)march: Fix deadlock when using--fast-liston syncs (Nick Craig-Wood)operations: Fix partial name collisions for non--inplacecopies (Nick Craig-Wood)pacer: Fix deadlock with--max-connections(Nick Craig-Wood)- doc fixes (albertony, anon-pradip, Claudius Ellsel, dougal, Jean-Christophe Cura, Nick Craig-Wood, nielash)
- Mount
- Do not log successful unmount as an error (Tilman Vogel)
- VFS
- Fix
SIGHUPkilling serve instead of flushing directory caches (dougal)
- Fix
- Local
- Fix
rmdir"Access is denied"on windows (nielash)
- Fix
- Box
- Fix
aboutafter change in API return (Nick Craig-Wood)
- Fix
- Combine
- Propagate
SlowHashfeature (skbeh)
- Propagate
- Drive
- Update making your own client ID instructions (Ed Craig-Wood)
- Internet Archive
- Fix server side copy files with spaces (Nick Craig-Wood)
v1.71.0 - 2025-08-22 ๐
See commits (https://github.com/rclone/rclone/compare/v1.70.0...v1.71.0)
- New S3 providers ๐
- Exaba (https://rclone.org/s3/#exaba) (Nick Craig-Wood)
- We've been working with Exaba and they would love early adopters, self-hosters and testers
- OVHcloud Object Storage (https://rclone.org/s3/#ovhcloud) (Florent Vennetier)
- Zata (https://rclone.org/s3/#Zata) ($@M@RTH_)
- Exaba (https://rclone.org/s3/#exaba) (Nick Craig-Wood)
- New Features
- Allow global config to be overridden or set on backend creation (https://rclone.org/docs/#globalconfig) (Nick Craig-Wood)
bisync: Promoted from beta to stable (nielash)- build
- Update to
go1.25and makego1.24the minimum required version (Nick Craig-Wood) - Update all dependencies (Nick Craig-Wood)
- Upgrade
golangci-lintto v2 and fix code and config (albertony) - Add markdown linting to workflow and fix all the docs (albertony)
- Extend check for edits of autogenerated files to all commits in a pull request (albertony)
- Set default shell to bash in
build.yml(Ross Smith II)
- Update to
- config
- Make parsing of Duration options consistent (albertony)
- Add error if
RCLONE_CONFIG_PASSwas supplied it but didn't decrypt the config (n4n5)
copy,copyto: Implement logger flags to store result of sync (Marvin Rรถsch)- doc fixes (albertony, Ali Zein Yousuf, Binbin Qian, curlwget, Ed Craig-Wood, jinjingroad, Lucas Bremgartner, n4n5, Nick Craig-Wood)
hash: Add support forBLAKE3,XXH3,XXH128(albertony)- `http
- Add
--client-passsupport for encrypted--client-keyfiles (Nick Craig-Wood)- Allow setting of
--http-proxyfrom the command line (Nick Craig-Wood)
- Allow setting of
lib/mmapโ bestie they converted this to useunsafe.Sliceso we can dodge the deprecatedreflect.SliceHeaderera, iconic behavior (cui) ๐lib/transformโ Avoid empty charmap entry, no more awkward blank vibes in the charmap (albertony) ๐ฆlogโ Log rotation options when you're using--log-file(https://rclone.org/docs/#log-file-string) like finally your logs can โจrotateโจ (Nick Craig-Wood)move,movetoโ Implemented logger flags to store the result of sync, receipts for your moves basically (Marvin Rรถsch)poolโ Unify memory between multipart and asyncreader so they share one pool, sharing is caring fr (Nick Craig-Wood)purgeโ Exit with a fatal error if filters are set onrclone purge, it's giving safety rails bestie, no accidental nuking (Nick Craig-Wood) ๐ญrc- Add
config/unlockto unlock the config file (n4n5) ๐ - Fix
config/listremotesto send an empty array instead of nil (n4n5) - Populate transfer snapshot with
"what"value (Timothy Jacobs)
- Add
serve sftpโ Add support for more hashes: crc32, sha256, blake3, xxh3, xxh128, the whole hash roster showed up and ate (albertony) ๐ฅtransformโ Addtruncate_keep_extensionandtruncate_bytes(nielash)
- Bug Fixes ๐
aboutโ Fix potential overflow ofaboutin various backends (Nick Craig-Wood)accounting- Fix incorrect stats with
--transfers=1(Yu Xin) - Fix stats (speed=0 and eta=nil) when starting jobs via rc (Nick Craig-Wood)
- Fix incorrect stats with
bisync- Fix concurrent runs via rc (nielash)
- Fix
--no-slow-hashsettings on path2 (nielash)
configโ fixed the problem reading pasted tokens over 4095 bytes, long tokens are safe now (Nick Craig-Wood)oauthutilโ Fix nil pointer crash when started with an expired token, no more instant death on stale creds (Nick Craig-Wood) ๐operationsโ Fix too many connections open when using--max-buffer-memory(Nick Craig-Wood)poolโ Fix deadlock with--max-buffer-memoryand multipart transfers (Nick Craig-Wood)rcโ Fixoperations/checkignoring the oneWay parameter (houance)- Mount โ Fix identification of symlinks in directory listings (huangnauh)
- Local
- Configurable supported hashes (albertony)
- Fix
--copy-linkson Windows when listing Junction points (Anagh Kumar Baranwal)
- Azure Blob
- Add support for client assertion based authentication (Vikas Bhansali)
- Fix deadlock with
--max-connectionswith InvalidBlockOrBlob errors (Nick Craig-Wood) - Fix double accounting for multipart uploads (Nick Craig-Wood)
- Azurefiles
- Add support for client assertion based authentication (Vikas Bhansali)
- Fix hash getting erased when modtime is set (nielash)
- Box โ Fix about: cannot unmarshal number 1.0e+18 into Go struct field, big numbers were simply too much for it (Nick Craig-Wood)
- Combine โ Fix directory not found errors with ListP interface (Nick Craig-Wood)
- Filescom โ Document that hashes need to be enabled, iykyk (Nick Craig-Wood)
- FTP
- Allow insecure TLS ciphers (Anagh Kumar Baranwal)
- Make TLS config default to the global TLS config (Nick Craig-Wood)
- This allows
--ca-cert,--client-certetc to be used. - This also allows
override.ca_cert = XXXto be used in the config file.
- This allows
- Googlephotos โ Added warning for Google Photos compatibility-fixes (raider13209)
- Imagekit
- Return correct error when attempting to upload zero length files (Nick Craig-Wood)
- Don't low level retry uploads (Nick Craig-Wood)
- Remove server side Copy method as it was downloading and uploading, not very server-side of it ngl (Nick Craig-Wood) ๐
- Internetarchive โ Fix server side copy of files with
&(Nick Craig-Wood) - Mega โ Fix tls handshake failure (necaran)
- Oracleobjectstorage โ Add read only metadata support (praveen-solanki-oracle)
- Pikpak
- Rewrite upload to bypass AWS S3 manager (wiserain)
- Enhance Move for better handling of error and name collision (wiserain)
- Enhance Copy method to handle name collisions and improve error management (wiserain)
- Add file name integrity check during upload (wiserain)
- S3
- Add
--s3-use-arn-regionflag (Nick Craig-Wood) - Fix memory leak by cloning strings (liubingrun)
- Fix multipart upload and server side copy when using bucket policy SSE-C (Albin Parou)
- Fix Content-Type: aws-chunked causing upload errors with
--metadata(Nick Craig-Wood)
- Add
- SFTP โ Add support for more hashes: crc32, sha256, blake3, xxh3, xxh128 (albertony)
- Smb
- Add
--smb-kerberos-ccacheoption to set kerberos ccache per smb backend (Sudipto Baral) - Refresh Kerberos credentials when the ccache file changes (Sudipto Baral)
- Improve multithreaded upload performance using multiple connections (Sudipto Baral)
- Add
๐ v1.70.3 - 2025-07-09 ๐
See commits (https://github.com/rclone/rclone/compare/v1.70.2...v1.70.3)
- Bug Fixes
check: Fix difference report (it was reporting error counts, messy) (albertony)march: Fix deadlock when using--no-traverse(Nick Craig-Wood)- doc fixes (albertony, Nick Craig-Wood)
- Azure Blob โ Fix server side copy error
"requires exactly one scope"(Nick Craig-Wood) - B2 โ Fix finding objects when using
--b2-version-at(Davide Bizzarri) - Linkbox โ Fix upload error
"user upload file not exist"(Nick Craig-Wood) - Pikpak โ Improve error handling for missing links and unrecoverable 500s (wiserain)
- WebDAV โ Fix setting modtime to that of local object instead of remote (WeidiDeng)
๐ธ v1.70.2 - 2025-06-27 ๐ธ
See commits (https://github.com/rclone/rclone/compare/v1.70.1...v1.70.2)
- Bug Fixes
convmv: Make--dry-runlogs less noisy, volume down bestie (nielash)sync: Avoid copying dir metadata to itself (nielash)build: Bumpgithub.com/go-chi/chi/v5from 5.2.1 to 5.2.2 to fix GHSA-vrw8-fxc6-2r93 (dependabot[bot]) ๐ฅconvmv: Fix moving to unicode-equivalent name (nielash)log: Fix deadlock when using systemd logging (Nick Craig-Wood)pacer: Fix nil pointer deref in RetryError (Nick Craig-Wood)- doc fixes (Ali Zein Yousuf, Nick Craig-Wood)
- Local โ Fix
--skip-linkson Windows when skipping Junction points (Nick Craig-Wood)
๐ฆ v1.70.1 - 2025-06-19 ๐ฆ
See commits (https://github.com/rclone/rclone/compare/v1.70.0...v1.70.1)
- Bug Fixes
convmv: Fix spurious"error running command echo"on Windows (Nick Craig-Wood)- doc fixes (albertony, Ed Craig-Wood, jinjingroad)
๐ v1.70.0 - 2025-06-17 ๐
See commits (https://github.com/rclone/rclone/compare/v1.69.0...v1.70.0)
- New backends
- DOI (
https://rclone.org/doi/) (Flora Thiebaut) - FileLu (
https://rclone.org/filelu/) (kingston125) - New S3 providers:
- MEGA S4 (
https://rclone.org/s3/#mega) (Nick Craig-Wood) - Pure Storage FlashBlade (
https://rclone.org/s3/#pure-storage-flashblade) (Jeremy Daer)
- MEGA S4 (
- DOI (
- New commands
convmv(https://rclone.org/commands/rclone_convmv/): for moving and transforming files (nielash)
- New Features
- Add
--max-connections(https://rclone.org/docs/#max-connections-n) to control maximum backend concurrency (Nick Craig-Wood) - Add
--max-buffer-memory(https://rclone.org/docs/#max-buffer-memory) to limit total buffer memory usage (Nick Craig-Wood) - Add transform library and
--name-transform(https://rclone.org/docs/#name-transform-stringarray) flag (nielash) sync: Implement--list-cutoff(https://rclone.org/docs/#list-cutoff) to allow on disk sorting for reduced memory use (Nick Craig-Wood)accounting: Add listed stat for number of directory entries listed (Nick Craig-Wood)backend: Skip hash calculation when the hashType is None (Oleksiy Stashok)build- Update to go1.24 and make go1.22 the minimum required version (Nick Craig-Wood)
- Disable docker builds on PRs & add missing dockerfile changes (Anagh Kumar Baranwal)
- Modernize Go usage (Nick Craig-Wood)
- Update all dependencies (Nick Craig-Wood)
cmd/authorize: Show required arguments in help text (simwai)cmd/config: add--no-outputoption (Jess)cmd/gitannex- Tweak parsing of
"rcloneremotename"config (Dan McArdle) - Permit remotes with options (Dan McArdle)
- Reject unknown layout modes in INITREMOTE (Dan McArdle)
- Tweak parsing of
docker image: Add labelorg.opencontainers.image.sourcefor release notes in Renovate dependency updates (Robin Schneider)- doc fixes (albertony, Andrew Kreimer, Ben Boeckel, Christoph Berger, Danny Garside, Dimitri Papadopoulos, eccoisle, Ed Craig-Wood, Fernando Fernรกndez, jack, Jeff Geerling, Jugal Kishore, kingston125, luzpaz, Markus Gerstel, Matt Ickstadt, Michael Kebe, Nick Craig-Wood, PrathameshLakawade, Ser-Bul, simonmcnair, Tim White, Zachary Vorhies) ๐
filter:- Add
--hash-filterto deterministically select a subset of files (Nick Craig-Wood) - Show
--min-sizeand--max-sizein--dump filters(Nick Craig-Wood)
- Add
hash: Add SHA512 support for file hashes (Enduriel)http servers: Add--user-from-headerto use for authentication (Moises Lima)lib/batcher: Deprecate unused option:batch_commit_timeout(Dan McArdle)log:- Remove
github.com/sirupsen/logrusand replace withlog/slog(Nick Craig-Wood) - Add
--windows-event-log-levelto support Windows Event Log (Nick Craig-Wood)
- Remove
rc- Add
addshort parameter tocore/statsto not return transferring and checking (Nick Craig-Wood) - In
options/infomake FieldName contain a"."if it should be nested (Nick Craig-Wood) - Add rc control for serve commands (Nick Craig-Wood)
rcserver: Improve content-type check (Jonathan Giannuzzi)
- Add
serve nfs- Update docs to note Windows is not supported (Zachary Vorhies)
- Change the format of
--nfs-cache-typesymlink file handles (Nick Craig-Wood) - Make metadata files have special file handles (Nick Craig-Wood)
touch: Maketouchobey--transfers(Nick Craig-Wood)version: Add--depsflag to show dependencies and other build info (Nick Craig-Wood)
- Add
- Bug Fixes
serve s3:- Fix ListObjectsV2 response (fhuber)
- Remove redundant handler initialization (Tho Neyugn) ๐
stats: Fix goroutine leak and improve stats accounting process (Nathanael Demacon)- VFS ๐ฆ
- Add
--vfs-metadata-extensionto expose metadata sidecar files (Nick Craig-Wood)
- Add
- Azure Blob โจ
- Add support for
x-ms-tagsheader (Trevor Starick) - Cleanup uncommitted blocks on upload errors (Nick Craig-Wood)
- Speed up server side copies for small files (Nick Craig-Wood)
- Implement multipart server side copy (Nick Craig-Wood)
- Remove uncommitted blocks on
InvalidBlobOrBlockerror (Nick Craig-Wood) - Fix handling of objects with
//in (Nick Craig-Wood) - Handle retry error codes more carefully (Nick Craig-Wood)
- Fix errors not being retried when doing single part copy (Nick Craig-Wood)
- Fix multipart server side copies of
0sized files (Nick Craig-Wood)
- Add support for
- Azurefiles
- Add
--azurefiles-use-azand--azurefiles-disable-instance-discovery(b-wimmer)
- Add
- B2
- Add
SkipDestructivehandling to backend commands (Pat Patterson) - Use file id from listing when not presented in headers (ahxxm)
- Add
- Cloudinary ๐ธ
- Automatically add/remove known media files extensions (yuval-cloudinary)
- Var naming convention (yuval-cloudinary)
- Drive
- Added backend
moveidcommand (Spencer McCullough)
- Added backend
- Dropbox
- Support Dropbox Paper (Dave Vasilevsky)
- FTP
- Add
--ftp-http-proxyto connect via HTTP CONNECT proxy
- Add
- Gofile
- Update to use new direct upload endpoint (wbulot)
- Googlephotos
- Update read only and read write scopes to meet Google's requirements. (Germรกn Casares)
- Iclouddrive
- Fix panic and files potentially downloaded twice (Clรฉment Wehrung)
- Internetarchive
- Add
--internetarchive-metadata="key=value"for setting item metadata (Corentin Barreau)
- Add
- Onedrive
- Fix
"The upload session was not found"errors (Nick Craig-Wood) - Re-add
--onedrive-upload-cutoffflag (Nick Craig-Wood) - Fix crash if no metadata was updated (Nick Craig-Wood)
- Fix
- Opendrive
- Added
--opendrive-accessflag to handle permissions (Joel K Biju)
- Added
- Pcloud
- Fix
"Access denied. You do not have permissions to perform this operation"on large uploads (Nick Craig-Wood)
- Fix
- S3 ๐ฅ
- Fix handling of objects with
//in (Nick Craig-Wood) - Add IBM IAM signer (Alexander Minbaev)
- Split the GCS quirks into
--s3-use-x-idand--s3-sign-accept-encoding(Nick Craig-Wood) - Implement paged listing interface
ListP(Nick Craig-Wood) - Add Pure Storage FlashBlade provider support (Jeremy Daer)
- Require custom endpoint for Lyve Cloud v2 support (PrathameshLakawade)
- MEGA S4 support (Nick Craig-Wood)
- Fix handling of objects with
- SFTP
- Add
--sftp-http-proxyto connect via HTTP CONNECT proxy (Nick Craig-Wood)
- Add
- Smb
- Add support for kerberos authentication (Jonathan Giannuzzi)
- Improve connection pooling efficiency (Jonathan Giannuzzi)
- WebDAV
- Retry propfind on
425status (Jรถrn Friedrich Dreyer) - Add an ownCloud Infinite Scale vendor that enables tus chunked upload support (Klaas Freitag)
- Retry propfind on
v1.69.3 - 2025-05-21
See commits: https://github.com/rclone/rclone/compare/v1.69.2...v1.69.3
Bug Fixes
- build: Reapply update
github.com/golang-jwt/jwt/v5from5.2.1to5.2.2to fixCVE-2025-30204(dependabot[bot]) - build: Update
github.com/ebitengine/puregoto work around bug ingo1.24.3(Nick Craig-Wood)
v1.69.2 - 2025-05-01
See commits: https://github.com/rclone/rclone/compare/v1.69.1...v1.69.2
Bug fixes
- accounting: Fix
percentDiffcalculation--(Anagh Kumar Baranwal) - build
- Update
github.com/golang-jwt/jwt/v4from4.5.1to4.5.2to fixCVE-2025-30204(dependabot[bot]) - Update
github.com/golang-jwt/jwt/v5from5.2.1to5.2.2to fixCVE-2025-30204(dependabot[bot]) - Update
golang.org/x/cryptotov0.35.0to fixCVE-2025-22869(Nick Craig-Wood) - Update
golang.org/x/netfrom0.36.0to0.38.0to fixCVE-2025-22870(dependabot[bot]) - Update
golang.org/x/netto0.36.0.to fixCVE-2025-22869(dependabot[bot]) - Stop building with
go < go1.23as security updates forbade it (Nick Craig-Wood) - Fix docker plugin build (Anagh Kumar Baranwal)
- Update
- cmd: Fix crash if rclone is invoked without any arguments (Janne Hellsten)
- config: Read configuration passwords from stdin even when terminated with EOF (Samantha Bowen)
- doc fixes (Andrew Kreimer, Danny Garside, eccoisle, Ed Craig-Wood, emyarod, jack, Jugal Kishore, Markus Gerstel, Michael Kebe, Nick Craig-Wood, simonmcnair, simwai, Zachary Vorhies)
- fs: Fix corruption of
SizeSuffixwith"B"suffix in config (eg--min-size) (Nick Craig-Wood) - lib/http: Fix race between
Serve()andShutdown()(Nick Craig-Wood) - object: Fix memory object out of bounds
Seek(Nick Craig-Wood) - operations: Fix call
fmt.Errorfwith wrong err (alingse) - rc
- Disable the metrics server when running
rclone rc(hiddenmarten) - Fix
debug/*commands not being available over unix sockets (Nick Craig-Wood)
- Disable the metrics server when running
- serve nfs: Fix unlikely crash (Nick Craig-Wood)
- stats: Fix the speed not getting updated after a pause in the processing (Anagh Kumar Baranwal)
- sync
- Fix cpu spinning when empty directory finding with leading slashes (Nick Craig-Wood)
- Copy dir modtimes even when
copyEmptySrcDirsis false (ll3006)
- VFS
- Fix directory cache serving stale data (Lorenz Brun)
- Fix inefficient directory caching when directory reads are slow (huanghaojun)
- Fix integration test failures (Nick Craig-Wood)
- Drive
- Metadata: fix error when setting
copy-requires-writer-permissionon a folder (Nick Craig-Wood)
- Metadata: fix error when setting
- Dropbox
- Retry link without expiry (Dave Vasilevsky)
- HTTP
- Correct root if definitely pointing to a file (nielash)
- Iclouddrive
- Fix so created files are writable (Ben Alex)
- Onedrive
- Fix metadata ordering in permissions (Nick Craig-Wood)
v1.69.1 - 2025-02-14
See commits: https://github.com/rclone/rclone/compare/v1.69.0...v1.69.1
Bug Fixes
- lib/oauthutil: Fix redirect URL mismatch errors (Nick Craig-Wood)
- bisync: Fix listings missing concurrent modifications (nielash)
- serve s3: Fix list objects
encoding-type(Nick Craig-Wood) - fs: Fix confusing
"didn't find section in config file"error (Nick Craig-Wood) - doc fixes (Christoph Berger, Dimitri Papadopoulos, Matt Ickstadt, Nick Craig-Wood, Tim White, Zachary Vorhies)
- build: Added parallel docker builds and caching for
go buildin the container (Anagh Kumar Baranwal) - VFS
- Fix the cache failing to upload symlinks when
--linkswas specified (Nick Craig-Wood) - Fix race detected by race detector (Nick Craig-Wood)
- Close the change notify channel on Shutdown (izouxv)
- Fix the cache failing to upload symlinks when
- B2
- Fix
"fatal error: concurrent map writes"(Nick Craig-Wood)
- Fix
- Iclouddrive
- Add notes on ADP and Missing PCS cookies (Nick Craig-Wood)
- Onedrive
- Mark German (
de) region as deprecated (Nick Craig-Wood)
- Mark German (
- S3
- Added new storage class to magalu provider (Bruno Fernandes)
- Add DigitalOcean regions
SFO2,LON1,TOR1,BLR1(jkpe) - Add latest Linode Object Storage endpoints (jbagwell-akamai)
v1.69.0 - 2025-01-12
See commits: https://github.com/rclone/rclone/compare/v1.68.0...v1.69.0
New backends
- ICloud Drive (
https://rclone.org/iclouddrive/) (lostb1t) - Cloudinary (
https://rclone.org/cloudinary/) (yuval-cloudinary) - New S3 providers:
- Outscale (
https://rclone.org/s3/#outscale) (Matthias Gatto) - Selectel (
https://rclone.org/s3/#selectel) (Nick Craig-Wood)
- Outscale (
Security fixes
bestie this part is serious, ok? read it twice.
- serve sftp: Resolve
CVE-2024-45337- Misuse ofServerConfig.PublicKeyCallbackmay cause authorization bypass (dependabot)- Rclone was not vulnerable to this.
- See
https://github.com/advisories/GHSA-v778-237x-gjrc
- build: Update
golang.org/x/nettov0.33.0to fixCVE-2024-45338- Non-linear parsing of case-insensitive content (Nick Craig-Wood)- Rclone was not vulnerable to this.
- See
https://github.com/advisories/GHSA-w32m-9786-jp63
New Features
- accounting: Write the current bwlimit to the log on
SIGUSR2(Nick Craig-Wood) - bisync: Change exit code from
2to7for critically aborted run (albertony) - build
- Update all dependencies (Nick Craig-Wood)
- Replace Windows-specific
NewLazyDLLwithNewLazySystemDLL(albertony)
- cmd: Change exit code from
1to2for syntax and usage errors (albertony) - docker serve: make sure all mount and VFS options are parsed (Nick Craig-Wood)
- doc fixes (albertony, Alexandre Hamez, Anthony Metzidis, buengese, Dan McArdle, David Seifert, Francesco Frassinelli, Michael R. Davis, Nick Craig-Wood, Pawel Palucha, Randy Bush, remygrandin, Sam Harrison, shenpengfeng, tgfisher, Thomas ten Cate, ToM, Tony Metzidis, vintagefuture, Yxxx)
- fs: Make
--linksflag global and add new--local-linksand--vfs-linksflags (Nick Craig-Wood) - http servers: Disable automatic authentication skipping for unix sockets in http servers (Moises Lima)
- This was making it impossible to use unix sockets with an proxy
- This might now cause rclone to need authentication where it didn't before
- oauthutil: add support for OAuth client credential flow (Martin Hassack, Nick Craig-Wood)
- operations: make log messages consistent for mkdir/rmdir at INFO level (Nick Craig-Wood)
- rc: Add relative to
vfs/queue-set-expiry(https://rclone.org/rc/#vfs-queue-set-expiry) (Nick Craig-Wood) - serve dlna: Sort the directory entries by directories first then alphabetically by name (Nick Craig-Wood)
- serve nfs
- Introduce symlink support (Nick Craig-Wood)
- Implement
--nfs-cache-type symlink(Nick Craig-Wood)
- size: Make output compatible with
-P(Nick Craig-Wood) ๐ - test makefiles โ Add
--flatflag for making directories with many entries (Nick Craig-Wood)
๐ Bug Fixes ๐
- accounting
- Fix global error acounting (Benjamin Legrand) โ bestie the typo stays, it's part of history now ๐ซถ
- Fix debug printing when debug wasn't set (Nick Craig-Wood)
- Fix race stopping/starting the stats counter (Nick Craig-Wood)
- rc/job โ Use mutex for adding listeners thread safety (hayden.pan)
- serve docker โ Fix incorrect GID assignment (TAKEI Yuya)
- serve nfs โ Fix missing inode numbers which was messing up
ls -laR(Nick Craig-Wood) - serve s3 โ Fix Last-Modified timestamp (Nick Craig-Wood)
- serve sftp โ Fix loading of authorized keys file with comment on last line (albertony)
๐ง Mount ๐ง
- Introduce symlink support (Filipe Azevedo, Nick Craig-Wood) โ iconic behaviour fr
- Better snap mount error message (divinity76)
- mount2 โ Fix missing
.and..entries (Filipe Azevedo)
๐ฆ VFS ๐ฆ
- With
--vfs-used-is-sizevalue is calculated and then thrown away (Ilias Ozgur Can Leonard) โ the way that it does work and then โจnothingโจ - Add symlink support to VFS (Filipe Azevedo, Nick Craig-Wood)
- This can be enabled with the specific
--vfs-linksflag or the global--linksflag
- This can be enabled with the specific
- Fix open files disappearing from directory listings (Nick Craig-Wood) โ no more ghosting, we don't do that here ๐
- Add remote name to vfs cache log messages (Nick Craig-Wood)
๐ Cache ๐
- Fix parent not getting pinned when remote is a file (nielash)
๐ Azure Blob ๐
- Add
--azureblob-disable-instance-discovery(Nick Craig-Wood) - Add
--azureblob-use-azto force the use of the Azure CLI for auth (Nick Craig-Wood) - Quit multipart uploads if the context is cancelled (Nick Craig-Wood)
๐ฅ Azurefiles ๐ฅ
- Fix missing
x-ms-file-request-intentheader (Nick Craig-Wood)
โญ B2 โญ
- Add
daysFromStartingToCancelingUnfinishedLargeFilesto backend lifecycle command (Louis Laureys)
๐ Box ๐
- Fix server-side copying a file over existing dst (nielash)
- Fix panic when decoding corrupted PEM from JWT file (Nick Craig-Wood)
๐ Drive ๐
- Add support for markdown format (Noam Ross)
- Implement
rclone backend rescueto rescue orphaned files (Nick Craig-Wood)
๐ธ Dropbox ๐ธ
- Fix server side copying over existing object (Nick Craig-Wood)
- Fix return status when full to be fatal error (Nick Craig-Wood)
๐ FTP ๐
- Implement
--ftp-no-check-uploadto allow upload to write only dirs (Nick Craig-Wood) - Fix
lscommands returning empty on "Microsoft FTP Service" servers (Francesco Frassinelli)
๐ซถ Gofile ๐ซถ
- Fix server side copying over existing object (Nick Craig-Wood)
๐ Google Cloud Storage ๐
- Add access token auth with
--gcs-access-token(Leandro Piccilli) - Update docs on service account access tokens (Anthony Metzidis)
๐ญ Googlephotos ๐ญ
- Implement
--gphotos-proxyto allow download of full resolution media (Nick Craig-Wood) - Fix nil pointer crash on upload (Nick Craig-Wood)
๐ HTTP ๐
- Fix incorrect URLs with initial slash (Oleg Kunitsyn)
๐ฆ Onedrive ๐ฆ
- Add support for OAuth client credential flow (Martin Hassack, Nick Craig-Wood)
- Fix time precision for OneDrive personal (Nick Craig-Wood)
- Fix server side copying over existing object (Nick Craig-Wood)
๐ Opendrive ๐
- Add
rclone aboutsupport to backend (quiescens)
โจ Oracle Object Storage โจ
- Make specifying
compartmentidoptional (Manoj Ghosh) - Quit multipart uploads if the context is cancelled (Nick Craig-Wood)
๐ Pikpak ๐
- Add option to use original file links (wiserain)
๐ง Protondrive ๐ง
- Improve performance of Proton Drive backend (Lawrence Murray)
โญ Putio โญ
- Fix server side copying over existing object (Nick Craig-Wood)
๐ฅ S3 ๐ฅ
- Add initial
--s3-directory-bucketto support AWS Directory Buckets (Nick Craig-Wood) - Add Wasabi
eu-south-1region (Diego Monti) - Fix download of compressed files from Cloudflare R2 (Nick Craig-Wood)
- Rename glacier storage class to flexible retrieval (Henry Lee)
- Quit multipart uploads if the context is cancelled (Nick Craig-Wood)
๐ธ SFTP ๐ธ
- Allow inline ssh public certificate for sftp (Dimitar Ivanov)
- Fix nil check when using auth proxy (Nick Craig-Wood)
๐ Smb ๐
- Add initial support for Kerberos authentication (more work needed). (Francesco Frassinelli)
- Fix panic if stat fails (Nick Craig-Wood)
๐ Sugarsync ๐
- Fix server side copying over existing object (Nick Craig-Wood)
๐ WebDAV ๐
- Nextcloud: implement backoff and retry for 423 LOCKED errors (Nick Craig-Wood)
- Make
--webdav-auth-redirectto fix 401 unauthorized on redirect (Nick Craig-Wood)
๐ Yandex ๐
- Fix server side copying over existing object (Nick Craig-Wood)
๐ Zoho ๐
- Use download server to accelerate downloads (buengese)
- Switch to large file upload API for larger files, fix missing URL encoding of filenames for the upload API (buengese)
- Print clear error message when missing oauth scope (buengese)
- Try to handle rate limits a bit better (buengese)
- Add support for private spaces (buengese)
- Make upload cutoff configurable (buengese)
โญ v1.68.2 - 2024-11-15 โญ
See commits: https://github.com/rclone/rclone/compare/v1.68.1...v1.68.2
๐ Security fixes ๐
- local backend โ
CVE-2024-52522: fix permission and ownership on symlinks with--linksand--metadata(Nick Craig-Wood)- Only affects users using
--metadataand--linksand copying files to the local backend - See
https://github.com/rclone/rclone/security/advisories/GHSA-hrxh-9w67-g4cv
- Only affects users using
- build โ bump
github.com/golang-jwt/jwt/v4from4.5.0to4.5.1(dependabot)- This is an issue in a dependency which is used for JWT certificates
- See
https://github.com/golang-jwt/jwt/security/advisories/GHSA-29wx-vh33-7x7r
Okay so when a changelog says "Security fixes", we read. No skimming, bestie. ๐จ
๐ซถ Bug Fixes ๐ซถ
- accounting โ Fix wrong message on SIGUSR2 to enable/disable bwlimit (Nick Craig-Wood)
- bisync โ Fix output capture restoring the wrong output for logrus (Dimitrios Slamaris)
- dlna โ Fix loggingResponseWriter disregarding log level (Simon Bos)
- serve s3 โ Fix excess locking which was making serve s3 single threaded (Nick Craig-Wood)
- doc fixes (Nick Craig-Wood, tgfisher, Alexandre Hamez, Randy Bush)
๐ฆ Local ๐ฆ
- Fix permission and ownership on symlinks with
--linksand--metadata(Nick Craig-Wood) - Fix
--copy-linkson macOS when cloning (nielash)
๐ธ Onedrive ๐ธ
- Fix Retry-After handling to look at 503 errors also (Nick Craig-Wood)
๐ Pikpak ๐
- Fix cid/gcid calculations for
fs.OverrideRemote(wiserain) - Fix fatal crash on startup with token that can't be refreshed (Nick Craig-Wood)
๐ฅ S3 ๐ฅ
- Fix crash when using
--s3-download-urlafter migration to SDKv2 (Nick Craig-Wood) - Storj provider: fix server-side copy of files bigger than 5GB (Kaloyan Raev)
- Fix multitenant multipart uploads with CEPH (Nick Craig-Wood)
๐ v1.68.1 - 2024-09-24 ๐
See commits: https://github.com/rclone/rclone/compare/v1.68.0...v1.68.1
โจ Bug Fixes โจ
- build โ Fix docker release build (ttionya)
- doc fixes (Nick Craig-Wood, Pawel Palucha)
- fs
- Fix
--dump filtersnot always appearing (Nick Craig-Wood) - Fix setting stringArray config values from environment variables (Nick Craig-Wood)
- Fix
- rc โ Fix default value of
--metrics-addr(Nick Craig-Wood) - serve docker โ Add missing vfs-read-chunk-streams option in docker volume driver (Divyam)
๐ง Onedrive ๐ง
- Fix spurious "Couldn't decode error response: EOF" DEBUG (Nick Craig-Wood)
๐ Pikpak ๐
- Fix login issue where token retrieval fails (wiserain)
โญ S3 โญ
- Fix rclone ignoring static credentials when
env_auth=true(Nick Craig-Wood)
๐ v1.68.0 - 2024-09-08 ๐
See commits: https://github.com/rclone/rclone/compare/v1.67.0...v1.68.0
๐ New backends ๐
- Files.com (Sam Harrison)
- Gofile (
https://rclone.org/gofile/) (Nick Craig-Wood) - Pixeldrain (
https://rclone.org/pixeldrain/) (Fornax)
๐ฆ Changed backends ๐ฆ
- S3 (
https://rclone.org/s3/) backend updated to use AWS SDKv2 (https://github.com/aws/aws-sdk-go-v2) as v1 is now unsupported.- The matrix of providers and auth methods is huge and there could be problems with obscure combinations.
- Please report problems in a new issue (
https://github.com/rclone/rclone/issues/new/choose) on Github.
๐ New commands ๐
- config encryption (
https://rclone.org/commands/rclone_config_encryption/): set, remove and check to manage config file encryption (Nick Craig-Wood)
๐ New Features ๐
- build
- Update to go1.23 and make go1.21 the minimum required version (Nick Craig-Wood)
- Update all dependencies (Nick Craig-Wood)
- Disable wasm/js build due to go bug #64856 (
https://github.com/golang/go/issues/64856) (Nick Craig-Wood) - Enable custom linting rules with ruleguard via gocritic (albertony)
- Update logging statements to make
--use-json-logwork always (albertony) - Adding new code quality tests and fixing the fallout (albertony)
- config
- Internal config re-organised to be more consistent and make it available from the rc (Nick Craig-Wood)
- Avoid remotes with empty names from the environment (albertony)
- Make listing of remotes more consistent (albertony)
- Make getting config values more consistent (albertony)
- Use
--password-commandto set config file password if supplied (Nick Craig-Wood)
- doc fixes (albertony, crystalstall, David Seifert, Eng Zer Jun, Ernie Hershey, Florian Klink, John Oxley, kapitainsky, Mathieu Moreau, Nick Craig-Wood, nipil, Pรฉtr Bozsรณ, Russ Bubley, Sam Harrison, Thearas, URenko, Will Miles, yuval-cloudinary)
- fs โ Allow semicolons as well as spaces in
--bwlimittimetable parsing (Kyle Reynolds) - help
- Global flags help command now takes glob filter (albertony)
- Make help command output less distracting (albertony)
- lib/encoder โ Add Raw encoding for use where no encoding at all is required, eg
--local-encoding Raw(URenko) listremotesโ added options for filtering, ordering and json output (albertony) โจnfsmount- Make the
--sudoflag work for umount as well as mount (Nick Craig-Wood) - Add
-o tcpoption to NFS mount options to fix mounting under Linux (Nick Craig-Wood)
- Make the
operations: copyโ generate stable partial suffix (Georg Welzel)rc- Add
options/info(https://rclone.org/rc/#options-info) call to enumerate options (Nick Craig-Wood) ๐ - Add option blocks parameter to
options/get(https://rclone.org/rc/#options-get) andoptions/info(Nick Craig-Wood) - Add
vfs/queue(https://rclone.org/rc/#vfs-queue) to show the status of the upload queue (Nick Craig-Wood) - Add
vfs/queue-set-expiry(https://rclone.org/rc/#vfs-queue-set-expiry) to adjust expiry of items in the VFS queue (Nick Craig-Wood) - Add
--unix-socketoption torccommand (Florian Klink) - Prevent
unmountrc command from sending aSTOPPING=1sd-notify message (AThePeanut4)
- Add
rcserverโ implement prometheus metrics (https://rclone.org/docs/#metrics) on a dedicated port (Oleg Kunitsyn) ๐serve dlna- Also look at "Subs" subdirectory (Florian Klink)
- Don't swallow
video.{idx,sub}(Florian Klink) - Set more correct mime type (Florian Klink)
serve nfs- Implement on disk cache for file handles selected with
--nfs-cache-type(Nick Craig-Wood) - Add tracing to filesystem calls (Nick Craig-Wood)
- Mask unimplemented error from
chmod(Nick Craig-Wood) - Unify the nfs library logging with rclone's logging better (Nick Craig-Wood)
- Fix incorrect user id and group id exported to NFS (Nick Craig-Wood)
- Implement on disk cache for file handles selected with
serve s3- Implement
--auth-proxy(Sawjan Gurung) - Update to AWS SDKv2 by updating
github.com/rclone/gofakes3(Nick Craig-Wood)
- Implement
- Bug Fixes ๐
bisyncโ fix sync time problems with backends that round time (eg Dropbox) (nielash)serve dlnaโ fixpanic: invalid argument to Int63n(Nick Craig-Wood)
- VFS
- Add
--vfs-read-chunk-streams(https://rclone.org/commands/rclone_mount/#vfs-read-chunk-streams-0-1) to parallel read chunks from files (Nick Craig-Wood)- This can increase mount performance on high bandwidth or large latency links ๐
- Fix cache encoding with special characters (URenko)
- Add
- Local
- Fix encoding of root path fix (URenko)
- Add server-side copy (using clone) with xattrs on macOS (nielash)
--local-no-cloneflag to disable cloning for server-side copies (nielash)
- Support setting custom
--metadataduring server-side Copy (nielash)
- Azure Blob
- Allow anonymous access for public resources (Nick Craig-Wood)
- B2
- Include custom upload headers in large file info (Pat Patterson)
- Drive
- Fix copying Google Docs to a backend which only supports SHA1 (Nick Craig-Wood)
- Fichier
- Fix detection of Flood Detected error (Nick Craig-Wood)
- Fix server side move (Nick Craig-Wood)
- HTTP
- Reload client certificates on expiry (Saleh Dindar)
- Support listening on passed FDs (Florian Klink)
- Jottacloud
- Fix setting of metadata on server side move (albertony)
- Onedrive
- Fix nil pointer error when uploading small files (Nick Craig-Wood)
- Pcloud
- Implement SetModTime (Georg Welzel)
- Implement OpenWriterAt feature to enable multipart uploads (Georg Welzel)
- Fix failing large file uploads (Georg Welzel)
- Pikpak
- Improve data consistency by ensuring async tasks complete (wiserain)
- Implement custom hash to replace wrong sha1 (wiserain)
- Fix error with
copytocommand (wiserain) - Optimize file move by removing unnecessary
readMetaData()call (wiserain) - Non-buffered hash calculation for local source files (wiserain)
- Optimize upload by pre-fetching gcid from API (wiserain)
- Correct file transfer progress for uploads by hash (wiserain)
- Update to using AWS SDK v2 (wiserain)
- S3
- Update to using AWS SDK v2 (Nick Craig-Wood)
- Add
--s3-sdk-log-modeto control SDKv2 debugging (Nick Craig-Wood)
- Add
- Fix incorrect region for Magalu provider (Filipe Herculano)
- Allow restoring from intelligent-tiering storage class (Pawel Palucha)
- Update to using AWS SDK v2 (Nick Craig-Wood)
- SFTP
- Use uint32 for mtime to save memory (Tomasz Melcer)
- Ignore useless errors when closing the connection pool (Nick Craig-Wood)
- Support listening on passed FDs (Florian Klink)
- Swift
- Add workarounds for bad listings in Ceph RGW (Paul Collins)
- Add total/free space info in
aboutcommand. (fsantagostinobietti)
- Ulozto
- Fix upload of > 2GB files on 32 bit platforms (Tobias Markus)
- WebDAV
- Add
--webdav-unix-socket-pathto connect to a unix socket (Florian Klink)
- Add
- Yandex
- Implement custom user agent to help with upload speeds (Sebastian Bรผnger)
- Zoho
- Fix inefficiencies uploading with new API to avoid throttling (Nick Craig-Wood)
๐ธ v1.67.0 - 2024-06-14 ๐ธ
See commits (https://github.com/rclone/rclone/compare/v1.66.0...v1.67.0)
- New backends ๐ฆ
- uloz.to (https://rclone.org/ulozto/) (iotmaestro)
- New S3 providers
- Magalu Object Storage (https://rclone.org/s3/#magalu) (Bruno Fernandes)
- New commands โจ
- gitannex (https://rclone.org/commands/rclone_gitannex/): Enables git-annex to store and retrieve content from an rclone remote (Dan McArdle)
- New Features ๐
- accounting โ Add deleted files total size to status summary line (Kyle Reynolds)
- build
- Fix CVE-2023-45288 by upgrading
golang.org/x/net(Nick Craig-Wood) - Fix CVE-2024-35255 by upgrading
github.com/Azure/azure-sdk-for-go/sdk/azidentityto 1.6.0 (dependabot) - Convert source files with CRLF to LF (albertony)
- Update all dependencies (Nick Craig-Wood)
- Fix CVE-2023-45288 by upgrading
- doc updates (albertony, Alex Garel, Dave Nicolson, Dominik Joe Pantลฏฤek, Eric Wolf, Erisa A, Evan Harris, Evan McBeth, Gachoud Philippe, hidewrong, jakzoe, jumbi77, kapitainsky, Kyle Reynolds, Lewis Hook, Nick Craig-Wood, overallteach, pawsey-kbuckley, Pieter van Oostrum, psychopatt, racerole, static-moonlight, Warrentheo, yudrywet, yumeiyin )
- ncdu โ Do not quit on Esc to aid usability (Katia Esposito)
- rcserver โ Set ModTime for dirs and files served by
--rc-serve(Nikita Shoshin)
- Bug Fixes ๐
- bisync โ Add integration tests against all backends and fix many many problems (nielash)
- config โ Fix default value for description (Nick Craig-Wood)
- copy โ Fix nil pointer dereference when corrupted on transfer with nil dst (nielash)
- fs
- Improve JSON Unmarshalling for Duration types (Kyle Reynolds)
- Close the CPU profile on exit (guangwu)
- Replace
/bin/bashwith/usr/bin/env bash(Florian Klink)
- oauthutil โ Clear client secret if client ID is set (Michael Terry)
- operations
- Rework rcat so that it doesn't call the
--metadata-mappertwice (Nick Craig-Wood) - Ensure SrcFsType is set correctly when using
--metadata-mapper(Nick Craig-Wood) - Fix "optional feature not implemented" error with a crypted sftp bug (Nick Craig-Wood)
- Fix very long file names when using copy with
--partial(Nick Craig-Wood) - Fix retries downloading too much data with certain backends (Nick Craig-Wood)
- Fix move when dst is nil and fdst is case-insensitive (nielash)
- Fix
lsjson --encryptedwhen using--crypt-XXXparameters (Nick Craig-Wood) - Fix missing metadata for multipart transfers to local disk (Nick Craig-Wood)
- Fix incorrect modtime on some multipart transfers (Nick Craig-Wood)
- Fix hashing problem in integration tests (Nick Craig-Wood)
- Rework rcat so that it doesn't call the
- rc
- Fix stats groups being ignored in
operations/check(Nick Craig-Wood) - Fix incorrect Content-Type in HTTP API (Kyle Reynolds)
- Fix stats groups being ignored in
- serve s3
- Fix Last-Modified header format (Butanediol)
- Fix in-memory metadata storing wrong modtime (nielash)
- Fix XML of error message (Nick Craig-Wood)
- serve webdav โ Fix webdav with
--baseurlunder Windows (Nick Craig-Wood) - serve dlna โ Make BrowseMetadata more compliant (albertony)
- serve http โ Added Content-Length header when HTML directory is served (Sunny)
- sync
- Don't sync directories if they haven't been modified (Nick Craig-Wood)
- Don't test reading metadata if we can't write it (Nick Craig-Wood)
- Fix case normalisation (problem on on s3) (Nick Craig-Wood)
- Fix management of empty directories to make it more accurate (Nick Craig-Wood)
- Fix creation of empty directories when
--create-empty-src-dirs=false(Nick Craig-Wood) - Fix directory modification times not being set (Nick Craig-Wood)
- Fix "failed to update directory timestamp or metadata: directory not found" (Nick Craig-Wood)
- Fix expecting SFTP to have MkdirMetadata method: optional feature not implemented (Nick Craig-Wood)
- test info โ Improve cleanup of temp files (Kyle Reynolds)
- touch โ Fix using
-Ron certain backends (Nick Craig-Wood)
- Mount ๐ซถ
- Add
--direct-ioflag to force uncached access (Nick Craig-Wood)
- Add
- VFS
- Fix download loop when file size shrunk (Nick Craig-Wood)
- Fix renaming a directory (nielash)
- Local
- Add
--local-time-typeto use mtime/atime/btime/ctime as the time (Nick Craig-Wood) - Allow SeBackupPrivilege and/or SeRestorePrivilege to work on Windows (Charles Hamilton)
- Add
- Azure Blob
- Fix encoding issue with dir path comparison (nielash)
- B2
- Add new cleanup (https://rclone.org/b2/#cleanup) and cleanup-hidden backend commands. (Pat Patterson)
- Update B2 URLs to new home (Nick Craig-Wood)
- Chunker
- Fix startup when root points to composite multi-chunk file without metadata (nielash)
- Fix case-insensitive comparison on local without metadata (nielash)
- Fix "finalizer already set" error (nielash)
- Drive
- Add backend query (https://rclone.org/drive/#query) command for general purpose querying of files (John-Paul Smith) ๐
- Stop sending notification emails when setting permissions (Nick Craig-Wood) ๐ญ
- Fix server side copy with metadata from my drive to shared drive (Nick Craig-Wood)
- Set all metadata permissions and return error summary instead of stopping on the first error (Nick Craig-Wood)
- Make errors setting permissions into no retry errors (Nick Craig-Wood)
- Fix description being overwritten on server side moves (Nick Craig-Wood)
- Allow setting metadata to fail if
failokflag is set (Nick Craig-Wood) - Fix panic when using
--metadata-mapperon large google doc files (Nick Craig-Wood) ๐ฑ
- Dropbox
- Add
--dropbox-root-namespaceto override the root namespace (Bill Fraser)
- Add
- Google Cloud Storage
- Fix encoding issue with dir path comparison (nielash)
- Hdfs
- Fix
f.String()not including subpath (nielash)
- Fix
- Http
- Add
--http-no-escapeto not escape URL metacharacters in path names (Kyle Reynolds)
- Add
- Jottacloud
- Set metadata on server side copy and move (albertony)
- Linkbox
- Fix working with names longer than 8-25 Unicode chars. (Vitaly)
- Fix list paging and optimized synchronization. (gvitali)
- Mailru
- Attempt to fix throttling by increasing min sleep to
100ms(Nick Craig-Wood)
- Attempt to fix throttling by increasing min sleep to
- Memory
- Fix
dstmutatingsrcafter server-side copy (nielash) - Fix deadlock in
operations.Purge(nielash) - Fix incorrect list entries when rooted at subdirectory (nielash)
- Fix
- Onedrive
- Add
--onedrive-hard-deleteto permanently delete files (Nick Craig-Wood) ๐ - Make server-side copy work in more scenarios (YukiUnHappy)
- Fix
"unauthenticated: Unauthenticated"errors when downloading (Nick Craig-Wood) - Fix
--metadata-mapperbeing called twice if writing permissions (nielash) - Set all metadata permissions and return error summary instead of stopping on the first error (nielash)
- Make errors setting permissions into no retry errors (Nick Craig-Wood)
- Skip writing permissions with
'owner'role (nielash) - Fix references to deprecated permissions properties (nielash)
- Add support for group permissions (nielash)
- Allow setting permissions to fail if
failokflag is set (Nick Craig-Wood)
- Add
- Pikpak
- Make
getFile()usage more efficient to avoid the download limit (wiserain) - Improve upload reliability and resolve potential file conflicts (wiserain)
- Implement configurable chunk size for multipart upload (wiserain)
- Make
- Protondrive
- Don't auth with an empty access token (Michaล Dzienisiewicz)
- Qingstor
- Disable integration tests as test account suspended (Nick Craig-Wood)
- Quatrix
- Fix
f.String()not including subpath (nielash)
- Fix
- S3
- Add new AWS region
il-central-1Tel Aviv (yoelvini) - Update Scaleway's configuration options (Alexandre Lavigne)
- Ceph: fix quirks when creating buckets to fix trying to create an existing bucket (Thomas Schneider)
- Fix encoding issue with dir path comparison (nielash)
- Fix
405error onHEADfor delete marker withversionId(nielash) - Validate
--s3-copy-cutoffsize before copy (hoyho)
- Add new AWS region
- SFTP
- Add
--sftp-connectionsto limit the maximum number of connections (Tomasz Melcer)
- Add
- Storj
- Update
storj.io/uplinkto latest release (JT Olio) - Update bio on request (Nick Craig-Wood)
- Update
- Swift
- Implement
--swift-use-segments-containerto allow>5Gfiles on Blomp (Nick Craig-Wood)
- Implement
- Union
- Fix deleting dirs when all remotes can't have empty dirs (Nick Craig-Wood)
- WebDAV
- Fix setting modification times erasing checksums on owncloud and nextcloud (nielash)
- owncloud: Add
--webdav-owncloud-exclude-mountswhich allows excluding mounted folders when listing remote resources (Thomas Mรผller)
- Zoho
- Fix throttling problem when uploading files (Nick Craig-Wood)
- Use cursor listing for improved performance (Nick Craig-Wood)
- Retry reading info after upload if size wasn't returned (Nick Craig-Wood)
- Remove simple file names complication which is no longer needed (Nick Craig-Wood)
- Sleep for
60seconds if rate limit error received (Nick Craig-Wood)
๐ฆ v1.66.0 - 2024-03-10 ๐ฆ
See commits (https://github.com/rclone/rclone/compare/v1.65.0...v1.66.0)
โจ Major features โจ
- Rclone will now sync directory modification times if the backend supports it.
- This can be disabled with
--no-update-dir-modtime(https://rclone.org/docs/#no-update-dir-modtime) - See the overview (https://rclone.org/overview/#features) and look for the D flags in the ModTime column to see which backends support it. ๐
- This can be disabled with
- Rclone will now sync directory metadata if the backend supports it when
-M/--metadatais in use.- See the overview (https://rclone.org/overview/#features) and look for the D flags in the Metadata column to see which backends support it.
- Bisync has received many updates see below for more details or bisync's changelog (https://rclone.org/bisync/#changelog) ๐
๐๏ธ Removed backends ๐
amazonclouddrive: Remove Amazon Drive backend code and docs (Nick Craig-Wood)
๐ New Features ๐
- backend
- Add description field for all backends (Paul Stern)
- build
- Update to
go1.22and makego1.20the minimum required version (Nick Craig-Wood) - Fix
CVE-2024-24786by upgradinggoogle.golang.org/protobuf(Nick Craig-Wood)
- Update to
- check: Respect
--no-unicode-normalizationand--ignore-case-syncfor--checkfile(nielash) - cmd: Much improved shell auto completion which reduces the size of the completion file and works faster (Nick Craig-Wood) โก
- doc updates (albertony, ben-ba, Eli, emyarod, huajin tong, Jack Provance, kapitainsky, keongalvin, Nick Craig-Wood, nielash, rarspace01, rzitzer, Tera, Vincent Murphy)
- fs: Add more detailed logging for file includes/excludes (Kyle Reynolds)
- lsf
- Add
--time-formatflag (nielash) - Make metadata appear for directories (Nick Craig-Wood)
- Add
- lsjson: Make metadata appear for directories (Nick Craig-Wood)
- rc
- Add
srcFsanddstFstocore/statsandcore/transferredstats (Nick Craig-Wood) - Add
operations/hashsumto the rc asrclone hashsumequivalent (Nick Craig-Wood) - Add
config/pathsto the rc asrclone config pathsequivalent (Nick Craig-Wood)
- Add
- sync
- Optionally report list of synced paths to file (nielash)
- Implement directory sync for mod times and metadata (Nick Craig-Wood)
- Don't set directory modtimes if already set (nielash)
- Don't sync directory modtimes from backends which don't have directories (Nick Craig-Wood)
๐ Bug Fixes ๐
- backend
- Make backends which use oauth implement the Shutdown and shutdown the oauth properly (rkonfj)
- bisync
- Handle unicode and case normalization consistently (nielash)
- Partial uploads known issue on
local/ftp/sftphas been resolved (unless using--inplace) (nielash) - Fixed handling of unicode normalization and case insensitivity, support for
--fix-case(https://rclone.org/docs/#fix-case),--ignore-case-sync,--no-unicode-normalization(nielash) - Bisync no longer fails to find the correct listing file when configs are overridden with backend-specific flags. (nielash)
- nfsmount
- Fix exit after external unmount (nielash)
- Fix
--volnamebeing ignored (nielash)
- operations
- Fix renaming a file on macOS (nielash)
- Fix case-insensitive moves in
operations.Move(nielash) - Fix
TestCaseInsensitiveMoveFileDryRunon chunker integration tests (nielash) - Fix
TestMkdirModTimetest (Nick Craig-Wood) - Fix
TestSetDirModTimefor backends withSetDirModTimebut notMetadata(Nick Craig-Wood) - Fix typo in log messages (nielash)
- serve nfs: Fix writing files via Finder on macOS (nielash)
- serve restic: Fix error handling (Michael Eischer)
- serve webdav: Fix
--baseurlwithout leading/(Nick Craig-Wood) - stats: Fix race between
ResetCountersandstopAverageLoopcalled fromtime.AfterFunc(Nick Craig-Wood) - sync
--fix-caseflag to rename case insensitive dest (nielash)- Use
operations.DirMoveinstead ofsync.MoveDirfor--fix-case(nielash)
- systemd: Fix detection and switch to the
coreospackage everywhere rather than having 2 separate libraries (Anagh Kumar Baranwal)
๐ง Mount ๐ง
- Fix macOS not noticing errors with
--daemon(Nick Craig-Wood) - Notice daemon dying much quicker (Nick Craig-Wood)
๐ฆ VFS ๐ฆ
- Fix unicode normalization on macOS (nielash)
๐ธ Bisync ๐ธ
- Copies and deletes are now handled in one operation instead of two (nielash)
--track-renamesand--backup-dirare now supported (nielash)- Final listings are now generated from sync results, to avoid needing to re-list (nielash)
- Bisync is now much more resilient to changes that happen during a bisync run, and far less prone to critical errors / undetected changes (nielash) ๐ช
- Bisync is now capable of rolling a file listing back in cases of uncertainty, essentially marking the file as needing to be rechecked next time. (nielash)
- A few basic terminal colors are now supported, controllable with
--color(https://rclone.org/docs/#color-autoneveralways) (AUTO|NEVER|ALWAYS) (nielash) - Initial listing snapshots of
Path1andPath2are now generated concurrently, using the same "march" infrastructure as check and sync, for performance improvements and less risk of error. (nielash) --resyncis now much more efficient (especially for users of--create-empty-src-dirs) (nielash)- Google Docs (and other files of unknown size) are now supported (with the same options as in sync) (nielash)
- Equality checks before a sync conflict rename now fall back to
cryptcheck(when possible) or--download(nielash) instead of--size-only, whenevercheckisn't available. ๐ - Bisync now fully supports comparing based on any combination of
size,modtime, andchecksumโ lifting the prior restriction on backends that don't do modtime. (nielash) ๐ฅ - Bisync now supports a "Graceful Shutdown" mode so you can cleanly cancel a run early without needing
--resync. (nielash) โจ - New
--recoverflag gives you robust recovery in the event of interruptions, again without requiring--resync. (nielash) ๐ซถ - A new
--max-locksetting lets lock files automatically renew and expire, which is so much better for automatic recovery when a run gets interrupted. (nielash) ๐ - Bisync now auto-resolves sync conflicts and lets you customize rename behavior with the new
--conflict-resolve,--conflict-loser, and--conflict-suffixflags. (nielash) ๐ - A new
--resync-modeflag gives you more control over which version of a file gets kept during a--resync. (nielash) ๐ฆ - Bisync now supports
--retries(https://rclone.org/docs/#retries-int) and--retries-sleep(when--resilientis set). (nielash) - Clarify file operation directions in dry-run logs (Kyle Reynolds) ๐ง
- Local ๐
- Fix
cleanRootPathon Windows after the go1.21.4 stdlib update (nielash) - Implement setting modification time on directories (nielash)
- Implement modtime and metadata for directories (Nick Craig-Wood)
- Fix setting of
btimeon directories on Windows (Nick Craig-Wood) - Delete backend implementation of Purge to speed up and make stats (Nick Craig-Wood)
- Support metadata setting and mapping on server side Move (Nick Craig-Wood)
- Fix
- Cache ๐
- Implement setting modification time on directories (if supported by wrapped remote) (nielash)
- Implement setting metadata on directories (Nick Craig-Wood)
- Crypt ๐
- Implement setting modification time on directories (if supported by wrapped remote) (nielash)
- Implement setting metadata on directories (Nick Craig-Wood)
- Improve handling of undecryptable file names (nielash)
- Add missing error check spotted by linter (Nick Craig-Wood)
- Azure Blob ๐
- Implement
--azureblob-delete-snapshots(Nick Craig-Wood)
- Implement
- B2 ๐
- Clarify exactly what
--b2-download-auth-durationdoes in the docs (Nick Craig-Wood)
- Clarify exactly what
- Chunker ๐งฉ
- Implement setting modification time on directories (if supported by wrapped remote) (nielash)
- Implement setting metadata on directories (Nick Craig-Wood)
- Combine ๐
- Implement setting modification time on directories (if supported by wrapped remote) (nielash)
- Implement setting metadata on directories (Nick Craig-Wood)
- Fix directory metadata error on upstream root (nielash)
- Fix directory move across upstreams (nielash)
- Compress ๐๏ธ
- Implement setting modification time on directories (if supported by wrapped remote) (nielash)
- Implement setting metadata on directories (Nick Craig-Wood)
- Drive ๐
- Implement setting modification time on directories (nielash)
- Implement modtime and metadata setting for directories (Nick Craig-Wood)
- Support metadata setting and mapping on server side Move, Copy (Nick Craig-Wood)
- FTP ๐
- Fix
mkdirwithrsftpwhich is returning the wrong code (Nick Craig-Wood)
- Fix
- Hasher #๏ธโฃ
- Implement setting modification time on directories (if supported by wrapped remote) (nielash)
- Implement setting metadata on directories (Nick Craig-Wood)
- Fix error from trying to stop an already-stopped db (nielash)
- Look for cached hash if passed hash unexpectedly blank (nielash)
- Imagekit ๐ผ๏ธ
- Updated docs and web content (Harshit Budhraja)
- Updated overview - supported operations (Harshit Budhraja)
- Mega โ๏ธ
- Fix panic with go1.22 (Nick Craig-Wood)
- Netstorage ๐พ
- Fix Root to return correct directory when pointing to a file (Nick Craig-Wood)
- Onedrive ๐ฆ
- Add metadata support (nielash)
- Opendrive ๐
- Fix moving file/folder within the same parent dir (nielash)
- Oracle Object Storage ๐งก
- Support backend restore command (Nikhil Ahuja)
- Support workload identity authentication for OKE (Anders Swanson)
- Protondrive ๐ก๏ธ
- Fix encoding of Root method (Nick Craig-Wood)
- Quatrix ๐ง
- Fix Content-Range header (Volodymyr)
- Add option to skip project folders (Oksana Zhykina)
- Fix Root to return correct directory when pointing to a file (Nick Craig-Wood)
- S3 ๐ชฃ
- Add
--s3-version-deletedto show delete markers in listings when using versions. (Nick Craig-Wood) - Add IPv6 support with option
--s3-use-dual-stack(Anthony Metzidis) - Copy parts in parallel when doing chunked server side copy (Nick Craig-Wood)
- GCS provider: fix server side copy of files bigger than 5G (Nick Craig-Wood)
- Support metadata setting and mapping on server side Copy (Nick Craig-Wood)
- Add
- Seafile ๐
- Fix download/upload error when
FILE_SERVER_ROOTis relative (DanielEgbers) - Fix Root to return correct directory when pointing to a file (Nick Craig-Wood)
- Fix download/upload error when
- SFTP ๐
- Implement setting modification time on directories (nielash)
- Set directory modtimes update on write flag (Nick Craig-Wood)
- Shorten wait delay for external ssh binaries now that we are using go1.20 (Nick Craig-Wood)
- Swift ๐๏ธ
- Avoid unnecessary container versioning check (Joe Cai)
- Union ๐ค
- Implement setting modification time on directories (if supported by wrapped remote) (nielash)
- Implement setting metadata on directories (Nick Craig-Wood)
- WebDAV ๐ธ๏ธ
- Reduce priority of chunks upload log (Gabriel Ramos)
- owncloud: Add config
owncloud_exclude_shareswhich allows to exclude shared files and folders when listing remote resources (Thomas Mรผller)
v1.65.2 - 2024-01-24 โจ
See commits: https://github.com/rclone/rclone/compare/v1.65.1...v1.65.2
- Bug Fixes ๐
- build: bump
github.com/cloudflare/circlfrom1.3.6to1.3.7(dependabot) - docs updates (Nick Craig-Wood, kapitainsky, nielash, Tera, Harshit Budhraja)
- build: bump
- VFS ๐
- Fix stale data when using
--vfs-cache-mode full(Nick Craig-Wood)
- Fix stale data when using
- Azure Blob ๐
- IMPORTANT Fix data corruption bug - see #7590 (
https://github.com/rclone/rclone/issues/7590) (Nick Craig-Wood)
- IMPORTANT Fix data corruption bug - see #7590 (
โ ๏ธ bestie that one is literally marked IMPORTANT for a reason โ data corruption is not the vibe. Update, fr fr. ๐
v1.65.1 - 2024-01-08 ๐ธ
See commits: https://github.com/rclone/rclone/compare/v1.65.0...v1.65.1
- Bug Fixes ๐
- build
- Bump
golang.org/x/cryptoto fix ssh terrapinCVE-2023-48795(dependabot) - Update to go1.21.5 to fix Windows path problems (Nick Craig-Wood)
- Fix docker build on arm/v6 (Nick Craig-Wood)
- Bump
install.sh: fix harmless error message on install (Nick Craig-Wood)- accounting: fix stats to show server side transfers (Nick Craig-Wood)
- doc fixes (albertony, ben-ba, Eli Orzitzer, emyarod, keongalvin, rarspace01)
- nfsmount: Compile for all unix oses, add
--sudoand fix error/option handling (Nick Craig-Wood) - operations: Fix files moved by
rclone movenot being counted as transfers (Nick Craig-Wood) - oauthutil: Avoid panic when
*tokenand*ts.tokenare the same (rkonfj) - serve s3: Fix listing oddities (Nick Craig-Wood)
- build
- VFS ๐
- Note that
--vfs-refreshruns in the background (Nick Craig-Wood)
- Note that
- Azurefiles ๐ฆ
- Fix storage base url (Oksana)
- Crypt ๐
- Fix
rclone movea file over itself deleting the file (Nick Craig-Wood)
- Fix
- Chunker ๐งฉ
- Fix
rclone movea file over itself deleting the file (Nick Craig-Wood)
- Fix
- Compress ๐๏ธ
- Fix
rclone movea file over itself deleting the file (Nick Craig-Wood)
- Fix
- Dropbox ๐ฆ
- Fix used space on dropbox team accounts (Nick Craig-Wood)
- FTP ๐
- Fix multi-thread copy (WeidiDeng)
- Googlephotos ๐ธ
- Fix nil pointer exception when batch failed (Nick Craig-Wood)
- Hasher #๏ธโฃ
- Fix
rclone movea file over itself deleting the file (Nick Craig-Wood) - Fix invalid memory address error when
MaxAge == 0(nielash)
- Fix
- Onedrive ๐ฆ
- Fix error listing:
unknown object type <nil>(Nick Craig-Wood) - Fix
"unauthenticated: Unauthenticated"errors when uploading (Nick Craig-Wood)
- Fix error listing:
- Oracleobjectstorage ๐งก
- Fix object storage endpoint for custom endpoints (Manoj Ghosh)
- Multipart copy create bucket if it doesn't exist. (Manoj Ghosh)
- Protondrive ๐ก๏ธ
- Fix
CVE-2023-45286/GHSA-xwh9-gc39-5298(Nick Craig-Wood)
- Fix
- S3 ๐ชฃ
- Fix crash if no
UploadIdin multipart upload (Nick Craig-Wood)
- Fix crash if no
- Smb ๐ช
- Fix shares not listed by updating
go-smb2(halms)
- Fix shares not listed by updating
- Union ๐ค
- Fix
rclone movea file over itself deleting the file (Nick Craig-Wood)
- Fix
v1.65.0 - 2023-11-26 ๐
See commits: https://github.com/rclone/rclone/compare/v1.64.0...v1.65.0
- New backends ๐
- Azure Files (karan, moongdal, Nick Craig-Wood)
- ImageKit (Abhinav Dhiman)
- Linkbox (viktor, Nick Craig-Wood)
- New commands โจ๏ธ
- serve s3: Let rclone act as an S3 compatible server (Mikubill, Artur Neumann, Saw-jan, Nick Craig-Wood)
- nfsmount: mount command to provide mount mechanism on macOS without FUSE (Saleh Dindar)
- serve nfs: to serve a remote for use by nfsmount (Saleh Dindar)
- New Features โจ
install.sh: Clean up temp files in install script (Jacob Hands)- build
- Update all dependencies (Nick Craig-Wood)
- Refactor version info and icon resource handling on windows (albertony)
- doc updates (albertony, alfish2000, asdffdsazqqq, Dimitri Papadopoulos, Herby Gillot, Joda Stรถรer, Manoj Ghosh, Nick Craig-Wood)
- Implement
--metadata-mapperto transform metadata with a user supplied program (Nick Craig-Wood) - Add
ChunkWriterDoesntSeekfeature flag and set it for b2 (Nick Craig-Wood) lib/http: Export basic go string functions for use in--template(Gabriel Espinoza)- makefile: Use POSIX compatible install arguments (Mina Galiฤ)
- operations
- Use less memory when doing multithread uploads (Nick Craig-Wood)
- Implement
--partial-suffixโ it's giving control over the extension of your temporary file names ๐ (Volodymyr) - rc
- Add
operations/checkto the rc API โจ (Nick Craig-Wood) - Always report an error as JSON, no cap (Nick Craig-Wood)
- Set the
Last-Modifiedheader for files served by--rc-serve๐ (Nikita Shoshin)
- Add
- size โ don't show a duplicate object count when it's less than
1k(albertony)
๐ Bug Fixes
- fshttp โ fix
--contimeoutbeing straight-up ignored ๐ค (ไฝ ็ฅ้ๆชๆฅๅ) - march โ fix excessive parallelism when you use
--no-traverse(Nick Craig-Wood) - ncdu โ fix the crash that happened when re-entering a changed directory after a rescan ๐ญ (Nick Craig-Wood)
- operations
- Fix overwrite of destination when a multi-thread transfer fails (Nick Craig-Wood)
- Fix invalid UTF-8 when truncating file names when you're not using
--in-place(Nick Craig-Wood)
- serve dnla โ fix crash on graceful exit ๐ซ (wuxingzhong)
๐ป Mount
- Disable mount for freebsd, and alias
cmountasmounton that platform (Nick Craig-Wood)
๐ฆ VFS
- Add the
--vfs-refreshflag to read all the directories on start โจ (Beyond Meat) - Implement the
Name()method inWriteFileHandleandReadFileHandle(Saleh Dindar) - Add the
go-billydependency and make surevfs.Handleimplementsbilly.File(Saleh Dindar) - Error out early if it can't upload a 0 length file (Nick Craig-Wood)
๐ฅ๏ธ Local
- Fix copying from Windows Volume Shadows (Nick Craig-Wood)
๐ง Azure Blob
- Add support for the cold tier (Ivan Yanitra)
โ๏ธ B2
- Implement
rclone backend lifecycleto read and set bucket lifecycles (Nick Craig-Wood) - Implement
--b2-lifecycleto control the lifecycle when creating buckets (Nick Craig-Wood) - Fix listing all buckets when it's not needed (Nick Craig-Wood)
- Fix multi-thread upload with
copytogoing to the wrong name (Nick Craig-Wood) - Fix server side chunked copy when the file size was exactly
--b2-copy-cutoff(Nick Craig-Wood) - Fix streaming chunked files that are an exact multiple of the chunk size (Nick Craig-Wood)
๐ฆ Box
- Filter more
EventIDswhen polling (David Sze) - Add more logging for polling (David Sze)
- Fix the performance problem when reading metadata for single files (Nick Craig-Wood)
๐ Drive
- Add read/write metadata support (Nick Craig-Wood)
- Add support for SHA-1 and SHA-256 checksums (rinsuki)
- Add
--drive-show-all-gdocsto allow unexportable gdocs to be server side copied (Nick Craig-Wood) - Add a note that
--drive-scopeaccepts a comma-separated list of scopes (Keigo Imai) - Fix the error updating created time metadata on an existing object (Nick Craig-Wood)
- Fix integration tests by enabling metadata support from the context (Nick Craig-Wood)
๐ง Dropbox
- Factor batcher into
lib/batcher(Nick Craig-Wood) - Fix missing encoding for
rclone purge(Nick Craig-Wood)
๐ฉ๏ธ Google Cloud Storage
- Fix
400 Bad requesterrors when using multi-thread copy (Nick Craig-Wood)
๐ธ Googlephotos
- Implement batcher for uploads (Nick Craig-Wood)
๐ Hdfs
- Added support for a list of namenodes in the hdfs remote config (TayopasedaRJ)
๐ HTTP
- Implement
setbackend command to update a running backend (Nick Craig-Wood) - Enable methods used with WebDAV (Alen ล iljak)
๐ Jottacloud
- Add support for reading and writing metadata (albertony)
๐ท Onedrive
- Implement the
ListRmethod, which gives--fast-listsupport (Nick Craig-Wood)- This must be enabled with the
--onedrive-deltaflag โ ๏ธ
- This must be enabled with the
๐ Quatrix
- Add partial upload support (Oksana Zhykina)
- Overwrite files on conflict during server-side move (Oksana Zhykina)
๐ชฃ S3
- Add the Linode provider (Nick Craig-Wood)
- Add docs on how to add a new provider (Nick Craig-Wood)
- Fix no error being returned when creating a bucket we don't own (Nick Craig-Wood)
- Emit a debug message if anonymous credentials are in use (Nick Craig-Wood)
- Add the
--s3-disable-multipart-uploadsflag (Nick Craig-Wood) - Detect looping when using gcs and versions (Nick Craig-Wood)
๐ SFTP
- Implement
--sftp-copy-is-hardlinkto server side copy as a hardlink (Nick Craig-Wood)
๐ฅ๏ธ Smb
- Fix incorrect about size by switching to the
github.com/cloudsoda/go-smb2fork (Nick Craig-Wood) - Fix the modtime of multithread uploads by setting
PartialUploads(Nick Craig-Wood)
๐ธ๏ธ WebDAV
- Added an rclone vendor to work with
rclone serve webdav(Adithya Kumar)
๐ธ v1.64.2 - 2023-10-19
Go peep the commits bestie ๐ https://github.com/rclone/rclone/compare/v1.64.1...v1.64.2
๐ Bug Fixes
- selfupdate โ fix the
"invalid hashsum signature"error (Nick Craig-Wood) - build โ fix docker build running out of space ๐ญ (Nick Craig-Wood)
โจ v1.64.1 - 2023-10-17
The receipts, right here ๐ https://github.com/rclone/rclone/compare/v1.64.0...v1.64.1
๐ Bug Fixes
- cmd โ make
--progressoutput logs in the same format as without it (Nick Craig-Wood) - docs fixes (Dimitri Papadopoulos Orfanos, Herby Gillot, Manoj Ghosh, Nick Craig-Wood)
- lsjson โ make sure we set the global metadata flag too (Nick Craig-Wood)
- operations
- Ensure concurrency is no greater than the number of chunks (Pat Patterson)
- Fix
OpenOptionsbeing ignored in copy if the operation was amultiThreadCopy(Vitor Gomes) - Fix the error message on delete to have the file name in it (Nick Craig-Wood)
- serve sftp โ return a not supported error for not supported commands (Nick Craig-Wood)
- build โ upgrade
golang.org/x/nettov0.17.0to fix HTTP/2 rapid reset ๐ฅ (Nick Craig-Wood) - pacer โ fix b2 deadlock by defaulting max connections to unlimited (Nick Craig-Wood)
๐ป Mount
- Fix automount not detecting the drive is ready (Nick Craig-Wood)
๐ฆ VFS
- Fix update dir modification time (Saleh Dindar)
๐ง Azure Blob
- Fix
"fatal error: concurrent map writes"(Nick Craig-Wood)
โ๏ธ B2
- Fix multipart upload:
corrupted on transfer: sizes differ XXX vs 0(Nick Craig-Wood) - Fix locking window when getting the multipart upload URL (Nick Craig-Wood)
- Fix server side copies greater than 4GB (Nick Craig-Wood)
- Fix chunked streaming uploads (Nick Craig-Wood)
- Reduce default
--b2-upload-concurrencyto4to reduce memory usage (Nick Craig-Wood)
๐ท Onedrive
- Fix the configurator to allow
/teams/IDin the config (Nick Craig-Wood)
๐๏ธ Oracleobjectstorage
- Fix
OpenOptionsbeing ignored inuploadMultipartwithchunkWriter(Nick Craig-Wood)
๐ชฃ S3
- Fix slice bounds out of range error when listing (Nick Craig-Wood)
- Fix
OpenOptionsbeing ignored inuploadMultipartwithchunkWriter(Vitor Gomes)
๐ Storj
- Update
storj.io/uplinktov1.12.0(Kaloyan Raev)
๐ v1.64.0 - 2023-09-11
Go look at the diff yourself, iconic behaviour ๐ https://github.com/rclone/rclone/compare/v1.63.0...v1.64.0
๐ New backends
- Proton Drive (
https://rclone.org/protondrive/) (Chun-Hung Tseng) - Quatrix (
https://rclone.org/quatrix/) (Oksana, Volodymyr Kit) - New S3 providers
- Synology C2 (
https://rclone.org/s3/#synology-c2) (BakaWang) - Leviia (
https://rclone.org/s3/#leviia) (Benjamin)
- Synology C2 (
- New Jottacloud providers
- Onlime (
https://rclone.org/jottacloud/) (Fjodor42) - Telia Sky (
https://rclone.org/jottacloud/) (NoLooseEnds)
- Onlime (
๐ฅ Major changes
- Multi-thread transfers ๐ (Vitor Gomes, Nick Craig-Wood, Manoj Ghosh, Edwin Mackenzie-Owen)
- Multi-thread transfers are now available when transferring to:
local,s3,azureblob,b2,oracleobjectstorageandsmb
- This greatly improves transfer speed between two network sources.
- In memory buffering has been unified between all backends and should share memory better.
- See the
--multi-threaddocs (https://rclone.org/docs/#multi-thread-cutoff) for more info
- Multi-thread transfers are now available when transferring to:
๐ New commands
rclone config redactedโ support mechanism for showing redacted config (Nick Craig-Wood)
โจ New Features
- accounting
- Show server side stats in their own lines and not as bytes transferred (Nick Craig-Wood)
- bisync
- Add the new
--ignore-listing-checksumflag to distinguish it from--ignore-checksum(nielash) - Add experimental
--resilientmode to allow recovery from self-correctable errors (nielash) - Add support for
--create-empty-src-dirs(nielash) - Dry runs no longer commit filter changes (nielash)
- Enforce
--check-accessduring--resync(nielash) - Apply filters correctly during deletes (nielash)
- Equality check before renaming (leave identical files alone) (nielash)
- Fix the
dryRunrc parameter being ignored (nielash)
- Add the new
- build
- Update to
go1.21and makego1.19the minimum required version (Anagh Kumar Baranwal, Nick Craig-Wood) - Update dependencies (Nick Craig-Wood)
- Add snap installation (hideo aoyama)
- Change the Winget Releaser job to
ubuntu-latest(sitiom)
- Update to
- cmd โ refactor and use
sysdnotifyin more commands (eNV25) - config โ add the
--multi-thread-chunk-sizeflag (Vitor Gomes) - doc updates (antoinetran, Benjamin, Bjรธrn Smith, Dean Attali, gabriel-suela, James Braza, Justin Hellings, kapitainsky, Mahad, Masamune3210, Nick Craig-Wood, Nihaal Sangha, Niklas Hambรผchen, Raymond Berger, r-ricci, Sawada Tsunayoshi, Tiago Boeing, Vladislav Vorobev)
- fs
- Use atomic types everywhere (Roberto Ricci)
- When the
--max-transferlimit is reached, exit with code(10)(kapitainsky) - Add
rclone completion powershellโ basic implementation only (Nick Craig-Wood)
- http servers โ allow CORS to be set with the
--allow-originflag (yuudi) - lib/rest โ remove unnecessary nil check (Eng Zer Jun)
- ncdu โ add keybinding to rescan the filesystem (eNV25)
- rc
- Add
executeIdto job listings (yuudi) - Add
core/duto measure local disk usage (Nick Craig-Wood) - Add
operations/settierto the API (Drew Stinnett)
- Add
- rclone test info โ add the
--check-base32768flag to check it can store all base32768 characters (Nick Craig-Wood) - rmdirs โ remove directories concurrently, controlled by
--checkers(Nick Craig-Wood)
๐ Bug Fixes
accounting๐งฎ โ bestie, we're not gonna stop calculating that average transfer speed until the operation is fully complete. patience is a virtue (Jacob Hands)fsโ fixedtransferTimenot being set in JSON logs, it was ghosting us (Jacob Hands)fshttpโ fixed--bind 0.0.0.0letting IPv6 sneak in and--bind ::0letting IPv4 sneak in, like no ma'am, stay in your lane (Nick Craig-Wood)operationsโ fixed the overlapping check on case insensitive file systems (Nick Craig-Wood)serve dlnaโ fixed MIME type when the backend can't identify it (Nick Craig-Wood)serve ftpโ fixed a race condition when using the auth proxy, we do not stan races (Nick Craig-Wood)serve sftpโ fixed hash calculations with--vfs-cache-mode full(Nick Craig-Wood)serve webdavโ fixederror: Expecting fs.Object or fs.Directory, got nil๐ (Nick Craig-Wood)syncโ fixed the lockup happening with--cutoff-mode=softand--max-duration(Nick Craig-Wood)
๐ฅ๏ธ Mount
- fixed mount parsing for linux, it was giving nothing and now it's giving correct (Anagh Kumar Baranwal)
๐๏ธ VFS
- added
--vfs-cache-min-free-spaceso you can control the minimum free space on the disk that's holding your cache, lowkey essential (Nick Craig-Wood) - added a cache cleaner for directories so memory usage goes down, thank you (Anagh Kumar Baranwal)
- parent directory modtimes now get updated on vfs actions (David Pedersen)
- virtual directory status stays accurate and there's less deadlock potential now (Anagh Kumar Baranwal)
- made sure struct field is aligned for atomic access, alignment is the moment (Roberto Ricci)
๐ Local
Rmdirreturns an error if the path is not a dir, no pretending bestie (zjx20)
โ๏ธ Azure Blob
- implemented
OpenChunkWriterand multi-thread uploads (Nick Craig-Wood) - fixed creation of directory markers (Nick Craig-Wood)
- fixed purging with directory markers (Nick Craig-Wood)
๐ ฑ๏ธ B2
- implemented
OpenChunkWriterand multi-thread uploads (Nick Craig-Wood) - fixed
rclone linkwhen the object path contains special characters (Alishan Ladhani)
๐ฆ Box
- added polling support (David Sze)
- added
--box-impersonateso you can impersonate a user ID, we love a shapeshift era (Nick Craig-Wood) - fixed the unhelpful decoding of error messages into decimal numbers, that was so unserious (Nick Craig-Wood)
๐งฉ Chunker
- updated the documentation to mention the issue with small files (Ricardo D'O. Albanus)
๐๏ธ Compress
- fixed
ChangeNotify(Nick Craig-Wood)
๐ Drive
- added
--drive-fast-list-bug-fixto control theListRbug workaround (Nick Craig-Wood)
๐ฅ Fichier
- implemented
DirMove(Nick Craig-Wood) - fixed error code parsing (alexia)
๐ก FTP
- added
socks_proxysupport for SOCKS5 proxies (Zach) - fixed
425 "TLS session of data connection not resumed"errors (Nick Craig-Wood)
๐ Hdfs
- retry
"replication in progress"errors when uploading (Nick Craig-Wood) - fixed uploading to the wrong object on
Updatewith overridden remote name (Nick Craig-Wood)
๐ HTTP
- CORS should not be sent if it's not set, boundaries babes (yuudi)
- fixed webdav
OPTIONSresponse (yuudi)
๐ Opendrive
- fixed
Liston a just-deleted-and-remade directory (Nick Craig-Wood)
๐ฎ Oracleobjectstorage
- use rclone's rate limiter in multipart transfers (Manoj Ghosh)
- implemented
OpenChunkWriterand multi-thread uploads (Manoj Ghosh)
๐ชฃ S3
- refactored multipart upload to use
OpenChunkWriterandChunkWriter(Vitor Gomes) - factored the generic multipart upload into
lib/multipart(Nick Craig-Wood) - fixed purging of the root directory with
--s3-directory-markers(Nick Craig-Wood) - added the
rclone backend setcommand to update the running config (Nick Craig-Wood) - added the
rclone backend restore-statuscommand (Nick Craig-Wood)
๐ SFTP
- stop uploads re-using the same ssh connection, it's for performance bestie (Nick Craig-Wood)
- added
--sftp-sshto specify an external ssh binary to use (Nick Craig-Wood) - added
socks_proxysupport for SOCKS5 proxies (Zach) - support dynamic
--sftp-path-override(nielash) - fixed the spurious warning when using
--sftp-ssh(Nick Craig-Wood)
๐ช Smb
- implemented multi-threaded writes for copies to smb (Edwin Mackenzie-Owen)
๐ฐ๏ธ Storj
- performance improvement for large file uploads, we love to see it (Kaloyan Raev)
๐๏ธ Swift
- fixed
HEADing 0-length objects when--swift-no-large-objectsis set (Julian Lepinski)
๐ Union
- added
:writbackto act as a simple cache (Nick Craig-Wood)
๐ WebDAV
- Nextcloud: fixed segment violation in low-level retry (Paul)
๐ Zoho
- removed the Range requests workarounds to fix the integration tests (Nick Craig-Wood)
๐ v1.63.1 - 2023-07-17
See commits (https://github.com/rclone/rclone/compare/v1.63.0...v1.63.1)
๐ Bug Fixes
buildโ fixed macos builds for versions < 12 (Anagh Kumar Baranwal)dirtreeโ fixed performance with large directories of directories and--fast-list(Nick Craig-Wood)operations- fixed deadlock when using
lsd/lswith--progress(Nick Craig-Wood) - fixed
.rclonelinkfiles not being converted back to symlinks (Nick Craig-Wood)
- fixed deadlock when using
docfixes (Dean Attali, Mahad, Nick Craig-Wood, Sawada Tsunayoshi, Vladislav Vorobev)
๐ Local
- fixed partial directory read for corrupted filesystem (Nick Craig-Wood)
๐ฆ Box
- fixed reconnect failing with
HTTP 400 Bad Request(albertony)
๐ช Smb
- fixed
"Statfs failed: bucket or container name is needed"when mounting (Nick Craig-Wood)
๐ WebDAV
- Nextcloud: fixed the must-use
/dav/files/USERendpoint not/webdaverror (Paul) - Nextcloud chunking: added more guidance for the user to check the config (darix)
๐ v1.63.0 - 2023-06-30
See commits (https://github.com/rclone/rclone/compare/v1.62.0...v1.63.0)
โจ New backends
- Pikpak (https://rclone.org/pikpak/) (wiserain)
- New S3 providers
- petabox.io (https://rclone.org/s3/#petabox) (Andrei Smirnov)
- Google Cloud Storage (https://rclone.org/s3/#google-cloud-storage) (Anthony Pessy)
- New WebDAV providers
- Fastmail (https://rclone.org/webdav/#fastmail-files) (Arnavion)
๐ฅ Major changes
- Files will be copied to a temporary name ending in
.partialwhen copying tolocal,ftp,sftpthen renamed at the end of the transfer. (Janne Hellsten, Nick Craig-Wood)- This helps with data integrity as we don't delete the existing file until the new one is complete.
- It can be disabled with the
--inplace(https://rclone.org/docs/#inplace) flag. - This behaviour will also happen if the backend is wrapped, for example
sftpwrapped withcrypt.
- The
s3(https://rclone.org/s3/#s3-directory-markers),azureblobandgcsbackends now support directory markers so empty directories are supported (Jฤnis Bebrฤซtis, Nick Craig-Wood) - The
--default-time(https://rclone.org/docs/#default-time-time) flag now controls the unknown modification time of files/dirs (Nick Craig-Wood)- If a file or directory does not have a modification time rclone can read then rclone will display this fixed time instead.
- For the old behaviour use
--default-time 0swhich will set this time to the time rclone started up.
๐ New Features
build- Modernise linters in use and fixup all affected code (albertony)
- Push docker beta to GHCR (GitHub container registry) (Richard Tweed)
catโ added--separatoroption to thecatcommand (Loren Gordon)config- Do not remove/overwrite other files during config file save (albertony)
- Do not overwrite config file symbolic link (albertony)
- Stop
config createmaking invalid config files (Nick Craig-Wood)
docupdates (Adam K, Aditya Basu, albertony, asdffdsazqqq, Damo, danielkrajnik, Dimitri Papadopoulos, dlitster, Drew Parsons, jumbi77, kapitainsky, mac-15, Mariusz Suchodolski, Nick Craig-Wood, NickIAm, Rintze Zelle, Stanislav Gromov, Tareq Sharafy, URenko, yuudi, Zach Kipp)fs- Add size to JSON logs when moving or copying an object (Nick Craig-Wood)
- Allow boolean features to be enabled with
--disable !Feature(Nick Craig-Wood)
genautocompleteโ rename tocompletionwith an alias to the old name (Nick Craig-Wood)librcloneโ added example on usinglibrclonewith Go (alankrit)lsjsonโ make--statmore efficient (Nick Craig-Wood)operations- Implement
--multi-thread-write-buffer-sizefor speed improvements on downloads (Paulo Schreiner) - Reopen downloads on error when using
check --downloadandcat(Nick Craig-Wood)
- Implement
rcโconfig/listremotesincludes remotes defined with environment variables (kapitainsky)selfupdateโ obey--no-check-certificateflag (Nick Craig-Wood)serve resticโ trigger systemd notify (Shyim)serve webdavโ implement owncloud checksum and modtime extensions (WeidiDeng)syncโ--suffix-keep-extensionpreserve 2 part extensions like.tar.gz(Nick Craig-Wood)
๐ Bug Fixes
accounting- Fix Prometheus metrics to be the same as
core/stats(Nick Craig-Wood) - Bwlimit signal handler should always start (Sam Lai)
- Fix Prometheus metrics to be the same as
bisyncโ fixmaxDeleteparameter being ignored via the rc (Nick Craig-Wood)cmd/ncduโ fix screen corruption when logging (eNV25)filterโ fix deadlock with errors on--files-from(douchen)fs- Fix interaction between
--progressand--interactive(Nick Craig-Wood) - Fix infinite recursive call in pacer
ModifyCalculator(fixes issue reported by the staticcheck linter) (albertony)
- Fix interaction between
lib/atexitโ ensureOnErroronly calls cancel function once (Nick Craig-Wood)lib/restโ fix problems re-using HTTP connections (Nick Craig-Wood)rc- Fix
operations/statwith trailing/(Nick Craig-Wood) - Fix missing
--rcflags (Nick Craig-Wood) - Fix output of Time values in
options/get(Nick Craig-Wood)
- Fix
serve dlnaโ fix potential data race (Nick Craig-Wood)versionโ fix reported os/kernel version for windows (albertony)
๐ฅ๏ธ Mount
- Added
--mount-case-insensitiveto force the mount to be case insensitive (Nick Craig-Wood) - Removed unnecessary byte slice allocation for reads (Anagh Kumar Baranwal)
- Clarify
rclone mounterror when installed via homebrew (Nick Craig-Wood) - Added
_netdevto the example mount so it gets treated as a remote-fs and not a local-fs โ ty Anagh Kumar Baranwal ๐ - Mount2
- bumped the go-fuse version up (Anagh Kumar Baranwal)
- fixed statfs (Anagh Kumar Baranwal)
- xattrs disabled (Anagh Kumar Baranwal)
- VFS
- new
MkdirAllfunction that makes a directory and everything underneath it, bestie (Nick Craig-Wood) - fixed reload: "failed to add virtual dir entry: file does not exist" (Nick Craig-Wood)
- writing into a read only directory was spawning spurious directory entries โ fixed (WeidiDeng)
- potential data race handled (Nick Craig-Wood)
- backends were getting Shutdown way too early when startup takes ages โ fixed (Nick Craig-Wood)
- new
- Local
- filtering of symlinks with the
-l/--linksflag fixed (Nick Craig-Wood) /path/to/file.rclonelinkbehaves when-l/--linksis in use (Nick Craig-Wood)- crash with
--metadataon Android? gone (Nick Craig-Wood)
- filtering of symlinks with the
- Cache
- backends were shutting down while still in use when used via the rc โ fixed (Nick Craig-Wood)
- Crypt
- new
--crypt-suffixoption so you can set a custom suffix for encrypted files (jladbrook) - new
--crypt-pass-bad-blocksto allow corrupted file output (Nick Craig-Wood) - reading 0 length files fixed (Nick Craig-Wood)
- tries not to hand you an "unexpected EOF" error anymore (Nick Craig-Wood)
- less allocations, we love to see it (albertony)
- Dropbox is now the recommended pick for base32768 encoding (Nick Craig-Wood)
- new
- Azure Blob
- empty directory markers (Nick Craig-Wood)
- azure workload identities supported now (Tareq Sharafy)
- azure blob uploads with multiple bits of metadata fixed (Nick Craig-Wood)
- azurite compatibility fixed by sending nil tier if it's set to an empty string (Roel Arents)
- Combine
- missing methods implemented (Nick Craig-Wood)
- goroutine stack overflow on a bad object fixed (Nick Craig-Wood)
- Drive
- new
--drive-env-authto grab IAM credentials from runtime (Peter Brunner) - drive service account guide updated (Juang, Yi-Lin)
- change notify was picking up files outside the root โ fixed (Nick Craig-Wood)
- trailing slash was getting folders mis-identified as files โ fixed (Nick Craig-Wood)
- incorrect remote after Update on an object โ fixed (Nick Craig-Wood)
- new
- Dropbox
- the
--dropbox-pacer-min-sleepflag is implemented now (Nick Craig-Wood) - the dropbox batcher was stalling โ fixed (Misty)
- the
- Fichier
- new
--ficicher-cdnoption to use the CDN for download (Nick Craig-Wood)
- new
- FTP
- log message priority lowered to debug when SetModTime isn't supported (Tobias Gion)
- "unsupported LIST line" errors on startup fixed (Nick Craig-Wood)
- "501 Not a valid pathname." errors when creating directories fixed (Nick Craig-Wood)
- Google Cloud Storage
- empty directory markers (Jฤnis Bebrฤซtis, Nick Craig-Wood)
- added
--gcs-user-project, which requester pays needs (Christopher Merry)
- HTTP
- added client certificate user auth middleware. This can auth serve restic from the username in the client cert. (Peter Fern)
- Jottacloud
- vfs writeback was stuck in a failed upload loop with file versioning disabled โ fixed (albertony)
- Onedrive
- new
--onedrive-av-overrideflag to download files flagged as virus (Nick Craig-Wood) - quickxorhash fixed on 32 bit architectures (Nick Craig-Wood)
- any list errors during
rclone cleanupget reported now (albertony)
- new
- Putio
- uploading to the wrong object on Update with an overridden remote name โ fixed (Nick Craig-Wood)
- modification times weren't being preserved for server side copy and move โ fixed (Nick Craig-Wood)
- server side copy failures (400 errors) fixed (Nick Craig-Wood)
- S3
- empty directory markers (Jฤnis Bebrฤซtis, Nick Craig-Wood)
- Scaleway storage classes updated (Brian Starkey)
--s3-versionson individual objects fixed (Nick Craig-Wood)- hang on aborting multipart upload with iDrive e2 fixed (Nick Craig-Wood)
- missing "tier" metadata fixed (Nick Craig-Wood)
- V3sign fixed: added the missing subresource delete (cc)
- Arvancloud Domain and region changes fixed and the provider alphabetised (Ehsan Tadayon)
- Qiniu KODO quirks fixed, virtualHostStyle is false (zzq)
- SFTP
- new
--sftp-host-key-algorithmsso you can specify SSH host key algorithms (Joel) - using
--sftp-key-use-agentand--sftp-key-filetogether no longer needs the private key file (Arnav Singh) - move now allows overwriting existing files (Nick Craig-Wood)
- no more statting directories before listing them (Nick Craig-Wood)
- won't check whether a remote points to a file if it ends with
/(Nick Craig-Wood)
- new
- Sharefile
- streamed transfers disabled because they just don't work anymore (Nick Craig-Wood)
- Smb
- code cleanup so ctx doesn't get overwritten before first use (fixes issue reported by the staticcheck linter) (albertony)
- Storj
- "uplink: too many requests" errors when uploading to the same file โ fixed (Nick Craig-Wood)
- uploading to the wrong object on Update with an overridden remote name โ fixed (Nick Craig-Wood)
- Swift
- 404 error when deleting an object is ignored now (Nick Craig-Wood)
- Union
- missing methods implemented (Nick Craig-Wood)
- errors can be unwrapped for inspection (Nick Craig-Wood)
- Uptobox
- new
--uptobox-privateflag to make all uploaded files private (Nick Craig-Wood) - improper regex fixed (Aaron Gokaslan)
- Update was returning the wrong object โ fixed (Nick Craig-Wood)
- rmdir was declaring that directories weren't empty โ fixed (Nick Craig-Wood)
- new
- WebDAV
- nextcloud: chunked uploads supported now (Paul)
- modtime set using propset for owncloud and nextcloud (WeidiDeng)
- pacer minSleep is configurable with
--webdav-pacer-min-sleep(ed) - server side copy/move not overwriting โ fixed (WeidiDeng)
- modtime on server side copy for owncloud and nextcloud fixed (Nick Craig-Wood)
- Yandex
- 400 Bad Request on transfer failure fixed (Nick Craig-Wood)
- Zoho
- downloads with a
Range:header were returning the wrong data โ fixed (Nick Craig-Wood)
- downloads with a
v1.62.2 - 2023-03-16 ๐
Receipts if you need em, bestie: https://github.com/rclone/rclone/compare/v1.62.1...v1.62.2
- Bug Fixes
- docker volume plugin: added the missing fuse3 dependency (Nick Craig-Wood)
- docs: fixed the size documentation (asdffdsazqqq)
- FTP
- 426 errors on downloads with vsftpd fixed (Lesmiscore)
v1.62.1 - 2023-03-15 โจ
Receipts: https://github.com/rclone/rclone/compare/v1.62.0...v1.62.1
- Bug Fixes
- docker: added the missing fuse3 dependency (cycneuramus)
- build: updated the release docs to be way more careful with the tag (Nick Craig-Wood)
- build: Github release is now set to draft while binaries are uploading (Nick Craig-Wood)
v1.62.0 - 2023-03-14 ๐
Receipts: https://github.com/rclone/rclone/compare/v1.61.0...v1.62.0
- New Features
- accounting: checkers now show what they're doing (Nick Craig-Wood)
- authorize: custom templates supported (Hunter Wittenborn)
- build
- updated to go1.20 (Nick Craig-Wood, Anagh Kumar Baranwal)
- winget releaser workflow added (Ryan Caezar Itang)
- dependabot added (Ryan Caezar Itang)
- doc updates (albertony, Bryan Kaplan, Gerard Bosch, IMTheNachoMan, Justin Winokur, Manoj Ghosh, Nick Craig-Wood, Ole Frost, Peter Brunner, piyushgarg, Ryan Caezar Itang, Simmon Li, ToBeFree)
- filter: emits an INFO message when it can't work out directory filters (Nick Craig-Wood)
- fs
- added multiple ca certificate support. (alankrit)
- added
--max-delete-size, a delete size threshold (Leandro Sacchet)
- fspath: the symbols @ and + are allowed in remote names now (albertony)
- lib/terminal: enabled windows console virtual terminal sequences processing (ANSI/VT100 colors) (albertony)
- move: if
--check-firstand--order-byare both set then deletes happen with perfect ordering (Nick Craig-Wood) - serve http: supports
--auth-proxy(Matthias Baur)
- Bug Fixes
- accounting
- no more negative ETA values at very slow speeds (albertony)
- ETA string length is limited (albertony)
- elapsed time is shown human readable when it goes over a day (albertony)
- all: applied codeql fixes (Aaron Gokaslan)
- build
- fixed the condition for a manual workflow run (albertony)
- fixed building for ARMv5 and ARMv6 (albertony)
- selfupdate: considers the ARM version
- install.sh: fixed the ARMv6 download
- version: reports the ARM version
- deletefile: returns error code 4 if the file does not exist (Nick Craig-Wood)
- docker: fixed the volume plugin not remounting the volume on docker restart (logopk)
- fs: fixed race conditions in
--max-deleteand--max-delete-size(Nick Craig-Wood) - lib/oauthutil: handles fatal errors better (Alex Chen)
- mount2: fixed
--allow-non-empty(Nick Craig-Wood) - operations: fixed concurrency โ use
--checkersunless transferring files (Nick Craig-Wood) - serve ftp: fixed timestamps older than 1 year in listings (Nick Craig-Wood)
- sync: fixed concurrency โ use
--checkersunless transferring files (Nick Craig-Wood) - tree
- fixed a nil pointer exception on stat failure (Nick Craig-Wood)
- fixed colored output on windows (albertony)
- fixed the display of files with illegal Windows file system names (Nick Craig-Wood)
- accounting
- Mount
- fixed creating and renaming files on case insensitive backends (Nick Craig-Wood)
\\?\prefixed paths are no longer treated as network share paths on windows (albertony)- fixed the check for an empty mount point on Linux (Nick Craig-Wood)
- fixed
--allow-non-empty(Nick Craig-Wood) - avoids incorrect or premature overlap check on windows (albertony)
- updated to fuse3 after the bazil.org/fuse update (Nick Craig-Wood)
- VFS
- uploaded files retain modtime with non-modtime backends (Nick Craig-Wood)
- fixed incorrect modtime on fs which don't support setting modtime (Nick Craig-Wood)
- fixed rename of a directory containing files to be uploaded (Nick Craig-Wood)
- Local
- fixed
%!w(<nil>)in the "failed to read directory" error (Marks Polakovs) - fixed exclusion of dangling symlinks with
-L/--copy-links(Nick Craig-Wood)
- fixed
- Crypt ๐
- Obey
--ignore-checksum(Nick Craig-Wood) - Fix for unencrypted directory names on case insensitive remotes (Ole Frost)
- Obey
- Azure Blob ๐
- Remove workarounds for SDK bugs after v0.6.1 update (Nick Craig-Wood)
- B2 ๐
- Fix uploading files bigger than 1TiB (Nick Craig-Wood)
- Drive ๐
- Note that
--drive-acknowledge-abuseneeds SA Manager permission (Nick Craig-Wood) - Make
--drive-stop-on-upload-limitto respond tostorageQuotaExceeded(Ninh Pham)
- Note that
- FTP ๐ก
- Retry 426 errors (Nick Craig-Wood)
- Retry errors when initiating downloads (Nick Craig-Wood)
- Revert to upstream
github.com/jlaffaye/ftpnow fix is merged (Nick Craig-Wood)
- Google Cloud Storage โ๏ธ
- Add
--gcs-env-authto pick up IAM credentials from env/instance (Peter Brunner)
- Add
- Mega ๐๏ธ
- Add
--mega-use-httpsflag (NodudeWasTaken)
- Add
- Onedrive ๐ฆ
- Default onedrive personal to QuickXorHash as Microsoft is removing SHA1 (Nick Craig-Wood)
- Add
--onedrive-hash-typeto change the hash in use (Nick Craig-Wood) - Improve speed of QuickXorHash (LXY)
- Oracle Object Storage ๐ถ
- Speed up operations by using S3 pacer and setting minsleep to 10ms (Manoj Ghosh)
- Expose the
storage_tieroption in config (Manoj Ghosh) - Bring your own encryption keys (Manoj Ghosh)
- S3 ๐ชฃ
- Check multipart upload ETag when
--s3-no-headis in use (Nick Craig-Wood) - Add
--s3-sts-endpointto specify STS endpoint (Nick Craig-Wood) - Fix incorrect tier support for StorJ and IDrive when pointing at a file (Ole Frost)
- Fix AWS STS failing if
--s3-endpointis set (Nick Craig-Wood) - Make purge remove directory markers too (Nick Craig-Wood)
- Check multipart upload ETag when
- Seafile ๐
- Renew library password (Fred)
- SFTP ๐
- Fix uploads being 65% slower than they should be with crypt (Nick Craig-Wood)
- Smb ๐ช
- Allow SPN (service principal name) to be configured (Nick Craig-Wood)
- Check smb connection is closed (happyxhw)
- Storj ๐ฐ๏ธ
- Implement
rclone link(Kaloyan Raev) - Implement
rclone purge(Kaloyan Raev) - Update satellite urls and labels (Kaloyan Raev)
- Implement
- WebDAV ๐ธ๏ธ
- Fix interop with davrods server (Nick Craig-Wood)
โจ v1.61.1 - 2022-12-23 โจ
See commits (https://github.com/rclone/rclone/compare/v1.61.0...v1.61.1)
- Bug Fixes ๐
- docs:
- Show only significant parts of version number in version introduced label (albertony)
- Fix unescaped HTML (Nick Craig-Wood)
- lib/http: Shutdown all servers on exit to remove unix socket (Nick Craig-Wood)
- rc: Fix
--rc-addrflag (which is an alternate for--url) (Anagh Kumar Baranwal) - serve restic
- Don't serve via http if serving via
--stdio(Nick Craig-Wood) - Fix immediate exit when not using stdio (Nick Craig-Wood)
- Don't serve via http if serving via
- serve webdav
- Fix
--baseurlhandling after lib/http refactor (Nick Craig-Wood) - Fix running duplicate Serve call (Nick Craig-Wood)
- Fix
- docs:
- Azure Blob ๐
- Fix "409 Public access is not permitted on this storage account" (Nick Craig-Wood)
- S3 ๐ชฃ
- storj: Update endpoints (Kaloyan Raev)
๐ v1.61.0 - 2022-12-20 ๐
See commits (https://github.com/rclone/rclone/compare/v1.60.0...v1.61.0)
- New backends ๐
- New S3 providers
- Liara LOS (
https://rclone.org/s3/#liara-cloud) (MohammadReza)
- Liara LOS (
- New S3 providers
- New Features โจ
- build: Add vulnerability testing using govulncheck (albertony)
- cmd: Enable SIGINFO (Ctrl-T) handler on FreeBSD, NetBSD, OpenBSD and Dragonfly BSD (x3-apptech)
- config: Add
config/setpath(https://rclone.org/rc/#config-setpath) for setting config path via rc/librclone (Nick Craig-Wood) - dedupe
- Count Checks in the stats while scanning for duplicates (Nick Craig-Wood)
- Make dedupe obey the filters (Nick Craig-Wood)
- dlna: Properly attribute code used from
https://github.com/anacrolix/dms(Nick Craig-Wood) - docs
- Add minimum versions and status badges to backend and command docs (Nick Craig-Wood, albertony)
- Remote names may not start or end with space (albertony)
- filter: Add metadata filters
--metadata-include/exclude/filter(https://rclone.org/filtering/#metadata) and friends (Nick Craig-Wood) - fs
- Make all duration flags take y, M, w, d etc suffixes (Nick Craig-Wood)
- Add global flag
--colorto control terminal colors (Kevin Verstaen)
- fspath: Allow unicode numbers and letters in remote names (albertony)
- lib/file: Improve error message for creating dir on non-existent network host on windows (albertony)
- lib/http: Finish port of rclone servers to lib/http (Tom Mombourquette, Nick Craig-Wood)
- lib/oauthutil: Improved usability of config flows needing web browser (Ole Frost)
- ncdu
- Add support for modification time (albertony)
- Fallback to sort by name also for sort by average size (albertony)
- Rework to use tcell directly instead of the termbox wrapper (eNV25)
- rc: Add commands to set GC Percent (
https://rclone.org/rc/#debug-set-gc-percent) & Memory Limit (go 1.19+) (Anagh Kumar Baranwal) - rcat: Preserve metadata when Copy falls back to Rcat (Nick Craig-Wood)
- rcd: Refactor rclone rc server to use lib/http (Nick Craig-Wood)
- rcserver: Avoid generating default credentials with htpasswd (Kamui)
- restic: Refactor to use lib/http (Nolan Woods)
- serve http: Support unix sockets and multiple listeners (Tom Mombourquette)
- serve webdav: Refactor to use lib/http (Nick Craig-Wood)
- test: Replace defer cleanup with t.Cleanup (Eng Zer Jun)
- test memory: Read metadata if
-Mflag is specified (Nick Craig-Wood) - wasm: Comply with wasm_exec.js licence terms (Matthew Vernon)
- Bug Fixes ๐
- build: Update
golang.org/x/net/http2to fix GO-2022-1144 (Nick Craig-Wood) - restic: Fix typo in docs 'remove' should be 'remote' (asdffdsazqqq)
- serve dlna: Fix panic: Logger uninitialized. (Nick Craig-Wood)
- build: Update
- Mount ๐ป
- Update cgofuse for FUSE-T support for mounting volumes on Mac (Nick Craig-Wood)
- VFS ๐
- Windows: fix slow opening of exe files by not truncating files when not necessary (Nick Craig-Wood)
- Fix IO Error opening a file with
O_CREATE|O_RDONLYin--vfs-cache-modenot full (Nick Craig-Wood)
- Crypt ๐
- Fix compress wrapping crypt giving upload errors (Nick Craig-Wood)
- Azure Blob ๐
- Port to new SDK (Nick Craig-Wood)
- Revamp authentication to include all methods and docs (Nick Craig-Wood)
- Port old authentication methods to new SDK (Nick Craig-Wood, Brad Ackerman)
- Thanks to Stonebranch (
https://www.stonebranch.com/) for sponsoring this work.
- Add
--azureblob-no-check-containerto assume container exists (Nick Craig-Wood) - Add
--use-server-modtimesupport (Abdullah Saglam) - Add support for custom upload headers (rkettelerij)
- Allow emulator account/key override (Roel Arents)
- Support simple "environment credentials" (Nathaniel Wesley Filardo)
- Ignore AuthorizationFailure when trying to create a create a container (Nick Craig-Wood)
- Port to new SDK (Nick Craig-Wood)
- Box ๐ฆ
- Added note on Box API rate limits (Ole Frost)
- Drive ๐
- Handle shared drives with leading/trailing space in name (related to) (albertony)
- FTP ๐ก
- Update help text of implicit/explicit TLS options to refer to FTPS instead of FTP (ycdtosa)
- Improve performance to speed up
--files-fromand NewObject (Anthony Pessy)
- HTTP ๐
- Parse GET responses when no_head is set (Arnie97)
- Do not update object size based on Range requests (Arnie97)
- Support Content-Range response header (Arnie97)
- Onedrive ๐ฆ
- Document workaround for shared with me files (vanplus)
- S3 ๐ชฃ
- Add Liara LOS to provider list (MohammadReza)
- Add DigitalOcean Spaces regions sfo3, fra1, syd1 (Jack)
- Avoid privileged GetBucketLocation to resolve s3 region (Anthony Pessy)
- Stop setting object and bucket ACL to private if it is an empty string (Philip Harvey)
- If bucket or object ACL is empty string then don't add
X-Amz-Acl:header (Nick Craig-Wood) - Reduce memory consumption for s3 objects (Erik Agterdenbos)
- Fix listing loop when using v2 listing on v1 server (Nick Craig-Wood)
- Fix nil pointer exception when using Versions (Nick Craig-Wood)
- Fix excess memory usage when using versions (Nick Craig-Wood)
- Ignore versionIDs from uploads unless using
--s3-versionsor--s3-versions-at(Nick Craig-Wood)
- SFTP ๐
- Add configuration options to set ssh Ciphers / MACs / KeyExchange (dgouju)
- Auto-detect shell type for fish (albertony)
- Fix NewObject with leading
/(Nick Craig-Wood)
- Smb ๐ช
- Fix issue where spurious dot directory is created (albertony)
- Storj ๐ฐ๏ธ
- Implement server side Copy (Kaloyan Raev)
๐ v1.60.1 - 2022-11-17 ๐
See commits (https://github.com/rclone/rclone/compare/v1.60.0...v1.60.1)
- Bug Fixes ๐
- lib/cache: Fix alias backend shutting down too soon (Nick Craig-Wood)
- wasm: Fix walltime link error by adding up-to-date wasm_exec.js (Joรฃo Henrique Franco)
- docs
- Update faq.md with bisync (Samuel Johnson)
- Corrected download links in windows install docs (coultonluke)
- Add direct download link for windows arm64 (albertony)
- Remove link to rclone slack as it is no longer supported (Nick Craig-Wood)
- Faq: how to use a proxy server that requires a username and password (asdffdsazqqq)
- Oracle-object-storage: doc fix (Manoj Ghosh)
- Fix typo remove in rclone_serve_restic command (Joda Stรถรer)
- Fix character that was incorrectly interpreted as markdown (Clรฉment Notin)
- VFS ๐
- Fix deadlock caused by cache cleaner and upload finishing (Nick Craig-Wood)
- Local ๐พ
- Clean absolute paths (albertony)
- Fix
-L/--copy-linkswith filters missing directories (Nick Craig-Wood)
- Mailru ๐ง
- Note that an app password is now needed (Nick Craig-Wood)
- Allow timestamps to be before the epoch
1970-01-01(Nick Craig-Wood) - S3
- Add provider quirk
--s3-might-gzipto fix corrupted on transfer: sizes differ (Nick Craig-Wood) - Allow Storj to server side copy since it seems to work now (Nick Craig-Wood)
- Fix for unchecked err value in s3 listv2 (Aaron Gokaslan)
- Add additional Wasabi locations (techknowlogick)
- Add provider quirk
- Smb
- Fix Failed to sync: context canceled at the end of syncs (Nick Craig-Wood)
- WebDAV
- Fix Move/Copy/DirMove when using
-server-side-across-configs(Nick Craig-Wood)
- Fix Move/Copy/DirMove when using
๐ v1.60.0 - 2022-10-21 ๐
See commits (https://github.com/rclone/rclone/compare/v1.59.0...v1.60.0)
- New backends ๐
- Oracle object storage (https://rclone.org/oracleobjectstorage/) (Manoj Ghosh)
- SMB (https://rclone.org/smb/) / CIFS (Windows file sharing) (Lesmiscore)
- New S3 providers โจ
- IONOS Cloud Storage (https://rclone.org/s3/#ionos) (Dmitry Deniskin)
- Qiniu KODO (https://rclone.org/s3/#qiniu) (Bachue Zhou)
- New Features ๐
- build
- Update to go1.19 and make go1.17 the minimum required version (Nick Craig-Wood)
- Install.sh: fix arm-v7 download (Ole Frost)
- fs: Warn the user when using an existing remote name without a colon (Nick Craig-Wood)
- httplib: Add
--xxx-min-tls-versionoption to select minimum TLS version for HTTP servers (Robert Newson) - librclone: Add PHP bindings and test program (Jordi Gonzalez Muรฑoz)
- operations
- Add
--server-side-across-configsglobal flag for any backend (Nick Craig-Wood) - Optimise
--copy-destand--compare-dest(Nick Craig-Wood)
- Add
- rc: add job/stopgroup to stop group (Evan Spensley)
- serve dlna
- Add
--announce-intervalto control SSDP Announce Interval (YanceyChiew) - Add
--interfaceto Specify SSDP interface names line (Simon Bos) - Add support for more external subtitles (YanceyChiew)
- Add verification of addresses (YanceyChiew)
- Add
- sync: Optimise
--copy-destand--compare-dest(Nick Craig-Wood) - doc updates (albertony, Alexander Knorr, anonion, Joรฃo Henrique Franco, Josh Soref, Lorenzo Milesi, Marco Molteni, Mark Trolley, Ole Frost, partev, Ryan Morey, Tom Mombourquette, YFdyh000)
- build
- Bug Fixes ๐
- filter
- Fix incorrect filtering with UseFilter context flag and wrapping backends (Nick Craig-Wood)
- Make sure we check
--files-fromwhen looking for a single file (Nick Craig-Wood)
- rc
- Fix mount/listmounts not returning the full Fs entered in mount/mount (Tom Mombourquette)
- Handle external unmount when mounting (Isaac Aymerich)
- Validate Daemon option is not set when mounting a volume via RC (Isaac Aymerich)
- sync: Update docs and error messages to reflect fixes to overlap checks (Nick Naumann)
- filter
- VFS
- Reduce memory use by embedding sync.Cond (Nick Craig-Wood)
- Reduce memory usage by re-ordering commonly used structures (Nick Craig-Wood)
- Fix excess CPU used by VFS cache cleaner looping (Nick Craig-Wood)
- Local
- Obey file filters in listing to fix errors on excluded files (Nick Craig-Wood)
- Fix "Failed to read metadata: function not implemented" on old Linux kernels (Nick Craig-Wood)
- Compress
- Fix crash due to nil metadata (Nick Craig-Wood)
- Fix error handling to not use or return nil objects (Nick Craig-Wood)
- Drive
- Make
--drive-stop-on-upload-limitobey quota exceeded error (Steve Kowalik)
- Make
- FTP
- Add
--ftp-force-list-hiddenoption to show hidden items (รyvind Heddeland Instefjord) - Fix hang when using ExplicitTLS to certain servers. (Nick Craig-Wood)
- Add
- Google Cloud Storage
- Add
--gcs-endpointflag and config parameter (Nick Craig-Wood)
- Add
- Hubic
- Remove backend as service has now shut down (Nick Craig-Wood)
- Onedrive
- Rename Onedrive(cn) 21Vianet to Vnet Group (Yen Hu)
- Disable change notify in China region since it is not supported (Nick Craig-Wood)
- S3
- Implement
--s3-versionsflag to show old versions of objects if enabled (Nick Craig-Wood) - Implement
--s3-version-atflag to show versions of objects at a particular time (Nick Craig-Wood) - Implement backend versioning command to get/set bucket versioning (Nick Craig-Wood)
- Implement Purge to purge versions and backend cleanup-hidden (Nick Craig-Wood)
- Add
--s3-decompressflag to decompress gzip-encoded files (Nick Craig-Wood) - Add
--s3-sse-customer-key-base64to supply keys with binary data (Richard Bateman) - Try to keep the maximum precision in ModTime with
--user-server-modtime(Nick Craig-Wood) - Drop binary metadata with an ERROR message as it can't be stored (Nick Craig-Wood)
- Add
--s3-no-system-metadatato suppress read and write of system metadata (Nick Craig-Wood)
- Implement
- SFTP
- Fix directory creation races (Lesmiscore)
- Swift
- Add
--swift-no-large-objectsto reduce HEAD requests (Nick Craig-Wood)
- Add
- Union
- Propagate SlowHash feature to fix hasher interaction (Lesmiscore)
๐ฆ v1.59.2 - 2022-09-15 โจ
See commits (https://github.com/rclone/rclone/compare/v1.59.1...v1.59.2)
- Bug Fixes ๐
- config: Move locking to fix fatal error: concurrent map read and map write (Nick Craig-Wood)
- Local
- Disable xattr support if the filesystems indicates it is not supported (Nick Craig-Wood)
- Azure Blob
- Fix chunksize calculations producing too many parts (Nick Craig-Wood)
- B2
- Fix chunksize calculations producing too many parts (Nick Craig-Wood)
- S3
- Fix chunksize calculations producing too many parts (Nick Craig-Wood)
๐ธ v1.59.1 - 2022-08-08 ๐
See commits (https://github.com/rclone/rclone/compare/v1.59.0...v1.59.1)
- Bug Fixes
- accounting: Fix panic in core/stats-reset with unknown group (Nick Craig-Wood)
- build: Fix android build after GitHub actions change (Nick Craig-Wood)
- dlna: Fix SOAP action header parsing (Joram Schrijver)
- docs: Fix links to mount command from install docs (albertony)
- dropbox: Fix ChangeNotify was unable to decrypt errors (Nick Craig-Wood)
- fs: Fix parsing of times and durations of the form "YYYY-MM-DD HH:MM:SS" (Nick Craig-Wood)
- serve sftp: Fix checksum detection (Nick Craig-Wood)
- sync: Add accidentally missed filter-sensitivity to
--backup-diroption (Nick Naumann)
- Combine
- Fix docs showing remote= instead of upstreams= (Nick Craig-Wood)
- Throw error if duplicate directory name is specified (Nick Craig-Wood)
- Fix errors with backends shutting down while in use (Nick Craig-Wood)
- Dropbox
- Fix hang on quit with
--dropbox-batch-mode off(Nick Craig-Wood) - Fix infinite loop on uploading a corrupted file (Nick Craig-Wood)
- Fix hang on quit with
- Internetarchive
- Ignore checksums for files using the different method (Lesmiscore)
- Handle hash symbol in the middle of filename (Lesmiscore)
- Jottacloud
- Fix working with whitelabel Elgiganten Cloud
- Do not store username in config when using standard auth (albertony)
- Mega
- Fix nil pointer exception when bad node received (Nick Craig-Wood)
- S3
- Fix
--s3-no-headpanic: reflect: Elem of invalid type s3.PutObjectInput (Nick Craig-Wood)
- Fix
- SFTP
- Fix issue with WS_FTP by working around failing RealPath (albertony)
- Union
- Fix duplicated files when using directories with leading / (Nick Craig-Wood)
- Fix multiple files being uploaded when roots don't exist (Nick Craig-Wood)
- Fix panic due to misalignment of struct field in 32 bit architectures (r-ricci)
๐ v1.59.0 - 2022-07-09 ๐
See commits (https://github.com/rclone/rclone/compare/v1.58.0...v1.59.0)
- New backends
- Combine multiple remotes in one directory tree (Nick Craig-Wood)
- Hidrive (https://rclone.org/hidrive/) (Ovidiu Victor Tatar)
- Internet Archive (https://rclone.org/internetarchive/) (Lesmiscore (Naoya Ozaki))
- New S3 providers
- ArvanCloud AOS (https://rclone.org/s3/#arvan-cloud) (ehsantdy)
- Cloudflare R2 (https://rclone.org/s3/#cloudflare-r2) (Nick Craig-Wood)
- Huawei OBS (https://rclone.org/s3/#huawei-obs) (m00594701)
- IDrive e2 (https://rclone.org/s3/#idrive-e2) (vyloy)
- New commands
- test makefile (https://rclone.org/commands/rclone_test_makefile/): Create a single file for testing (Nick Craig-Wood)
- New Features
- Metadata framework (https://rclone.org/docs/#metadata) to read and write system and user metadata on backends (Nick Craig-Wood)
- Implemented initially for local, s3 and internetarchive backends
--metadata/-Mflag to control whether metadata is copied--metadata-setflag to specify metadata for uploads- Thanks to Manz Solutions (https://manz-solutions.at/) for sponsoring this work.
- build
- Update to go1.18 and make go1.16 the minimum required version (Nick Craig-Wood)
- Update android go build to 1.18.x and NDK to 23.1.7779620 (Nick Craig-Wood)
- All windows binaries now no longer CGO (Nick Craig-Wood)
- Add linux/arm/v6 to docker images (Nick Craig-Wood)
- A huge number of fixes found with staticcheck (https://staticcheck.io/) (albertony)
- Configurable version suffix independent of version number (albertony)
- check: Implement
--no-traverseand--no-unicode-normalization(Nick Craig-Wood) - config: Readability improvements (albertony)
- copyurl: Add
--header-filenameto honor the HTTP header filename directive (J-P Treen) - filter: Allow multiple
--exclude-if-presentflags (albertony) - fshttp: Add
--disable-http-keep-alivesto disable HTTP Keep Alives (Nick Craig-Wood) - install.sh
- Set the modes on the files and/or directories on macOS (Michael C Tiernan - MIT-Research Computing Project)
- Metadata framework (https://rclone.org/docs/#metadata) to read and write system and user metadata on backends (Nick Craig-Wood)
- Pre verify sudo authorization
-vbefore calling curl. (Michael C Tiernan - MIT-Research Computing Project)lib/encoder: Add Semicolon encoding (Nick Craig-Wood)lsf: Add metadata support withMflag (Nick Craig-Wood)lsjson: Add--metadata/-Mflag (Nick Craig-Wood)ncdu- Implement multi selection (CrossR)
- Replace termbox with tcell's termbox wrapper (eNV25)
- Display correct path in delete confirmation dialog (Roberto Ricci)
operations- Speed up hash checking by aborting the other hash if first returns nothing (Nick Craig-Wood)
- Use correct src/dst in some log messages (zzr93)
rcat: Check checksums by default like copy does (Nick Craig-Wood)selfupdate: Replace deprecated x/crypto/openpgp package with ProtonMail/go-crypto (albertony)serve ftp: Check--passive-portarguments are correct (Nick Craig-Wood)size: Warn about inaccurate results when objects with unknown size (albertony)sync: Overlap check is now filter-sensitive so--backup-dircan be in the root provided it is filtered (Nick)test info: Check file name lengths using 1,2,3,4 byte unicode characters (Nick Craig-Wood)test makefile(s):--sparse,--zero,--pattern,--ascii,--chargenflags to control file contents (Nick Craig-Wood)- Make sure we call the Shutdown method on backends (Martin Czygan)
๐ Bug Fixes (the receipts ๐ )
accounting: Fix unknown length file transfers counting 3 transfers each (buda)ncdu: Fix issue where dir size is summed when file sizes are-1(albertony)sync/copy/move- Fix
--fast-list--create-empty-src-dirsand--exclude(Nick Craig-Wood) - Fix
--max-durationand--cutoff-mode soft(Nick Craig-Wood)
- Fix
- Fix fs cache unpin (Martin Czygan)
- Set proper exit code for errors that are not low-level retried (e.g. size/timestamp changing) (albertony)
๐ฅ๏ธ Mount
- Support
windows/arm64(may still have problems - see #5828https://github.com/rclone/rclone/issues/5828) (Nick Craig-Wood) - Log IO errors at
ERRORlevel (Nick Craig-Wood) - Ignore
_netdevmount argument (Hugal31)
๐ VFS
- Add
--vfs-fast-fingerprintfor less accurate but faster fingerprints (Nick Craig-Wood) - Add
--vfs-disk-space-total-sizeoption to manually set the total disk space (Claudio Maradonna) vfscache: Fix fatal error: sync: unlock of unlocked mutex error (Nick Craig-Wood)
๐ Local
- Fix parsing of
--local-nouncflag (Nick Craig-Wood) - Add Metadata support (Nick Craig-Wood)
๐ Crypt
- Support metadata (Nick Craig-Wood)
โ๏ธ Azure Blob
- Calculate Chunksize/blocksize to stay below maxUploadParts (Leroy van Logchem)
- Use chunksize lib to determine chunksize dynamically (Derek Battams)
- Case insensitive access tier (Rob Pickerill)
- Allow remote emulator (azurite) (Lorenzo Maiorfi)
๐ ฑ๏ธ B2
- Add
--b2-version-atflag to show file versions at time specified (SwazRGB) - Use chunksize lib to determine chunksize dynamically (Derek Battams)
โ๏ธ Chunker
- Mark as not supporting metadata (Nick Craig-Wood)
๐๏ธ Compress
- Support metadata (Nick Craig-Wood)
๐ Drive
- Make backend config
-o configadd a combinedAllDrives:remote (Nick Craig-Wood) - Make
--drive-shared-with-mework with shared drives (Nick Craig-Wood) - Add
--drive-resource-keyfor accessing link-shared files (Nick Craig-Wood) - Add backend commands
exportformatsandimportformatsfor debugging (Nick Craig-Wood) - Fix 404 errors on copy/server side copy objects from public folder (Nick Craig-Wood)
- Update Internal OAuth consent screen docs (Phil Shackleton)
- Moved
root_folder_idto advanced section (Abhiraj)
๐ฆ Dropbox
- Migrate from deprecated api (m8rge)
- Add logs to show when poll interval limits are exceeded (Nick Craig-Wood)
- Fix nil pointer exception on dropbox impersonate user not found (Nick Craig-Wood)
๐ฅ Fichier
- Parse api error codes and them accordingly (buengese)
๐ก FTP
- Add support for
disable_utf8option (Jason Zheng) - Revert to upstream
github.com/jlaffaye/ftpfrom our fork (Nick Craig-Wood)
๐ชฃ Google Cloud Storage
- Add
--gcs-no-check-bucketto minimise transactions and perms (Nick Gooding) - Add
--gcs-decompressflag to decompress gzip-encoded files (Nick Craig-Wood)- by default these will be downloaded compressed (which previously failed)
#๏ธโฃ Hasher
- Support metadata (Nick Craig-Wood)
๐ HTTP
- Fix missing response when using custom auth handler (albertony)
๐ณ๐ด Jottacloud
- Add support for upload to custom device and mountpoint (albertony)
- Always store username in config and use it to avoid initial API request (albertony)
- Fix issue with server-side copy when destination is in trash (albertony)
- Fix listing output of remote with special characters (albertony)
๐ฎ Mailru
- Fix timeout by using int instead of
time.Durationfor keeping number of seconds (albertony)
๐๏ธ Mega
- Document using MEGAcmd to help with login failures (Art M. Gallagher)
๐ช Onedrive
- Implement
--poll-intervalfor onedrive (Hugo Laloge) - Add access scopes option (Sven Gerber)
๐ Opendrive
- Resolve lag and truncate bugs (Scott Grimes)
โ๏ธ Pcloud
- Fix about with no free space left (buengese)
- Fix cleanup (buengese)
๐งบ S3
- Use PUT Object instead of presigned URLs to upload single part objects (Nick Craig-Wood)
- Backend restore command to skip non-GLACIER objects (Vincent Murphy)
- Use chunksize lib to determine chunksize dynamically (Derek Battams)
- Retry RequestTimeout errors (Nick Craig-Wood)
- Implement reading and writing of metadata (Nick Craig-Wood)
๐ SFTP
- Add support for about and hashsum on windows server (albertony)
- Use vendor-specific VFS statistics extension for about if available (albertony)
- Add
--sftp-chunk-sizeto control packets sizes for high latency links (Nick Craig-Wood) - Add
--sftp-concurrencyto improve high latency transfers (Nick Craig-Wood) - Add
--sftp-set-envoption to set environment variables (Nick Craig-Wood) - Add Hetzner Storage Boxes to supported sftp backends (Anthrazz)
๐ฐ๏ธ Storj
- Fix put which lead to the file being unreadable when using mount (Erik van Velzen)
๐ค Union
- Add
min_free_spaceoption for lfs/eplfs policies (Nick Craig-Wood) - Fix uploading files to union of all bucket based remotes (Nick Craig-Wood)
- Fix get free space for remotes which don't support it (Nick Craig-Wood)
- Fix eplus policy to select correct entry for existing files (Nick Craig-Wood)
- Support metadata (Nick Craig-Wood)
โฌ๏ธ Uptobox
- Fix root path handling (buengese)
๐ธ๏ธ WebDAV
- Add SharePoint in other specific regions support (Noah Hsu)
๐ท๐บ Yandex
- Handle api error on server-side move (albertony)
๐ข Zoho
- Add Japan and China regions (buengese)
๐ v1.58.1 - 2022-04-29
See commits https://github.com/rclone/rclone/compare/v1.58.0...v1.58.1
๐ Bug Fixes
build: Updategithub.com/billziss-ghtogithub.com/winfsp(Nick Craig-Wood)filter: Fix timezone of--min-age/-max-agefrom UTC to local as documented (Nick Craig-Wood)rc/js: Correct RC method names (Sฦกn Trแบงn-Nguyแป n)docs- Fix some links to command pages (albertony)
- Add
--multi-thread-streamsnote to--transfers. (Zsolt Ero)
๐ฅ๏ธ Mount
- Fix
--devnameandfusermount: unknown option 'fsname'when mounting via rc (Nick Craig-Wood)
๐ VFS
- Remove wording which suggests VFS is only for mounting (Nick Craig-Wood)
๐ฆ Dropbox
- Fix retries of multipart uploads with incorrect_offset error (Nick Craig-Wood)
๐ชฃ Google Cloud Storage
- Use the s3 pacer to speed up transactions (Nick Craig-Wood)
pacer: Default the Google pacer to a burst of 100 to fix gcs pacing (Nick Craig-Wood)
๐ณ๐ด Jottacloud
- Fix scope in token request (albertony)
๐๏ธ Netstorage
- Fix unescaped HTML in documentation (Nick Craig-Wood)
- Make levels of headings consistent (Nick Craig-Wood)
- Add support contacts to netstorage doc (Nil Alexandrov)
๐ช Onedrive
- Note that sharepoint also changes web files (
.html,.aspx) (GH)
๐ฌ Putio
- Handle rate limit errors (Berkan Teber)
- Fix multithread download and other ranged requests (rafma0)
๐งบ S3
- Add ChinaMobile EOS to provider list (GuoXingbin)
- Sync providers in config description with providers (Nick Craig-Wood)
๐ SFTP
- Fix OpenSSH 8.8+ RSA keys incompatibility (KARBOWSKI Piotr)
- Note that Scaleway C14 is deprecating SFTP in favor of S3 (Adrien Rey-Jarthon)
๐ฐ๏ธ Storj
- Fix bucket creation on Move (Nick Craig-Wood)
๐ธ๏ธ WebDAV
- Don't override Referer if user sets it (Nick Craig-Wood)
โจ v1.58.0 - 2022-03-18
See commits https://github.com/rclone/rclone/compare/v1.57.0...v1.58.0
๐ฑ New backends
- Akamai Netstorage (Nil Alexandrov)
- Seagate Lyve
https://rclone.org/s3/#lyve, SeaweedFS, Storj, RackCorp via s3 backend - Storj
https://rclone.org/storj/(renamed from Tardigrade - your old config files will continue working)
๐ New commands
- bisync
https://rclone.org/bisync/- experimental bidirectional cloud sync (Ivan Andreev, Chris Nelson)
๐ซ New Features
build- Add
windows/arm64build (rclone mount not supported yet) (Nick Craig-Wood) - Raise minimum go version to
go1.15(Nick Craig-Wood)
- Add
config: Allow dot in remote names and improve config editing (albertony)dedupe: Addquitas a choice in interactive mode (albertony)dlna: Change icons to the newest ones. (Alain Nussbaumer)filter: Add{{ regexp }}syntaxhttps://rclone.org/filtering/#regexpto pattern matches (Nick Craig-Wood)fshttp: Add prometheus metrics for HTTP status code (Michaล Matczuk)hashsumโ now supports creating a hash from data you pipe in on stdin, which is lowkey so useful (albertony) ๐librclone- lets you pass an empty string or
nullas input instead of an empty json object, no more awkward empty{}energy (albertony) - added support for mount commands, slay (albertony)
- lets you pass an empty string or
operationsโ server-side moves now show up in stats, the way it should be (Ole Frost) โจrcโ you can now disable authentication for the web gui if you want (negative0)treeโ dipped the obsolete--humanflag, it's been replaced by the global--human-readable(albertony)versionโ now reports the correct friendly-name for newer Windows 10/11 versions, finally (albertony)- Bug Fixes ๐
- build
- fixed the ARM architecture version in
.debpackages after the nfpm change (Nick Craig-Wood) - hard forked
github.com/jlaffaye/ftpto fixgo get github.com/rclone/rclone(Nick Craig-Wood)
- fixed the ARM architecture version in
oauthutilโ fixed a crash when the webbrowser requests/robots.txt(Nick Craig-Wood)operationsโ fixed a goroutine leak in the case of a copy retry (Ankur Gupta)rc- fixed the
operations/publiclinkdefault for theexpiresparameter (Nick Craig-Wood) - fixed missing computation of
transferQueueSizewhen summing up the statistics group (Carlo Mion) - fixed missing
StatsInfofields in the computation of the group sum (Carlo Mion)
- fixed the
syncโ fixed--max-durationso it doesn't retry when the duration is exceeded, no cap (Nick Craig-Wood)touchโ fixed the issue where a directory was created instead of a file, iconic behaviour honestly (albertony)
- build
- Mount
- added
--devnameto set the device name sent to FUSE for mount display (Nick Craig-Wood) ๐
- added
- VFS
- added the
vfs/statsremote control to show statistics (Nick Craig-Wood) โจ - fixed the
failed to _ensure cache internal error: downloaders is nilerror (Nick Craig-Wood) - fixed handling of special characters in file names (Bumsu Hyeon)
- added the
- Local
- fixed hash invalidation which caused errors with local crypt mount (Nick Craig-Wood)
- Crypt
- added
base64andbase32768filename encoding options (Max Sum, Sinan Tan) ๐
- added
- Azure Blob
- implemented the
--azureblob-upload-concurrencyparameter to speed up uploads (Nick Craig-Wood) - removed the
100MBupper limit onchunk_sizesince it is no longer needed (Nick Craig-Wood) - raised
--azureblob-upload-concurrencyto16by default (Nick Craig-Wood) - fixed a crash with a SAS URL and no container (Nick Craig-Wood)
- implemented the
- Compress
- fixed a crash if metadata upload failed (Nick Craig-Wood)
- fixed a memory leak (Nick Craig-Wood) ๐ญ
- Drive
- added
--drive-copy-shortcut-content(Abhiraj) - disabled the OAuth OOB flow (copy a token) due to Google deprecation (Nick Craig-Wood)
- see the deprecation note (
https://developers.googleblog.com/2022/02/making-oauth-flows-safer.html#disallowed-oob).
- see the deprecation note (
- added the
--drive-skip-dangling-shortcutsflag (Nick Craig-Wood) - when using a link type,
--drive-export-formatsnow shows all doc types (Nick Craig-Wood)
- added
- Dropbox
- sped up directory listings by specifying
1000items in a chunk (Nick Craig-Wood) - saves an API request when at the root (Nick Craig-Wood)
- sped up directory listings by specifying
- Fichier
- implemented About functionality (Gourav T)
- FTP
- added
--ftp-ask-passwordto prompt for the password when needed (Borna Butkovic)
- added
- Google Cloud Storage
- added missing regions (Nick Craig-Wood)
- disabled the OAuth OOB flow (copy a token) due to Google deprecation (Nick Craig-Wood)
- see the deprecation note (
https://developers.googleblog.com/2022/02/making-oauth-flows-safer.html#disallowed-oob).
- see the deprecation note (
- Googlephotos
- disabled the OAuth OOB flow (copy a token) due to Google deprecation (Nick Craig-Wood)
- see the deprecation note (
https://developers.googleblog.com/2022/02/making-oauth-flows-safer.html#disallowed-oob).
- see the deprecation note (
- disabled the OAuth OOB flow (copy a token) due to Google deprecation (Nick Craig-Wood)
- Hasher
- fixed a crash on object not found (Nick Craig-Wood)
- Hdfs
- added file (
Move) and directory move (DirMove) support (Andy Jackson)
- added file (
- HTTP
- improved recognition of a URL pointing to a single file (albertony)
- Jottacloud
- changed the API used by recursive list (
ListR) (Kim) - added support for Tele2 Cloud (Fredric Arklid)
- changed the API used by recursive list (
- Koofr
- added the Digistorage service as a Koofr provider (jaKa)
- Mailru
- fixed
int32overflow on arm32 (Ivan Andreev)
- fixed
- Onedrive
- added a config option for the oauth scope
Sites.Read.All(Charlie Jiang) - minor optimization of
quickxorhash(Isaac Levy) - added the
--onedrive-root-folder-idflag (Nick Craig-Wood) - no more retrying on a
400pathIsTooLongerror (ctrl-q)
- added a config option for the oauth scope
- Pcloud
- added support for recursive list (
ListR) (Niels van de Weem) - fixed pre-1970 time stamps (Nick Craig-Wood)
- added support for recursive list (
- S3
- uses
ListObjectsV2for faster listings (Felix Bunemann)- falls back to
ListObject v1on unsupported providers (Nick Craig-Wood)
- falls back to
- uses the
ETagon multipart transfers to verify the transfer was OK (Nick Craig-Wood)- added the
--s3-use-multipart-etagprovider quirk to disable this on unsupported providers (Nick Craig-Wood)
- added the
- New Providers
- RackCorp object storage (bbabich)
- Seagate Lyve Cloud storage (Nick Craig-Wood)
- SeaweedFS (Chris Lu)
- Storj Shared gateways (Mรกrton Elek, Nick Craig-Wood)
- added Wasabi AP Northeast 2 endpoint info (lindwurm)
- added the
GLACIER_IRstorage class (Yunhai Luo) - documented the
Content-MD5workaround for object-lock enabled buckets (Paulo Martins) - fixed multipart upload with
--no-head(Nick Craig-Wood) - simplified content length processing in s3 with download url (Logeshwaran Murugesan)
- uses
- SFTP
- added rclone to the list of supported
md5sum/sha1sumcommands to look for (albertony) - refactored so we only have one way of running remote commands (Nick Craig-Wood)
- fixed timeout on hashing large files by sending keepalives (Nick Craig-Wood)
- fixed unnecessary seeking when uploading and downloading files (Nick Craig-Wood)
- updated the docs on how to create a
known_hostsfile (Nick Craig-Wood)
- added rclone to the list of supported
- Storj
- renamed the tardigrade backend to the storj backend (Nick Craig-Wood)
- implemented server side
Movefor files (Nick Craig-Wood) - updated the docs to explain the differences between s3 and this backend (Elek, Mรกrton)
- Swift
- fixed About so it shows info about the current container only (Nick Craig-Wood)
- Union
- fixed treatment of remotes with
//in (Nick Craig-Wood) - fixed a deadlock when one part of a multi-upload fails (Nick Craig-Wood)
- fixed
epluspolicy returning nil (Vitor Arruda)
- fixed treatment of remotes with
- Yandex
- added permanent deletion support (deinferno)
๐ v1.57.0 - 2021-11-01 ๐
See commits (https://github.com/rclone/rclone/compare/v1.56.0...v1.57.0)
- New backends ๐ฆ
- Sia: for Sia decentralized cloud (Ian Levesque, Matthew Sevey, Ivan Andreev)
- Hasher: caches hashes and enables hashes for backends that don't support them (Ivan Andreev)
- New commands โจ
lsjson --stat: to get info about a single file/dir and theoperations/statapi (Nick Craig-Wood)config paths: show configured paths (albertony)
- New Features ๐
about: made human-readable output more consistent with other commands (albertony)- build
- use
go1.17for building and makego1.14the minimum supported (Nick Craig-Wood) - updated Go to
1.16and NDK to22bfor Android builds (x0b)
- use
- config
- support hyphens in remote names coming from an environment variable (albertony)
- made the temporary directory user-configurable (albertony)
- converted the
--cache-dirvalue to an absolute path (albertony) - don't override MIME types from OS defaults (albertony)
- docs
- toc styling and header levels cleanup (albertony)
- extended the documentation on valid remote names (albertony)
- mentioned
makefor building and thecmounttag for macos (Alex Chen) - ...and many more contributions too numerous to mention!
fs:Movewith--ignore-existingwill not delete skipped files (Nathan Collins)hashsum- treat hash values in a sum file as case insensitive (Ivan Andreev)
- don't put
ERRORorUNSUPPORTEDin the output (Ivan Andreev)
lib/encoder: added encoding of square brackets (Ivan Andreev)lib/file: improved the error message when attempting to create a dir on a nonexistent drive on windows (albertony)lib/http: factored the password hash salt into options with a default (Nolan Woods)lib/kv: added a key-value database api (Ivan Andreev)librclone- added the
RcloneFreeStringfunction (albertony) - free strings in the python example (albertony)
- added the
log: optionally print the pid in logs (Ivan Andreev)ls: introduced the--human-readableglobal option to print human-readable sizes (albertony)ncdu: introduced the keyuto toggle human-readable (albertony)operations: addedrmdirs -voutput (Justin Winokur)serve sftp- generate an ECDSA server key as well as RSA (Nick Craig-Wood)
- generate an Ed25519 server key as well as ECDSA and RSA (albertony)
serve docker- allow customizing the proxy settings of the docker plugin (Ivan Andreev)
- build the docker plugin for multiple platforms (Thomas Stachl)
size: include the human-readable count (albertony)touch: added support for touching files in a directory, with the recursive option, filtering and--dry-run/-i(albertony)tree: the option to print human-readable sizes was removed in favor of the global option (albertony)
- Bug Fixes ๐
lib/http- fixed a bad username check in the single auth secret provider (Nolan Woods)
- fixed handling of SSL credentials (Nolan Woods)
serve ftp: ensure modtime is passed as UTC always to fix timezone oddities (Nick Craig-Wood)serve sftp: fixed generation of server keys on windows (albertony)serve docker: fixed octal umask (Ivan Andreev)
- Mount
- enable rclone to be run as a mount helper direct from the fstab (Ivan Andreev)
- use procfs to validate mount on linux (Ivan Andreev)
- correctly daemonize for compatibility with automount (Ivan Andreev)
- VFS
- ensure names used in the cache path are legal on the current OS (albertony)
- Not me literally ignoring
ECLOSEDwhen truncating file handles to fix that intermittent bad file descriptor error โ slay, Nick Craig-Wood ๐ - Local โ bestie, we pulled the default OS encoding out of the local backend and into a shared encoder lib, so now itโs giving teamwork realness (albertony)
- Crypt โ now returns the wrapped object even with
--crypt-no-data-encryption(Ivan Andreev), and fixed uploads with--crypt-no-data-encryptiontoo (Nick Craig-Wood) ๐ - Azure Blob โ added
--azureblob-no-head-objectbecause we can (Tatsuya Noyori) - Box โ okay so:
- listings of heavily used directories are literally more reliable now (Nick Craig-Wood)
- when doing cleanup it deletes as much as possible (Nick Craig-Wood)
- added
--box-list-chunkto control listing chunk size (Nick Craig-Wood) - deletes items in parallel in cleanup using
--checkersthreads (Nick Craig-Wood) - added
--box-owned-byto only show items owned by the login passed (Nick Craig-Wood) - retries
operation_blocked_temporaryerrors (Nick Craig-Wood)
- Chunker โ
Md5allmust create metadata if the base hash is slow, no cap (Ivan Andreev) - Drive โ the glow-up:
- sped up directory listings by constraining the API listing using the current filters (fotile96, Ivan Andreev)
- fixed buffering for single request upload for files smaller than
--drive-upload-cutoff(YenForYang) - added
-o configoption to backend drives to make config for all shared drives (Nick Craig-Wood)
- Dropbox โ added
--dropbox-batch-commit-timeoutto control batch timeout, periodt (Nick Craig-Wood) - Filefabric โ made backoff exponential for
error_backgroundto fix errors (Nick Craig-Wood), and fixed directory move after API change (Nick Craig-Wood) - FTP โ the whole vibe:
- enabled tls session cache by default (Ivan Andreev)
- added option to disable tls13 (Ivan Andreev)
- fixed timeout after long uploads (Ivan Andreev)
- added support for precise time (Ivan Andreev)
- enabled CI for ProFtpd, PureFtpd, VsFtpd (Ivan Andreev)
- Googlephotos โ used encoder for album names to fix albums with control characters (Parth Shukla)
- Jottacloud โ fr fr:
- implemented
SetModTimeto support modtime-only changes (albertony) - improved error handling with
SetModTimeand corrupt files in general (albertony) - added support for UserInfo (
rclone config userinfo) feature (albertony) - returns direct download link from
rclone linkcommand (albertony)
- implemented
- Koofr โ created direct share link (Dmitry Bogatov)
- Pcloud โ added sha256 support (Ken Enrique Morel)
- Premiumizeme โ fixed directory listing after API changes (Nick Craig-Wood), fixed server side move after API change (Nick Craig-Wood), fixed server side directory move after API changes (Nick Craig-Wood)
- S3 โ main character energy:
- added support to use CDN URL to download the file (Logeshwaran)
- added AWS Snowball Edge to providers examples (r0kk3rz)
- uses a combination of SDK retries and rclone retries (Nick Craig-Wood)
- fixed IAM Role for Service Account not working and other auth problems (Nick Craig-Wood)
- fixed
shared_credentials_fileauth after reverting incorrect fix (Nick Craig-Wood) - fixed
corrupted on transfer: sizes differ 0 vs xxxxwith Ceph (Nick Craig-Wood)
- Seafile โ fixed error when not configured for 2fa (Fred)
- SFTP โ fixed timeout when doing MD5SUM of large file (Nick Craig-Wood)
- Swift โ updated OCI URL (David Liu) and documented OVH Cloud Archive (HNGamingUK)
- Union โ fixed rename not working with union of local disk and bucket based remote (Nick Craig-Wood)
โจ v1.56.2 - 2021-10-01 โจ
See commits at https://github.com/rclone/rclone/compare/v1.56.1...v1.56.2
๐ Bug Fixes ๐
serve http: re-added missing auth to http service โ bestie, we needed that (Nolan Woods)build: updatedgolang.org/x/systo fix crash on macOS when compiled with go1.17 (Herby Gillot)
๐ฆ FTP ๐ฆ
- fixed deadlock after failed update when
concurrency=1(Ivan Andreev)
๐ธ v1.56.1 - 2021-09-19 ๐ธ
See commits at https://github.com/rclone/rclone/compare/v1.56.0...v1.56.1
๐ Bug Fixes ๐
accounting: fixed maximum bwlimit by scaling scale max token bucket size (Nick Craig-Wood)rc: fixed speed does not update incore/stats(negative0)selfupdate: fixed--quietoption, not quite quiet (yedamo)serve http: fixed serve http exiting directly after starting (Cnly)build- applied gofmt from golang 1.17 (Ivan Andreev)
- updated Go to 1.16 and NDK to 22b for android/any (x0b)
๐ Mount ๐
- fixed
--daemonmode (Ivan Andreev)
๐ฆ VFS ๐ฆ
- fixed duplicates on rename (Nick Craig-Wood)
- fixed crash when truncating a just uploaded object (Nick Craig-Wood)
- fixed issue where empty dirs would build up in cache meta dir (albertony)
๐ Drive ๐
- fixed instructions for auto config (Greg Sadetsky)
- fixed lsf example without drive-impersonate (Greg Sadetsky)
โ๏ธ Onedrive โ๏ธ
- handled HTTP 400 better in PublicLink (Alex Chen)
- clarified the process for creating custom client_id (Mariano Absatz)
โ๏ธ Pcloud โ๏ธ
- now returns an early error when Put is called with an unknown size (Nick Craig-Wood)
- tries harder to delete a failed upload (Nick Craig-Wood)
๐ชฃ S3 ๐ชฃ
- added Wasabi's AP-Northeast endpoint info (hota)
- fixed typo in s3 documentation (Greg Sadetsky)
๐ Seafile ๐
- fixed 2fa config state machine (Fred)
๐ SFTP ๐
- removed spurious error message on
--sftp-disable-concurrent-reads(Nick Craig-Wood)
๐ฌ Sugarsync ๐ฌ
- fixed initial connection after config re-arrangement (Nick Craig-Wood)
๐ v1.56.0 - 2021-07-20 ๐
See commits at https://github.com/rclone/rclone/compare/v1.55.0...v1.56.0
๐ New backends ๐
- Uptobox (
https://rclone.org/uptobox/) (buengese) โ new bestie alert!
โจ New commands โจ
- serve docker (
https://rclone.org/commands/rclone_serve_docker/) (Antoine GIRARD) (Ivan Andreev)- and accompanying docker volume plugin (
https://rclone.org/docker/)
- and accompanying docker volume plugin (
- checksum (
https://rclone.org/commands/rclone_checksum/) to check files against a file of checksums (Ivan Andreev)- this is also available as
rclone md5sum -Cetc
- this is also available as
- config touch (
https://rclone.org/commands/rclone_config_touch/): ensure config exists at configured location (albertony) - test changenotify (
https://rclone.org/commands/rclone_test_changenotify/): command to help debugging changenotify (Nick Craig-Wood)
๐ Deprecations ๐
- dbhashsum: removed command deprecated a year ago (Ivan Andreev)
- cache: deprecated cache backend (Ivan Andreev)
๐ฅ New Features ๐ฅ
- reworked config system so it can be used non-interactively via cli and rc API.
- See docs in config create (
https://rclone.org/commands/rclone_config_create/) - This is a very big change to all the backends so may cause breakages - please file bugs!
- See docs in config create (
- librclone - export the rclone RC as a C library (lewisxy) (Nick Craig-Wood)
- Link a C-API rclone shared object into your project
- Use the RC as an in memory interface
- Python example supplied
- Also supports Android and gomobile
- fs
- added
--disable-http2for global http2 disable (Nick Craig-Wood) - made
--dumpimply-vv(Alex Chen) - use binary prefixes for size and rate units (albertony)
- use decimal prefixes for counts (albertony)
- added google search widget to rclone.org (Ivan Andreev)
- added
- accounting: calculate rolling average speed (Haochen Tong)
- atexit: terminate with non-zero status after receiving signal (Michael Hanselmann)
- build
- only run event-based workflow scripts under rclone repo with manual override (Mathieu Carbou)
- added Android build with gomobile (x0b)
- check: log the hash in use like cryptcheck does (Nick Craig-Wood)
- version: print os/version, kernel and bitness (Ivan Andreev)
- config
- prevent use of Windows reserved names in config file name (albertony)
- create config file in windows appdata directory by default (albertony)
- treat any config file paths with filename notfound as memory-only config (albertony)
- delay load config file (albertony)
- replaced defaultConfig with a thread-safe in-memory implementation (Chris Macklin)
- allow config create and friends to take key=value parameters (Nick Craig-Wood)
- fixed issues with flags/options set by environment vars. (Ole Frost)
- fshttp: implemented graceful DSCP error handling (Tyson Moore)
- lib/http - provides an abstraction for a central http server that services can bind routes to (Nolan Woods)
- added
--templateconfig and flags to serve/data (Nolan Woods) - added default 404 handler (Nolan Woods)
- added
- link: use "off" value for unset expiry (Nick Craig-Wood)
- oauthutil: raise fatal error if token expired without refresh token (Alex Chen)
- rcat: added
--sizeflag for more efficient uploads of known size (Nazar Mishturak) - serve sftp: added
--stdioflag to serve via stdio (Tom) - sync: don't warn about
--no-traversewhen--files-fromis set (Nick Gaya) - test makefiles
- added
--seedflag and make data generated repeatable (Nick Craig-Wood) - added log levels and speed summary (Nick Craig-Wood)
- added
๐ Bug Fixes ๐
- accounting: fixed startTime of statsGroups.sum (Haochen Tong)
- cmd/ncdu: fixed out of range panic in delete (buengese)
- config
- fixed issues with memory-only config file paths (albertony)
- fixed in memory config not saving on the fly backend config (Nick Craig-Wood)
- fshttp: fixed address parsing for DSCP (Tyson Moore)
- ncdu: updated termbox-go library to fix crash (Nick Craig-Wood)
- oauthutil: fixed old authorize result not recognised (Cnly)
- operations: don't update timestamps of files in
--compare-dest(Nick Gaya) - selfupdate: fixed archive name on macos (Ivan Andreev)
๐ Mount ๐
- refactored before adding serve docker (Antoine GIRARD)
๐ฆ VFS ๐ฆ
- added cache reset for
--vfs-cache-max-sizehandling at cache poll interval (Leo Luan) - fixed modtime changing when reading file into cache (Nick Craig-Wood)
- avoided unnecessary subdir in cache path (albertony)
- Fix that
umaskoption cannot be set as environment variable (albertony) - Do not print notice about missing
poll-intervalsupport when set to0(albertony) - Local ๐๏ธ โ literally your own disk, bestie, we love a home-field advantage
- Always use
readlinkto read symlink size for better compatibility (Nick Craig-Wood) - Add
--local-unicode-normalization(and remove--local-no-unicode-normalization) (Nick Craig-Wood) - Skip entries removed concurrently with
List()(Ivan Andreev)
- Always use
- Crypt ๐ โ secrets stay secret, periodt
- Support timestamped filenames from
--b2-versions(Dominik Mydlil)
- Support timestamped filenames from
- B2 ๐
- Don't include the bucket name in public link file prefixes (Jeffrey Tolar)
- Fix versions and
.fileswith no extension (Nick Craig-Wood) - Factor version handling into
lib/version(Dominik Mydlil)
- Box ๐ฆ
- Use upload preflight check to avoid listings in file uploads (Nick Craig-Wood)
- Return errors instead of calling
log.Fatalwith them (Nick Craig-Wood)
- Drive ๐๐จ
- Switch to the Drives API for looking up shared drives (Nick Craig-Wood)
- Fix some google docs being treated as files (Nick Craig-Wood)
- Dropbox ๐
- Add
--dropbox-batch-modeflag to speed up uploading (Nick Craig-Wood)- Read the batch mode docs (
https://rclone.org/dropbox/#batch-mode) for more info
- Read the batch mode docs (
- Set visibility in link sharing when
--expireis set (Nick Craig-Wood) - Simplify chunked uploads (Alexey Ivanov)
- Improve "own App IP" instructions (Ivan Andreev)
- Add
- Fichier ๐ซ๐ท
- Check if more than one upload link is returned (Nick Craig-Wood)
- Support downloading password protected files and folders (Florian Penzkofer)
- Make error messages report text from the API (Nick Craig-Wood)
- Fix move of files in the same directory (Nick Craig-Wood)
- Check that we actually got a download token and retry if we didn't (buengese)
- Filefabric ๐งต
- Fix listing after change of from field from
"int"toint.(Nick Craig-Wood)
- Fix listing after change of from field from
- FTP ๐ก
- Make upload error
250indicate success (Nick Craig-Wood)
- Make upload error
- GCS โ๏ธ
- Make compatible with
gsutil's mtime metadata (database64128) - Clean up time format constants (database64128)
- Make compatible with
- Google Photos ๐ธ
- Fix read only scope not being used properly (Nick Craig-Wood)
- HTTP ๐
- Replace
httplibwithlib/http(Nolan Woods) - Clean up Bind to better use middleware (Nolan Woods)
- Replace
- Jottacloud ๐ณ๐ด
- Fix legacy auth with state based config system (buengese)
- Fix invalid url in output from
linkcommand (albertony) - Add no versions option (buengese)
- Onedrive ๐ง
- Add
list_chunkoption (Nick Gaya) - Also report root error if unable to cancel multipart upload (Cnly)
- Fix
failed to configure: empty token founderror (Nick Craig-Wood) - Make
linkreturn direct download link (Xuanchen Wu)
- Add
- S3 ๐ชฃ
- Add
--s3-no-head-object(Tatsuya Noyori) - Remove
WebIdentityRoleProviderto fix crash on auth (Nick Craig-Wood) - Don't check to see if remote is object if it ends with
/(Nick Craig-Wood) - Add SeaweedFS (Chris Lu)
- Update Alibaba OSS endpoints (Chuan Zh)
- Add
- SFTP ๐
- Fix performance regression by re-enabling concurrent writes (Nick Craig-Wood)
- Expand tilde and environment variables in configured
known_hosts_file(albertony)
- Tardigrade ๐ป
- Upgrade to
uplink v1.4.6(Caleb Case) - Use negative offset (Caleb Case)
- Add warning about too many open files (acsfer)
- Upgrade to
- WebDAV ๐ธ๏ธ
- Fix sharepoint auth over http (Nick Craig-Wood)
- Add
headersoption (Antoon Prins)
v1.55.1 - 2021-04-26 โจ
See commits ๐ โ https://github.com/rclone/rclone/compare/v1.55.0...v1.55.1
- Bug Fixes ๐ โ the glow-up patch, no cap
selfupdate- Dont detect FUSE if build is static (Ivan Andreev)
- Add build tag
noselfupdate(Ivan Andreev)
sync: Fix incorrect error reported by graceful cutoff (Nick Craig-Wood)install.sh: fix macOS arm64 download (Nick Craig-Wood)build: Fix version numbers in android branch builds (Nick Craig-Wood)docsContributing.md: update setup instructions forgo1.16(Nick Gaya)- WinFsp 2021 is out of beta (albertony)
- Minor cleanup of space around code section (albertony)
- Fixed some typos (albertony)
- VFS
- Fix a code path which allows dirty data to be removed causing data loss (Nick Craig-Wood)
okay bestie, that one ^ is a data-loss bug fix, so it's giving "please upgrade immediately" energy ๐ฅ
- Compress
- Fix compressed name regexp (buengese)
- Drive ๐
- Fix backend copyid of google doc to directory (Nick Craig-Wood)
- Don't open browser when service account... (Ansh Mittal)
- Dropbox ๐
- Add missing
team_data.memberscope for use with--impersonate(Nick Craig-Wood) - Fix About after scopes changes -
rclone config reconnectneeded (Nick Craig-Wood) - Fix
Unable to decryptreturned paths from changeNotify (Nick Craig-Wood)
- Add missing
- FTP ๐ก
- Fix implicit TLS (Ivan Andreev)
- Onedrive ๐ง
- Work around for random "Unable to initialize RPS" errors (OleFrost)
- SFTP ๐
- Revert sftp library to
v1.12.0fromv1.13.0to fix performance regression (Nick Craig-Wood) - Fix
Update ReadFrom failed: failed to send packet: EOFerrors (Nick Craig-Wood)
- Revert sftp library to
- Zoho
- Fix error when region isn't set (buengese)
- Do not ask for mountpoint twice when using headless setup (buengese)
v1.55.0 - 2021-03-31 ๐
See commits ๐ โ https://github.com/rclone/rclone/compare/v1.54.0...v1.55.0
- New commands ๐
selfupdate(https://rclone.org/commands/rclone_selfupdate/) (Ivan Andreev)- Allows rclone to update itself in-place or via a package (using
--packageflag) - Reads cryptographically signed signatures for non beta releases
- Works on all OSes.
- Allows rclone to update itself in-place or via a package (using
test(https://rclone.org/commands/rclone_test/) - these are test commands - use with care!histogram- Makes a histogram of file name characters.info- Discovers file name or other limitations for paths.makefiles- Make a random file hierarchy for testing.memory- Load all the objects atremote:pathinto memory and report memory stats.
- New Features ๐
- Connection strings (
https://rclone.org/docs/#connection-strings)- Config parameters can now be passed as part of the remote name as a connection string.
- For example, to do the equivalent of
--drive-shared-with-meusedrive,shared_with_me: - Make sure we don't save on the fly remote config to the config file (Nick Craig-Wood)
- Make sure backends with additional config have a different name for caching (Nick Craig-Wood)
- This work was sponsored by CERN, through the CS3MESH4EOSC Project (
https://cs3mesh4eosc.eu/).- CS3MESH4EOSC has received funding from the European Unionโs Horizon 2020
- research and innovation programme under Grant Agreement no. 863353.
build- Update go build version to
go1.16and raise minimum go version togo1.13(Nick Craig-Wood) - Make a macOS ARM64 build to support Apple Silicon (Nick Craig-Wood)
- Install macfuse 4.x instead of osxfuse 3.x (Nick Craig-Wood)
- Use
GO386=softfloatinstead of deprecatedGO386=387for 386 builds (Nick Craig-Wood) - Disable IOS builds for the time being (Nick Craig-Wood)
- Androids builds made with up to date NDK (x0b)
- Add an rclone user to the Docker image but don't use it by default (cynthia kwok)
- Update go build version to
dedupe: Make largest directory primary to minimize data moved (Saksham Khanna)config- Wrap config library in an interface (Fionera)
- Make config file system pluggable (Nick Craig-Wood)
--config ""or"/notfound"for in memory config only (Nick Craig-Wood)- Clear fs cache of stale entries when altering config (Nick Craig-Wood)
copyurl: Add option to print resulting auto-filename (albertony)delete: Make--rmdirsobey the filters (Nick Craig-Wood)docs- many fixes and reworks from edwardxml, albertony, pvalls, Ivan Andreev, Evan Harris, buengese, Alexey Tabakmanencoder/filename- add SCSU as tables (Klaus Post)- Add multiple paths support to
--compare-destand--copy-destflag (K265) filter: Make--exclude "dir/"equivalent to--exclude "dir/**"(Nick Craig-Wood)fshttp: Add DSCP support with--dscpfor QoS with differentiated services (Max Sum)lib/cache: AddDeleteandDeletePrefixmethods (Nick Craig-Wood)lib/file- Make pre-allocate detect disk full errors and return them (Nick Craig-Wood)
- Don't run preallocate concurrently (Nick Craig-Wood)
- Retry preallocate on EINTR (Nick Craig-Wood)
operations: Made copy and sync operations obey aRetryAfterError(Ankur Gupta)rc- Add string alternatives for setting options over the rc (Nick Craig-Wood)
- Add
options/localto see the options configured in the context (Nick Craig-Wood) - Add
_configparameter to set global config for just this rc call (Nick Craig-Wood) - Implement passing filter config with
_filterparameter (Nick Craig-Wood) - Add
fscache/clearandfscache/entriesto control the fs cache (Nick Craig-Wood) - Avoid
+Infvalue for speed incore/stats(albertony) - Add a full set of stats to
core/stats(Nick Craig-Wood) - Allow
fs=params to be a JSON blob (Nick Craig-Wood)
rcd: Added systemd notification during therclone rcdcommand. (Naveen Honest Raj)rmdirs: Make--rmdirsobey the filters (Nick Craig-Wood)version: Show build tags and type of executable (Ivan Andreev)
- Connection strings (
- Bug Fixes ๐
install.sh: make it fail on download errors (Ivan Andreev)- Fix excessive retries missing
--max-durationtimeout (Nick Craig-Wood) - Fix crash when
--low-level-retries=0(Nick Craig-Wood) - Fix failed token refresh on mounts created via the rc (Nick Craig-Wood)
fshttp: Fix bandwidth limiting after bad merge (Nick Craig-Wood)lib/atexit- Unregister interrupt handler once it has fired so users can interrupt again (Nick Craig-Wood)
- Fix the occasional failure to unmount with CTRL-C (Nick Craig-Wood) ๐
- Fix deadlock calling Finalise while Run is running (Nick Craig-Wood) โ no more deadlock drama besties
- lib/rest: Fix multipart uploads not stopping on context cancel (Nick Craig-Wood)
๐ Mount ๐
- Allow mounting to the root directory on windows (albertony) ๐ช
- Improved handling of relative paths on windows (albertony)
- Fix unicode issues with accented characters on macOS (Nick Craig-Wood) โ รฉร รผ we see you, we love you
- Docs: document the new FileSecurity option in WinFsp 2021 (albertony)
- Docs: add note about volume path syntax on windows (albertony)
- Fix caching of old directories after renaming them (Nick Craig-Wood)
- Update cgofuse to the latest version to bring in macfuse 4 fix (Nick Craig-Wood)
๐ฆ VFS ๐ฆ
--vfs-used-is-sizeto report used space using recursive scan (tYYGH) โ she scans, she reports, she serves- Don't set modification time if it was already correct (Nick Craig-Wood)
- Fix Create causing windows explorer to truncate files on
CTRL-CCTRL-V(Nick Craig-Wood) ๐ญ copy paste betrayal - Fix modtimes not updating when writing via cache (Nick Craig-Wood)
- Fix modtimes changing by fractional seconds after upload (Nick Craig-Wood)
- Fix modtime set if
--vfs-cache-mode writes/fulland no write (Nick Craig-Wood) - Rename files in cache and cancel uploads on directory rename (Nick Craig-Wood)
- Fix directory renaming by renaming dirs cached in memory (Nick Craig-Wood)
๐ Local ๐
- Add flag
--local-no-preallocate(David Sze) - Make
nouncan advanced option except on Windows (albertony) - Don't ignore preallocate disk full errors (Nick Craig-Wood)
โจ Cache โจ
- Add
--fs-cache-expire-durationto control the fs cache (Nick Craig-Wood)
๐ Crypt ๐
- Add option to not encrypt data (Vesnyx) โ sometimes you just want the vibes, unencrypted
- Log hash ok on upload (albertony)
โญ Azure Blob โญ
- Add container public access level support. (Manish Kumar)
๐ B2 ๐
- Fix HTML files downloaded via cloudflare (Nick Craig-Wood)
๐ซถ Box ๐ซถ
- Fix transfers getting stuck on token expiry after API change (Nick Craig-Wood)
๐ง Chunker ๐ง
- Partially implement no-rename transactions (Maxwell Calman)
๐ฅ Drive ๐ฅ
- Don't stop server side copy if couldn't read description (Nick Craig-Wood)
- Pass context on to drive SDK - to help with cancellation (Nick Craig-Wood)
๐ธ Dropbox ๐ธ
- Add polling for changes support (Robert Thomas)
- Make
--timeout 0work properly (Nick Craig-Wood) - Raise priority of rate limited message to INFO to make it more noticeable (Nick Craig-Wood) ๐
๐ Fichier ๐
- Implement copy & move (buengese)
- Implement public link (buengese)
๐ FTP ๐
- Implement Shutdown method (Nick Craig-Wood)
- Close idle connections after
--ftp-idle-timeout(1m by default) (Nick Craig-Wood) - Make
--timeout 0work properly (Nick Craig-Wood) - Add
--ftp-close-timeoutflag for use with awkward ftp servers (Nick Craig-Wood) - Retry connections and logins on 421 errors (Nick Craig-Wood)
๐ Hdfs ๐
- Fix permissions for when directory is created (Lucas Messenger)
โจ Onedrive โจ
- Make
--timeout 0work properly (Nick Craig-Wood)
๐ S3 ๐
- Fix
--s3-profilewhich wasn't working (Nick Craig-Wood)
๐ฆ SFTP ๐ฆ
- Close idle connections after
--sftp-idle-timeout(1m by default) (Nick Craig-Wood) - Fix "file not found" errors for read once servers (Nick Craig-Wood)
- Fix
SetModTimestat failed: object not found with--sftp-set-modtime=false(Nick Craig-Wood)
โญ Swift โญ
- Update
github.com/ncw/swiftto v2.0.0 (Nick Craig-Wood) - Implement copying large objects (nguyenhuuluan434)
๐ Union ๐
- Fix crash when using epff policy (Nick Craig-Wood)
- Fix union attempting to update files on a read only file system (Nick Craig-Wood)
- Refactor to use
fspath.SplitFsinstead offs.ParseRemote(Nick Craig-Wood) - Fix initialisation broken in refactor (Nick Craig-Wood)
๐ WebDAV ๐
- Add support for sharepoint with NTLM authentication (Rauno Ots)
- Make sharepoint-ntlm docs more consistent (Alex Chen)
- Improve terminology in sharepoint-ntlm docs (Ivan Andreev)
- Disable HTTP/2 for NTLM authentication (georne)
- Fix sharepoint-ntlm error 401 for parallel actions (Ivan Andreev)
- Check that purged directory really exists (Ivan Andreev)
๐ Yandex ๐
- Make
--timeout 0work properly (Nick Craig-Wood)
๐ซถ Zoho ๐ซถ
- Replace client id - you will need to run
rclone config reconnectafter this (buengese) โ ๏ธ yeah you gotta re-auth bestie - Add forgotten
setupRegion()to NewFs - this finally fixes regions other than EU (buengese)
๐ v1.54.1 - 2021-03-08 ๐
See commits: https://github.com/rclone/rclone/compare/v1.54.0...v1.54.1
๐ Bug Fixes ๐
accounting: Fix--bwlimitwhen up or down is off (Nick Craig-Wood)docs- Fix nesting of brackets and backticks in ftp docs (edwardxml)
- Fix broken link in sftp page (edwardxml)
- Fix typo in
crypt.md(Romeo Kienzler) - Changelog: Correct link to digitalis.io (Alex JOST)
- Replace
#file-cachingwith#vfs-file-caching(Miron Veryanskiy) - Convert bogus example link to code (edwardxml)
- Remove dead link from
rc.md(edwardxml)
rc: Sync,copy,move: documentcreateEmptySrcDirsparameter (Nick Craig-Wood)lsjson: Fix unterminated JSON in the presence of errors (Nick Craig-Wood)
๐ธ Mount ๐ธ
- Fix mount dropping on macOS by setting
--daemon-timeout 10m(Nick Craig-Wood)
๐ฆ VFS ๐ฆ
- Document simultaneous usage with the same cache shouldn't be used (Nick Craig-Wood) โ ๏ธ fr fr don't do it
๐ B2 ๐
- Automatically raise upload cutoff to avoid spurious error (Nick Craig-Wood)
- Fix failed to create file system with application key limited to a prefix (Nick Craig-Wood)
๐ฅ Drive ๐ฅ
- Refer to Shared Drives instead of Team Drives (Nick Craig-Wood)
๐ Dropbox ๐
- Add scopes to oauth request and optionally
"members.read"(Nick Craig-Wood)
๐ S3 ๐
- Fix failed to create file system with folder level permissions policy (Nick Craig-Wood)
- Fix Wasabi HEAD requests returning stale data by using only 1 transport (Nick Craig-Wood)
- Fix
shared_credentials_fileauth (Dmitry Chepurovskiy) - Add
--s3-no-headto reducing costs docs (Nick Craig-Wood)
๐ Union ๐
- Fix mkdir at root with
remote:/(Nick Craig-Wood)
๐ Zoho ๐
- Fix custom client id's (buengese)
๐ v1.54.0 - 2021-02-02 ๐
See commits: https://github.com/rclone/rclone/compare/v1.53.0...v1.54.0
โจ New backends โจ
- Compression remote (experimental) (buengese)
- Enterprise File Fabric (Nick Craig-Wood)
- This work was sponsored by Storage Made Easy (
https://storagemadeeasy.com/) ๐ซถ
- This work was sponsored by Storage Made Easy (
- HDFS (Hadoop Distributed File System) (Yury Stankevich)
- Zoho workdrive (buengese)
๐ New Features ๐
- Deglobalise the config (Nick Craig-Wood)
- Global config now read from the context
- This will enable passing of global config via the rc
- This work was sponsored by Digitalis (
https://digitalis.io/) ๐ซถ
- Add
--bwlimitfor upload and download (Nick Craig-Wood)- Obey bwlimit in http Transport for better limiting
- Enhance systemd integration (Hekmon)
- log level identification, manual activation with flag, automatic systemd launch detection
- Don't compile systemd log integration for non unix systems (Benjamin Gustin)
- Add a
--downloadflag tomd5sum/sha1sum/hashsumto force rclone to download and hash files locally (lostheli) - Add
--progress-terminal-titleto print ETA to terminal title (LaSombra) - Make backend env vars show in help as the defaults for backend flags (Nick Craig-Wood)
build- Raise minimum go version to
go1.12(Nick Craig-Wood)
- Raise minimum go version to
dedupe- Add
--by-hashto dedupe on content hash not file name (Nick Craig-Wood) - Add
--dedupe-mode listto just list dupes, changing nothing (Nick Craig-Wood) - Add warning if used on a remote which can't have duplicate names (Nick Craig-Wood)
- Add
fs- Add Shutdown optional method for backends (Nick Craig-Wood)
- When using
--files-fromcheck files concurrently (zhucan) - Accumulate stats when using
--dry-run(Ingo Weiss) - Always show stats when using
--dry-runor--interactive(Nick Craig-Wood) - Add support for flag
--no-consoleon windows to hide the console window (albertony)
genautocomplete: Add support to output to stdout (Ingo)ncdu- Highlight read errors instead of aborting (Claudio Bantaloukas)
- Add sort by average size in directory (Adam Plรกnskรฝ)
- Add toggle option for average s3ize in directory - key
'a'(Adam Plรกnskรฝ) ๐ญ not thes3ize, iconic, keeping it exactly as written - Add empty folder flag into ncdu browser (Adam Plรกnskรฝ)
- Add
!(error) and.(unreadable) file flags to go withe(empty) (Nick Craig-Wood)
obscure: Makerclone obscure- ignore newline at end of line (Nick Craig-Wood)operations- Add logs when need to upload files to set mod times (Nick Craig-Wood)
- Move and copy log name of the destination object in verbose (Adam Plรกnskรฝ)
- Add size if known to skipped items and JSON log (Nick Craig-Wood)
rc- Prefer actual listener address if using
":port"or"addr:0"only (Nick Craig-Wood) - Add listener for finished jobs (Aleksandar Jankovic)
- Prefer actual listener address if using
serve ftp: Add options to enable TLS (Deepak Sah)serve http/webdav: Redirect requests to the base url without the/(Nick Craig-Wood)serve restic: Implement object cache (Nick Craig-Wood)stats: Add counter for deleted directories (Nick Craig-Wood)sync: Only print "There was nothing to transfer" if no errors (Nick Craig-Wood)webui- Prompt user for updating webui if an update is available (Chaitanya Bankanhal)
- Fix plugins initialization (negative0)
๐ Bug Fixes ๐
fs- Fix nil pointer on copy & move operations directly to remote (Anagh Kumar Baranwal)
- Fix parsing of
..when joining remotes (Nick Craig-Wood)
logโ hiii so enabling systemd logging while you're using--log-filewas lowkey not working, and that's now fixed ๐ (Nick Craig-Wood)checkโ the error count in the log message now actually matches up, no more confusing math bestie (Nick Craig-Wood)moveโ fixed a whole data loss situation for when the source and the destination are literally the same object ๐ญ๐ญ (Nick Craig-Wood)operations--cutoff-mode hardwas not cutting off immediately. It is now. periodt (Nick Craig-Wood)- fixed the
--immutableerror message (Nick Craig-Wood)
sync- fixed
--cutoff-mode soft& cautious so it stops ending the transfer early ๐ (Nick Craig-Wood) - fixed
--immutableerrors retrying a million times (Nick Craig-Wood)
- fixed
- Docs ๐
- so many fixes plus a full rewrite of the filtering docs (edwardxml)
- tons of spelling and grammar fixes (Josh Soref)
- doc fixes for the commands
delete,purge,rmdir,rmdirsandmount(albertony) - and thank you to these icons for many doc fixes too numerous to even list ๐ซถ
- Ameer Dawood, Antoine GIRARD, Bob Bagwill, Christopher Stewart
- CokeMine, David, Dov Murik, Durval Menezes, Evan Harris, gtorelly
- Ilyess Bachiri, Janne Johansson, Kerry Su, Marcin Zelent,
- Martin Michlmayr, Milly, Sฦกn Trแบงn-Nguyแป n
- Mount ๐
- systemd status now gets updated with cache stats (Hekmon)
- the bazil/fuse based mount is disabled on macOS (Nick Craig-Wood)
- and
rclone mountnow actually runsrclone cmountunder macOS (Nick Craig-Wood)
- and
- implemented
mknodso NFS file creation works (Nick Craig-Wood) - no more calling
umountmore than once, we simply do not do that (Nick Craig-Wood) - more user friendly mounting as a network drive on windows โจ (albertony)
- now detects if
uidorgidare set in the same option string, like-o uid=123,gid=456(albertony) - it will no longer try to unmount if the fs has already been destroyed (Nick Craig-Wood)
- VFS ๐ฆ
- fixed virtual entries causing deleted files to still show up (they were haunting us fr) (Nick Craig-Wood)
- fixed the
"file already exists"error for stale cache files (Nick Craig-Wood) - fixed file leaks with
--vfs-cache-mode fulland--buffer-size 0(Nick Craig-Wood) - fixed the invalid cache path on windows when using
:backend:as the remote (albertony)
- Local
- keeps listing files/folders when a circular symlink is detected, instead of just giving up (Manish Gupta)
- new flag
--local-zero-size-linksto fix sync on some virtual filesystems (Riccardo Iaconelli)
- Azure Blob
- added support for service principals (James Lim)
- added support for managed identities (Brad Ackerman)
- added examples for access tier (Bob Pusateri)
- now utilizes the streaming capabilities from the SDK for multipart uploads (Denis Neuling)
- fixed setting of mime types (Nick Craig-Wood)
- fixed a crash when listing outside a SAS URL's root (Nick Craig-Wood)
- delete archive tier blobs before update if
--azureblob-archive-tier-delete(Nick Craig-Wood) - fixed crash on startup (Nick Craig-Wood)
- fixed memory usage by upgrading the SDK to v0.13.0 and implementing a
TransferManager(Nick Craig-Wood) - now requires go1.14+ to compile due to SDK changes (Nick Craig-Wood)
- B2
NewObjectnow uses less expensive API calls (Nick Craig-Wood)- this will improve
--files-fromand restic serve in particular ๐
- this will improve
- fixed a crash on an empty file name (lluuaapp)
- Box
- fixed
NewObjectfor files that differ in case (Nick Craig-Wood) - fixed finding directories in a case insensitive way (Nick Craig-Wood)
- fixed
- Chunker
- skip long local hashing, hash in-transit (fixes) (Ivan Andreev)
- set
Features ReadMimeTypetofalseasObject.MimeTypeis not supported (Nick Craig-Wood) - fixed case-insensitive
NewObject, and test metadata detection (Ivan Andreev)
- Drive
- implemented the
rclone backend copyidcommand for copying files by ID (Nick Craig-Wood) - added flag
--drive-stop-on-download-limitto stop transfers when the download limit is exceeded (Anagh Kumar Baranwal) - implemented a
CleanUpworkaround for team drives (buengese) - shortcut resolution and creation can now be retried (Nick Craig-Wood)
- logs that emptying the trash can take some time โณ (Nick Craig-Wood)
- added xdg office icons to xdg desktop files (Pau Rodriguez-Estivill)
- implemented the
- Dropbox
- added support for viewing shared files and folders (buengese)
- enabled short lived access tokens (Nick Craig-Wood)
- implemented
IDeron Objects sorclone lsfetc can read the IDs (buengese) - set
Features ReadMimeTypetofalseasObject.MimeTypeis not supported (Nick Craig-Wood) - made
malformed_patherrors from too-long files not retriable (Nick Craig-Wood) - test file name length before upload to fix the upload loop (Nick Craig-Wood)
- Fichier
- set
Features ReadMimeTypetotrueasObject.MimeTypeis supported (Nick Craig-Wood)
- set
- FTP
- added
--ftp-disable-msldoption to ignore MLSD for really old servers (Nick Craig-Wood) - made
--tpslimitactually apply (Nick Craig-Wood)
- added
- Google Cloud Storage
- storage class object header support (Laurens Janssen)
- fixed anonymous client to use rclone's HTTP client (Nick Craig-Wood)
- fixed
Entry doesn't belong in directory "" (same as directory) - ignoring(Nick Craig-Wood)
- Googlephotos
- new flag
--gphotos-include-archivedto show archived photos as well (Nicolas Rueff)
- new flag
- Jottacloud
- stopped erroneously reporting support for writing mime types (buengese)
- added support for Telia Cloud (Patrik Nordlรฉn)
- Mailru
- accepts special folders eg
camera-upload(Ivan Andreev) - avoids prehashing of large local files (Ivan Andreev)
- fixed uploads after recent changes on the server (Ivan Andreev)
- fixed range requests after June 2020 changes on the server (Ivan Andreev)
- fixed invalid timestamp on corrupted files (fixes) (Ivan Andreev)
- removed deprecated protocol quirks (Ivan Andreev)
- accepts special folders eg
- Memory
- fixed setting of mime types (Nick Craig-Wood)
- Onedrive
- added support for the China region operated by 21vianet and other regional suppliers (NyaMisty)
- warns on gateway timeout errors (Nick Craig-Wood)
- falls back to normal copy if server-side copy is unavailable (Alex Chen)
- fixed server-side copy being completely disabled on OneDrive for Business (Cnly)
- (business only) workaround to replace an existing file on server-side copy (Alex Chen)
- enhanced link creation with expiry, scope, type and password (Nick Craig-Wood)
- removed
%and#from the set of encoded characters (Alex Chen) - support addressing site by server-relative URL (kice)
- Opendrive
- fixed finding directories in a case insensitive way (Nick Craig-Wood)
- Pcloud
- fixed setting of mime types (Nick Craig-Wood)
- Premiumizeme
- fixed finding directories in a case insensitive way (Nick Craig-Wood)
- Qingstor
- fixed error propagation in
CleanUp(Nick Craig-Wood) - fixed
rclone cleanup(Nick Craig-Wood)
- fixed error propagation in
- S3
- added
--s3-disable-http2to disable http/2 (Anagh Kumar Baranwal) - completed the SSE-C implementation (Nick Craig-Wood)
- fixed hashes on small files with AWS:KMS and SSE-C (Nick Craig-Wood)
- added MD5 metadata to objects uploaded with SSE-AWS/SSE-C (Nick Craig-Wood)
- added
--s3-no-headparameter to minimise transactions on upload (Nick Craig-Wood) - updated docs with a Reducing Costs section (Nick Craig-Wood)
- added error handling for error code 429 indicating too many requests (Anagh Kumar Baranwal)
- added requester pays option (kelv)
- fixed copy multipart with v2 auth failing with
'SignatureDoesNotMatch'(Louis Koo)
- added
- SFTP
- allow cert based auth via optional pubkey (Stephen Harris)
- allow the user to optionally check the server hosts key to add security (Stephen Harris)
- defer asking for user passwords until the SSH connection succeeds (Stephen Harris)
- remember entered password in AskPass mode (Stephen Harris)
- implemented a
Shutdownmethod (Nick Craig-Wood) - implemented keyboard interactive authentication (Nick Craig-Wood)
- made
--tpslimitapply (Nick Craig-Wood) - implemented
--sftp-use-fstatfor unusual SFTP servers (Nick Craig-Wood)
- Sugarsync
- fixed
NewObjectfor files that differ in case (Nick Craig-Wood) - fixed finding directories in a case insensitive way (Nick Craig-Wood)
- fixed
- Swift
- fixed deletion of parts of Static Large Object (SLO) (Nguyแป n Hแปฏu Luรขn)
- ensure partially uploaded large files are uploaded unless
--swift-leave-parts-on-error(Nguyแป n Hแปฏu Luรขn)
- Tardigrade
- upgraded to uplink v1.4.1 (Caleb Case)
- WebDAV
- updated docs to show streaming to nextcloud is working (Durval Menezes)
- Yandex
- set
Features WriteMimeTypetofalseas Yandex ignores mime types (Nick Craig-Wood)
- set
๐ v1.53.4 โ 2021-01-20
See commits (https://github.com/rclone/rclone/compare/v1.53.3...v1.53.4)
- Bug Fixes ๐
accounting: fixed a data race inTransferred()(Maciej Zimnoch)build- stop tagged releases making a current beta (Nick Craig-Wood)
- upgrade docker buildx action (Matteo Pietro Dazzi)
- add
-buildmodetocross-compile.go(Nick Craig-Wood) - fix docker build by upgrading
ilteoood/docker_buildx(Nick Craig-Wood) - revert GitHub actions brew fix since this is now fixed (Nick Craig-Wood)
- fix
brew install --casksyntax for macOS build (Nick Craig-Wood) - update nfpm syntax to fix build of
.deb/.rpmpackages (Nick Craig-Wood) - fix for Windows build errors (Ivan Andreev)
fs:Parseduration: fixed tests to use UTC time (Ankur Gupta)fshttp: prevent overlap of HTTP headers in logs (Nathan Collins)rc- fix
core/commandgiving a 500 internal error (Nick Craig-Wood) - add
Copymethod torc.Params(Nick Craig-Wood) - fix 500 error when marshalling errors from
core/command(Nick Craig-Wood) plugins: create plugins files only if webui is enabled. (negative0)
- fix
serve http: fix serving files of unknown length (Nick Craig-Wood)serve sftp: fix authentication on one connection blocking others (Nick Craig-Wood)
- Mount
- add optional brew tag to throw an error when using mount in the binaries installed via Homebrew (Anagh Kumar Baranwal)
okay bestie we're mid-list and that's totally fine, we pick up right where we left off, no re-intros, let's go ๐
- Add
.and..to directories to match cmount and expectations (Nick Craig-Wood)
VFS
- Make cache dir absolute before using it to fix path too long errors (Nick Craig-Wood)
Chunker
- Improve detection of incompatible metadata (Ivan Andreev)
Google Cloud Storage
- Fix server side copy of large objects (Nick Craig-Wood)
Jottacloud
- Fix token renewer to fix long uploads (Nick Craig-Wood)
- Fix
token refresh failed: is not a regular fileerror (Nick Craig-Wood)
Pcloud
- Only use SHA1 hashes in EU region (Nick Craig-Wood)
Sharefile
- Undo Fix backend due to API swapping integers for strings (Nick Craig-Wood)
WebDAV
- Fix Open Range requests to fix 4shared mount (Nick Craig-Wood)
- Add
Depth: 0to GET requests to fix bitrix (Nick Craig-Wood)
๐ v1.53.3 - 2020-11-19 ๐
Wanna see the receipts? ๐
See commits: https://github.com/rclone/rclone/compare/v1.53.2...v1.53.3
โจ Bug Fixes โจ
randomโ Fix incorrect use ofmath/randinstead ofcrypto/randCVE-2020-28924 (Nick Craig-Wood)- ๐จ Passwords you have generated with
rclone configmay be insecure - See issue #4783 (
https://github.com/rclone/rclone/issues/4783) for more details and a checking tool
- ๐จ Passwords you have generated with
randomโ Seedmath/randin one place with crypto strong seed (Nick Craig-Wood)
VFS
- Fix
vfs/refreshcalls withfs=parameter (Nick Craig-Wood)
Sharefile
- Fix backend due to API swapping integers for strings (Nick Craig-Wood)
๐ธ v1.53.2 - 2020-10-26 ๐ธ
See commits: https://github.com/rclone/rclone/compare/v1.53.1...v1.53.2
โจ Bug Fixes โจ
accounting- Fix incorrect speed and
transferTimeincore/stats(Nick Craig-Wood) - Stabilize display order of transfers on Windows (Nick Craig-Wood)
- Fix incorrect speed and
operations- Fix use of
--suffixwithout--backup-dir(Nick Craig-Wood) - Fix spurious
"--checksum is in use but the source and destination have no hashes in common"(Nick Craig-Wood)
- Fix use of
build- Work around GitHub actions brew problem (Nick Craig-Wood)
- Stop using
set-envandset-pathin the GitHub actions (Nick Craig-Wood)
Mount
mount2โ Fix the swapped UID / GID values (Russell Cattelan)
VFS
- Detect and recover from a file being removed externally from the cache (Nick Craig-Wood)
- Fix a deadlock vulnerability in
downloaders.Close(Leo Luan) - Fix a race condition in
retryFailedResets(Leo Luan) - Fix missed concurrency control between some item operations and reset (Leo Luan)
- Add exponential backoff during
ENOSPCretries (Leo Luan) - Add a missed update of used cache space (Leo Luan)
- Fix
--no-modtimeto not attempt to set modtimes (as documented) (Nick Craig-Wood)
Local
- Fix sizes and syncing with
--linksoption on Windows (Nick Craig-Wood)
Chunker
- Disable
ListRto fix missing files on GDrive (workaround) (Ivan Andreev) - Fix upload over crypt (Ivan Andreev)
Fichier
- Increase maximum file size from
100GBto300GB(gyutw)
Jottacloud
- Remove
clientSecretfrom config when upgrading to token based authentication (buengese) - Avoid double url escaping of device/mountpoint (albertony)
- Remove
DirMoveworkaround as it's not required anymore - also (buengese)
Mailru
- Fix uploads after recent changes on server (Ivan Andreev)
- Fix range requests after june changes on server (Ivan Andreev)
- Fix invalid timestamp on corrupted files (fixes) (Ivan Andreev)
Onedrive
- Fix disk usage for sharepoint (Nick Craig-Wood)
S3
- Add missing regions for AWS (Anagh Kumar Baranwal)
Seafile
- Fix accessing libraries > 2GB on 32 bit systems (Muffin King)
SFTP
- Always convert the checksum to lower case (buengese)
Union
- Create root directories if none exist (Nick Craig-Wood)
๐ v1.53.1 - 2020-09-13 ๐
See commits: https://github.com/rclone/rclone/compare/v1.53.0...v1.53.1
โจ Bug Fixes โจ
accountingโ Remove new line from end of--stats-one-linedisplay (Nick Craig-Wood)check- Add back missing
--downloadflag (Nick Craig-Wood) - Fix docs (Nick Craig-Wood)
- Add back missing
docs- Note
--log-filedoes append (Nick Craig-Wood) - Add full stops for consistency in
rclone --help(edwardxml) - Add Tencent COS to s3 provider list (wjielai)
- Updated mount command to reflect that it requires Go 1.13 or newer (Evan Harris)
jottacloudโ Mention that uploads from local disk will not need to cache files to disk for md5 calculation (albertony)- Fix formatting of rc docs page (Nick Craig-Wood)
- Note
build- Include vendor tar ball in release and fix
startdev(Nick Craig-Wood) - Fix
"Illegal instruction"error for ARMv6 builds (Nick Craig-Wood) - Fix architecture name in ARMv7 build (Nick Craig-Wood)
- Include vendor tar ball in release and fix
VFS
- Fix spurious error
"vfs cache: failed to _ensure cache EOF"(Nick Craig-Wood) - Log an ERROR if we fail to set the file to be sparse (Nick Craig-Wood)
Local
- Log an ERROR if we fail to set the file to be sparse (Nick Craig-Wood)
Drive
- Re-adds special oauth help text (Tim Gallant)
Opendrive
- Do not retry 400 errors (Evan Harris)
๐ v1.53.0 - 2020-09-02 ๐
See commits: https://github.com/rclone/rclone/compare/v1.52.0...v1.53.0
New Features
- The VFS layer (
https://rclone.org/commands/rclone_mount/#vfs-virtual-file-system) was heavily reworked for this release - see below for more details โจ - Interactive mode
-i/--interactive(https://rclone.org/docs/#interactive) for destructive operations (fishbullet) ๐ซถ yes this is the "are you SURE bestie" mode - Add
--bwlimit-file(https://rclone.org/docs/#bwlimit-file-bwtimetable) flag to limit speeds of individual file transfers (Nick Craig-Wood) - Transfers are sorted by start time in the stats and progress output (Max Sum)
- Make sure backends expand
~and environment vars in file names they use (Nick Craig-Wood) - Add
--refresh-times(https://rclone.org/docs/#refresh-times) flag to set modtimes on hashless backends (Nick Craig-Wood) build- Remove vendor directory in favour of Go modules (Nick Craig-Wood)
- Build with go1.15.x by default (Nick Craig-Wood)
- Drop macOS 386 build as it is no longer supported by go1.15 (Nick Craig-Wood)
- Add ARMv7 to the supported builds (Nick Craig-Wood)
- Enable rclone cmount on macOS (Nick Craig-Wood)
- Make rclone build with gccgo (Nick Craig-Wood)
- Make rclone build with wasm (Nick Craig-Wood)
- Change beta numbering to be semver compatible (Nick Craig-Wood)
- Add file properties and icon to Windows executable (albertony)
- Add experimental interface for integrating rclone into browsers (Nick Craig-Wood)
libโ Add file name compression (Klaus Post)rc- Allow installation and use of plugins and test plugins with
rclone-webui(Chaitanya Bankanhal) - Add reverse proxy
pluginsHandlerfor serving plugins (Chaitanya Bankanhal) - Add
mount/listmountsoption for listing current mounts (Chaitanya Bankanhal) - Add
operations/uploadfileto upload a file through rc using encodingmultipart/form-data(Chaitanya Bankanhal) - Add
core/commandto execute rclone terminal commands. (Chaitanya Bankanhal)
- Allow installation and use of plugins and test plugins with
rclone check- Add reporting of filenames for same/missing/changed (Nick Craig-Wood)
- Make check command obey
--dry-run/-i/--interactive(Nick Craig-Wood) - Make check do
--checkersfiles concurrently (Nick Craig-Wood) - Retry downloads if they fail when using the
--downloadflag (Nick Craig-Wood) - Make it show stats by default (Nick Craig-Wood)
rclone obscureโ Allow obscure command to accept password onSTDIN(David Ibarra)rclone config- Set
RCLONE_CONFIG_DIRfor use in config files and subprocesses (Nick Craig-Wood) - Reject remote names starting with a dash. (jtagcat)
- Set
rclone cryptcheckโ Add reporting of filenames for same/missing/changed (Nick Craig-Wood)rclone dedupeโ Make it obey the--size-onlyflag for duplicate detection (Nick Craig-Wood)rclone linkโ Add--expireand--unlinkflags (Roman Kredentser)rclone mkdirโ Warn when using mkdir on remotes which can't have empty directories (Nick Craig-Wood)rclone rcโ Allow JSON parameters to simplify command line usage (Nick Craig-Wood)rclone serve ftp- Don't compile on < go1.13 after dependency update (Nick Craig-Wood)
- Add error message if auth proxy fails (Nick Craig-Wood)
- Use refactored
goftp.io/serverlibrary for binary shrink (Nick Craig-Wood)
rclone serve resticโ Expose interfaces so that rclone can be used as a library from within restic (Jack)rclone syncโ Add--track-renames-strategy leaf(Nick Craig-Wood)rclone touchโ Add ability to set nanosecond resolution times (Nick Craig-Wood)rclone treeโ Remove-ishorthand for--noindentas it conflicts with-i/--interactive(Nick Craig-Wood)
โจ Bug Fixes โจ
accounting- Fix documentation for
speed/speedAvg(Nick Craig-Wood) - Fix elapsed time not show actual time since beginning (Chaitanya Bankanhal)
- Fix deadlock in stats printing (Nick Craig-Wood)
- Fix documentation for
build- Fix file handle leak in GitHub release tool (Garrett Squire)
rclone checkโ Fix successful retries with--downloadcounting errors (Nick Craig-Wood)rclone dedupeโ Fix logging to be easier to understand (Nick Craig-Wood)
Mount
- โ ๏ธ Warn macOS users that mount implementation is changing (Nick Craig-Wood)
- to test the new implementation use
rclone cmountinstead ofrclone mount - this is because the library rclone uses has dropped macOS support
- to test the new implementation use
rcinterface- Add call for unmount all (Chaitanya Bankanhal)
- Make
mount/mountremote control takevfsOptoption (Nick Craig-Wood) - Add
mountOpttomount/mount(Nick Craig-Wood)
- Add VFS and Mount options to
mount/listmounts(Nick Craig-Wood) - Catch panics in cgofuse initialization and turn into error messages (Nick Craig-Wood)
- Always supply stat information in Readdir (Nick Craig-Wood)
- Add support for reading unknown length files using direct IO (Windows) (Nick Craig-Wood)
- Fix On Windows don't add
-o uid/gid=-1if user supplies-o uid/gid. (Nick Craig-Wood) - Fix macOS losing directory contents in cmount (Nick Craig-Wood)
- Fix volume name broken in recent refactor (Nick Craig-Wood)
๐ธ VFS ๐ธ
- Implement partial reads for
--vfs-cache-mode full(Nick Craig-Wood) - Add
--vfs-writebackoption to delay writes back to cloud storage (Nick Craig-Wood) - Add
--vfs-read-aheadparameter for use with--vfs-cache-mode full(Nick Craig-Wood) - Restart pending uploads on restart of the cache (Nick Craig-Wood)
- Support synchronous cache space recovery upon
ENOSPC(Leo Luan) - Allow
ReadAtandWriteAtto run concurrently with themselves (Nick Craig-Wood) - Change modtime of file before upload to current (Rob Calistri)
- Recommend
--vfs-cache-modes writeson backends which can't stream (Nick Craig-Wood) - Add an optional fs parameter to vfs rc methods (Nick Craig-Wood)
- Fix errors when using > 260 char files in the cache in Windows (Nick Craig-Wood)
- Fix renaming of items while they are being uploaded (Nick Craig-Wood)
- Fix very high load caused by slow directory listings (Nick Craig-Wood)
- Fix renamed files not being uploaded with
--vfs-cache-mode minimal(Nick Craig-Wood) - Fix directory locking caused by slow directory listings (Nick Craig-Wood)
- Fix saving from chrome without
--vfs-cache-mode writes(Nick Craig-Wood)
๐ฅ๏ธ Local ๐ฅ๏ธ
- Add
--local-no-updatedto provide a consistent view of changing objects (Nick Craig-Wood) - Add
--local-no-set-modtimeoption to prevent modtime changes (tyhuber1) - Fix race conditions updating and reading Object metadata (Nick Craig-Wood)
๐๏ธ Cache ๐๏ธ
- Make any created backends be cached to fix rc problems (Nick Craig-Wood)
- Fix dedupe on caches wrapping drives (Nick Craig-Wood)
๐ Crypt ๐
- Add
--crypt-server-side-across-configsflag (Nick Craig-Wood) - Make any created backends be cached to fix rc problems (Nick Craig-Wood)
โจ Alias โจ
- Make any created backends be cached to fix rc problems (Nick Craig-Wood)
โ๏ธ Azure Blob โ๏ธ
- Don't compile on < go1.13 after dependency update (Nick Craig-Wood)
๐ B2 ๐
- Implement server-side copy for files > 5GB (Nick Craig-Wood)
- Cancel in progress multipart uploads and copies on rclone exit (Nick Craig-Wood)
- Note that b2's encoding now allows but rclone's hasn't changed (Nick Craig-Wood)
- Fix transfers when using
download_url(Nick Craig-Wood)
๐ฆ Box ๐ฆ
- Implement
rclone cleanup(buengese) - Cancel in progress multipart uploads and copies on rclone exit (Nick Craig-Wood)
- Allow authentication with access token (David)
๐งฉ Chunker ๐งฉ
- Make any created backends be cached to fix rc problems (Nick Craig-Wood)
๐ Drive ๐
- Add
rclone backend drivesto list shared drives (teamdrives) (Nick Craig-Wood) - Implement
rclone backend untrash(Nick Craig-Wood) - Work around drive bug which didn't set modtime of copied docs (Nick Craig-Wood)
- Added
--drive-starred-onlyto only show starred files (Jay McEntire) - Deprecate
--drive-alternate-exportas it is no longer needed (themylogin) - Fix duplication of Google docs on server-side copy (Nick Craig-Wood)
- Fix
panic: send on closed channelwhen recycling dir entries (Nick Craig-Wood)
๐ Dropbox ๐
- Add copyright detector info in limitations section in the docs (Alex Guerrero)
- Fix
rclone linkby removing expires parameter (Nick Craig-Wood)
๐ Fichier ๐
- Detect
Flood detected: IP Lockederror and sleep for 30s (Nick Craig-Wood)
๐ก FTP ๐ก
- Add explicit TLS support (Heiko Bornholdt)
- Add support for
--dump bodiesand--dump authfor debugging (Nick Craig-Wood) - Fix interoperation with pure-ftpd (Nick Craig-Wood)
๐ Google Cloud Storage ๐
- Add support for anonymous access (Kai Lรผke)
๐ Jottacloud ๐
- Bring back legacy authentication for use with whitelabel versions (buengese)
- Switch to new api root - also implement a very ugly workaround for the DirMove failures (buengese)
๐ Onedrive ๐
- Rework cancel of multipart uploads on rclone exit (Nick Craig-Wood)
- Implement
rclone cleanup(Nick Craig-Wood) - Add
--onedrive-no-versionsflag to remove old versions (Nick Craig-Wood)
โ๏ธ Pcloud โ๏ธ
- Implement
rclone linkfor public link creation (buengese)
๐ง Qingstor ๐ง
- Cancel in progress multipart uploads on rclone exit (Nick Craig-Wood)
๐ชฃ S3 ๐ชฃ
- Preserve metadata when doing multipart copy (Nick Craig-Wood)
- Cancel in progress multipart uploads and copies on rclone exit (Nick Craig-Wood)
- Add
rclone linkfor public link sharing (Roman Kredentser) - Add
rclone backend restorecommand to restore objects from GLACIER (Nick Craig-Wood) - Add
rclone cleanupandrclone backend cleanupto clean unfinished multipart uploads (Nick Craig-Wood) - Add
rclone backend list-multipart-uploadsto list unfinished multipart uploads (Nick Craig-Wood) - Add
--s3-max-upload-partssupport (Kamil Trzciลski) - Add
--s3-no-check-bucketfor minimising rclone transactions and perms (Nick Craig-Wood) - Add
--s3-profileand--s3-shared-credentials-fileoptions (Nick Craig-Wood) - Use regional s3 us-east-1 endpoint (David)
- Add Scaleway provider (Vincent Feltz)
- Update IBM COS endpoints (Egor Margineanu)
- Reduce the default
--s3-copy-cutoffto < 5GB for Backblaze S3 compatibility (Nick Craig-Wood) - Fix detection of bucket existing (Nick Craig-Wood)
๐ SFTP ๐
- Use the absolute path instead of the relative path for listing for improved compatibility (Nick Craig-Wood)
- Add
--sftp-subsystemand--sftp-server-commandoptions (aus)
๐ค๏ธ Swift ๐ค๏ธ
- Fix dangling large objects breaking the listing (Nick Craig-Wood)
- Fix purge not deleting directory markers (Nick Craig-Wood)
- Fix update multipart object removing all of its own parts (Nick Craig-Wood)
- Fix missing hash from object returned from upload (Nick Craig-Wood)
๐ป Tardigrade ๐ป
- Upgrade to uplink v1.2.0 (Kaloyan Raev)
๐ค Union ๐ค
- Fix writing with the all policy (Nick Craig-Wood)
๐ธ๏ธ WebDAV ๐ธ๏ธ
- Fix directory creation with 4shared (Nick Craig-Wood)
๐ฉท v1.52.3 - 2020-08-07 ๐ฉท
See commits (https://github.com/rclone/rclone/compare/v1.52.2...v1.52.3)
โจ Bug Fixes โจ
- docs
- Disable smart typography (e.g. en-dash) in
MANUAL.*and man page (Nick Craig-Wood) - Update
install.mdto reflect minimum Go version (Evan Harris) - Update install from source instructions (Nick Craig-Wood)
make_manual: SupportSOURCE_DATE_EPOCH(Morten Linderud)
- Disable smart typography (e.g. en-dash) in
- log: Fix
--use-json-loggoing to stderr not--log-fileon Windows (Nick Craig-Wood) - serve dlna: Fix file list on Samsung Series 6+ TVs (Matteo Pietro Dazzi)
- sync: Fix deadlock with
--track-renames-strategy modtime(Nick Craig-Wood)
๐๏ธ Cache ๐๏ธ
- Fix
moveto/copyto remote:file remote:file2(Nick Craig-Wood)
๐ Drive ๐
- Stop using
root_folder_idas a cache (Nick Craig-Wood) - Make dangling shortcuts appear in listings (Nick Craig-Wood)
- Drop "Disabling ListR" messages down to debug (Nick Craig-Wood)
- Workaround and policy for Google Drive API (Dmitry Ustalov)
๐ก FTP ๐ก
- Add note to docs about home vs root directory selection (Nick Craig-Wood)
๐ Onedrive ๐
- Fix reverting to Copy when Move would have worked (Nick Craig-Wood)
- Avoid comma rendered in URL in
onedrive.md(Kevin)
โ๏ธ Pcloud โ๏ธ
- Fix oauth on European region
"eapi.pcloud.com"(Nick Craig-Wood)
๐ชฃ S3 ๐ชฃ
- Fix bucket Region auto detection when Region unset in config (Nick Craig-Wood)
๐ v1.52.2 - 2020-06-24 ๐
See commits (https://github.com/rclone/rclone/compare/v1.52.1...v1.52.2)
๐ธ Bug Fixes ๐ธ
- build
- Fix docker release build action (Nick Craig-Wood)
- Fix custom timezone in Docker image (NoLooseEnds)
- check: Fix misleading message which printed errors instead of differences (Nick Craig-Wood)
- errors: Add
WSAECONNREFUSEDand more to the list of retriable Windows errors (Nick Craig-Wood) - rcd: Fix incorrect prometheus metrics (Gary Kim)
- serve restic: Fix flags so they use environment variables (Nick Craig-Wood)
- serve webdav: Fix flags so they use environment variables (Nick Craig-Wood)
- sync: Fix
--track-renames-strategy modtime(Nick Craig-Wood)
๐ Drive ๐
- Fix not being able to delete a directory with a trashed shortcut (Nick Craig-Wood)
- Fix creating a directory inside a shortcut (Nick Craig-Wood)
- Fix
--drive-impersonatewith cachedroot_folder_id(Nick Craig-Wood)
๐ SFTP ๐
- Fix SSH key PEM loading (Zac Rubin)
๐ค๏ธ Swift ๐ค๏ธ
- Speed up deletes by not retrying segment container deletes (Nick Craig-Wood)
๐ป Tardigrade ๐ป
- Upgrade to uplink v1.1.1 (Caleb Case)
๐ธ๏ธ WebDAV ๐ธ๏ธ
- Fix free/used display for
rclone about/dffor certain backends (Nick Craig-Wood)
๐ฆ v1.52.1 - 2020-06-10 ๐ฆ
See commits (https://github.com/rclone/rclone/compare/v1.52.0...v1.52.1)
๐ Bug Fixes ๐
- lib/file: Fix
SetSparseon Windows 7 which fixes downloads of files > 250MB (Nick Craig-Wood) - build
- Update
go.modto go1.14 to enable-mod=vendorbuild (Nick Craig-Wood) - Remove quicktest from Dockerfile (Nick Craig-Wood)
- Build Docker images with GitHub actions (Matteo Pietro Dazzi)
- Update Docker build workflows (Nick Craig-Wood)
- Set
user_allow_otherin/etc/fuse.confin the Docker image (Nick Craig-Wood) - Fix xgo build after go1.14
go.modupdate (Nick Craig-Wood)
- Update
- docs
- Every page footer now links the source and shows the modified time โจ (Nick Craig-Wood)
- Hand-set dates are gone, it uses git dates now (Nick Craig-Wood)
- Home page got a lil tense/punctuation/brevity glow-up โ and more positivity, we love that (edwardxml)
- Footer drops the leading slash in the page reference when it's there (Nick Craig-Wood)
- Docs now flag which commands need obscured input (Nick Craig-Wood)
obscure: wrote way more help text since other things keep pointing at it (Nick Craig-Wood)- VFS
- Fixed the OS-vs-Unix path confusion, which fixes
ChangeNotifyon Windows (Nick Craig-Wood)
- Fixed the OS-vs-Unix path confusion, which fixes
- Drive
- Fixed missing items when listing with
--fast-list/ListR(Nick Craig-Wood)
- Fixed missing items when listing with
- Putio
- Fixed a panic on
Object.Open(Cenk Alti)
- Fixed a panic on
- S3
- Fixed uploading single files into buckets with no create permission (Nick Craig-Wood)
- Fixed
--header-upload(Nick Craig-Wood)
- Tardigrade
- Fixed a listing bug by upgrading to v1.0.7
- Set UserAgent to rclone (Caleb Case)
v1.52.0 - 2020-05-27 ๐
Huge special thanks to Martin Michlmayr for proof reading and correcting all the docs, and to Edward Barker for helping re-write the front page. kings, honestly ๐
See commits (https://github.com/rclone/rclone/compare/v1.51.0...v1.52.0)
- New backends ๐ฆ
- Tardigrade (
https://rclone.org/tardigrade/) backend for use with storj.io (Caleb Case) - Union (
https://rclone.org/union/) re-write to have multiple writable remotes (Max Sum) - Seafile for Seafile server (Fred @creativeprojects)
- Tardigrade (
- New commands โจ
backend: command for backend-specific commands (see backends) (Nick Craig-Wood)cachestats: Deprecate in favour ofrclone backend stats cache:(Nick Craig-Wood)dbhashsum: Deprecate in favour ofrclone hashsum DropboxHash(Nick Craig-Wood)
- New Features ๐ฅ
- Add
--header-downloadand--header-uploadflags for setting HTTP headers when uploading/downloading (Tim Gallant) - Add
--headerflag to add HTTP headers to every HTTP transaction (Nick Craig-Wood) - Add
--check-firstto do all checking before starting transfers (Nick Craig-Wood) - Add
--track-renames-strategyfor configurable matching criteria for--track-renames(Bernd Schoolmann) - Add
--cutoff-mode hard,soft,cautious(Shing Kit Chan & Franklyn Tackitt) - Filter flags (e.g.
--files-from -) can read from stdin (fishbullet) - Add
--error-on-no-transferoption (Jon Fautley) - Implement
--order-by xxx,mixedfor copying some small and some big files (Nick Craig-Wood) - Allow
--max-backlogto be negative meaning as large as possible (Nick Craig-Wood) - Added
--no-unicode-normalizationflag to allow Unicode filenames to remain unique (Ben Zenker) - Allow
--min-age/--max-ageto take a date as well as a duration (Nick Craig-Wood) - Add rename statistics for file and directory renames (Nick Craig-Wood)
- Add statistics output to JSON log (reddi)
- Make stats be printed on non-zero exit code (Nick Craig-Wood)
- When running
--password-commandallow use of stdin (Sรฉbastien Gross) - Stop empty strings being a valid remote path (Nick Craig-Wood)
accounting: supportWriterTofor less memory copying (Nick Craig-Wood)build- Update to use go1.14 for the build (Nick Craig-Wood)
- Add
-trimpathto release build for reproduceable builds (Nick Craig-Wood) - Remove
GOOSandGOARCHfrom Dockerfile (Brandon Philips)
config- Fsync the config file after writing to save more reliably (Nick Craig-Wood)
- Add
--obscureand--no-obscureflags toconfig create/update(Nick Craig-Wood) - Make
config showtakeremote:as well asremote(Nick Craig-Wood)
copyurl: Add--no-clobberflag (Denis)delete: Added--rmdirsflag to delete directories as well (Kush)filter: Added--files-from-rawflag (Ankur Gupta)genautocomplete: Add support for fish shell (Matan Rosenberg)log: Add support for syslog LOCAL facilities (Patryk Jakuszew)lsjson: Add--hash-typeparameter and use it inlsfto speed up hashing (Nick Craig-Wood)rc- Add
-o/--optand-a/--argfor more structured input (Nick Craig-Wood) - Implement
backend/commandfor running backend-specific commands remotely (Nick Craig-Wood) - Add
mount/mountcommand for starting rclone mount via the API (Chaitanya)
- Add
rcd: Add Prometheus metrics support (Gary Kim)serve http- Added a
--templateflag for user defined markup (calistri) - Add
Last-Modifiedheaders to files and directories (Nick Craig-Wood)
- Added a
serve sftp: Add support for multiple host keys by repeating--keyflag (Maxime Suret)touch: Add--localtimeflag to make--timestamplocaltime not UTC (Nick Craig-Wood)
- Add
- Bug Fixes ๐
accounting- Restore "Max number of stats groups reached" log line (Michaล Matczuk)
- Correct exitcode on Transfer Limit Exceeded flag. (Anuar Serdaliyev)
- Reset bytes read during copy retry (Ankur Gupta)
- Fix race clearing stats (Nick Craig-Wood)
copy: Only create empty directories when they don't exist on the remote (Ishuah Kariuki)dedupe: Stop dedupe deleting files with identical IDs (Nick Craig-Wood)oauth- Use custom http client so that
--no-check-certificateis honored by oauth token fetch (Mark Spieth) - Replace deprecated
oauth2.NoContext(Lars Lehtonen)
- Use custom http client so that
operations- Fix setting the timestamp on Windows for multithread copy (Nick Craig-Wood)
- Make
rcatobey--ignore-checksum(Nick Craig-Wood) - Make
--max-transfermore accurate (Nick Craig-Wood)
rc- Fix dropped error (Lars Lehtonen)
- Fix misplaced http server config (Xiaoxing Ye)
- Disable duplicate log (ElonH)
serve dlnaCds: don't specifychildCountat all when unknown (Dan Walters)Cds: use modification time as date in dlna metadata (Dan Walters)
serve restic: Fix tests after restic project removed vendoring (Nick Craig-Wood)sync- Fix incorrect "nothing to transfer" message using
--delete-before(Nick Craig-Wood) - Only create empty directories when they don't exist on the remote (Ishuah Kariuki)
- Fix incorrect "nothing to transfer" message using
- Mount ๐
- Add
--async-readflag to disable asynchronous reads (Nick Craig-Wood) - Ignore
--allow-rootflag with a warning as it has been removed upstream (Nick Craig-Wood) - Warn if
--allow-non-emptyused on Windows and clarify docs (Nick Craig-Wood) - Constrain to go1.13 or above otherwise
bazil.org/fusefails to compile (Nick Craig-Wood) - Fix fail because of too long volume name (evileye)
- Report 1PB free for unknown disk sizes (Nick Craig-Wood)
- Map more rclone errors into file systems errors (Nick Craig-Wood)
- Fix disappearing cwd problem (Nick Craig-Wood)
- Use
ReaddirPluson Windows to improve directory listing performance (Nick Craig-Wood) - Send a hint as to whether the filesystem is case insensitive or not (Nick Craig-Wood)
- Add rc command
mount/types(Nick Craig-Wood) - Change maximum leaf name length to 1024 bytes (Nick Craig-Wood)
- Add
- VFS ๐ง
- Add
--vfs-read-waitand--vfs-write-waitflags to control time waiting for a sequential read/write (Nick Craig-Wood) - Change default
--vfs-read-waitto 20ms (it was 5ms and not configurable) (Nick Craig-Wood) - Make
dfoutput more consistent on a rclone mount. (Yves G) - Report 1PB free for unknown disk sizes (Nick Craig-Wood)
- Fix race condition caused by unlocked reading of
Dir.path(Nick Craig-Wood) - Make
Filelock andDirlock not overlap to avoid deadlock (Nick Craig-Wood) - Implement lock ordering between
FileandDirto eliminate deadlocks (Nick Craig-Wood) - Factor the vfs cache into its own package (Nick Craig-Wood)
- Pin the
Fsin use in theFscache (Nick Craig-Wood) - Add
SetSys()methods toNodeto allow caching stuff on a node (Nick Craig-Wood) - Ignore file not found errors from
HashinRead.Release(Nick Craig-Wood) - Fix hang in read wait code (Nick Craig-Wood)
- Add
- Local ๐
- Speed up multi thread downloads by using sparse files on Windows (Nick Craig-Wood)
- Implement
--local-no-sparseflag for disabling sparse files (Nick Craig-Wood) - Implement
rclone backend noopfor testing purposes (Nick Craig-Wood) - Fix "file not found" errors on post transfer
Hashcalculation (Nick Craig-Wood)
- Cache ๐
- Implement
rclone backend statscommand (Nick Craig-Wood) - Fix Server Side Copy with Temp Upload (Brandon McNama)
- Remove Unused Functions (Lars Lehtonen)
- Disable race tests until bbolt is fixed (Nick Craig-Wood)
- Move methods used for testing into test file (greatroar)
- Add
PinandUnpinand canonicalised lookup (Nick Craig-Wood) - Use proper import path
go.etcd.io/bbolt(Robert-Andrรฉ Mauchin)
- Implement
- Crypt ๐
- Calculate hashes for uploads from local disk (Nick Craig-Wood)
- This allows encrypted Jottacloud uploads without using local disk
- This means encrypted s3/b2 uploads will now have hashes
- Added
rclone backend decode/encodecommands to replicate functionality ofcryptdecode(Anagh Kumar Baranwal) - Get rid of the unused
Cipherinterface as it obfuscated the code (Nick Craig-Wood)
- Calculate hashes for uploads from local disk (Nick Craig-Wood)
- Azure Blob ๐ฆ
- Implement streaming of unknown sized files so
rcatis now supported (Nick Craig-Wood) - Implement memory pooling to control memory use (Nick Craig-Wood)
- Add
--azureblob-disable-checksumflag (Nick Craig-Wood) - Retry
InvalidBlobOrBlockerror as it may indicate block concurrency problems (Nick Craig-Wood) - Remove unused
Object.parseTimeString()(Lars Lehtonen) - Fix permission error on SAS URL limited to container (Nick Craig-Wood)
- Implement streaming of unknown sized files so
- B2 โจ
- Add support for
--header-uploadand--header-download(Tim Gallant) - Ignore directory markers at the root also (Nick Craig-Wood)
- Force the case of the SHA1 to lowercase (Nick Craig-Wood)
- Add support for
- Remove unused
largeUpload.clearUploadURL()(Lars Lehtonen)
๐ฆ Box
- Add support for
--header-uploadand--header-download(Tim Gallant) - Implement
Aboutto read size used (Nick Craig-Wood) - Add token renew function for jwt auth (David Bramwell)
- Added support for interchangeable root folder for Box backend (Sunil Patra)
- Remove unnecessary
iatfrom jws claims (David)
๐๏ธ Drive
- Follow shortcuts by default, skip with
--drive-skip-shortcuts(Nick Craig-Wood) - Implement
rclone backend shortcutcommand for creating shortcuts (Nick Craig-Wood) - Added
rclone backendcommand to changeservice_account_fileandchunk_size(Anagh Kumar Baranwal) - Fix missing files when using
--fast-listand--drive-shared-with-me(Nick Craig-Wood) - Fix duplicate items when using
--drive-shared-with-me(Nick Craig-Wood) - Extend
--drive-stop-on-upload-limitto respond toteamDriveFileLimitExceeded. (harry) - Don't delete files with multiple parents to avoid data loss (Nick Craig-Wood)
- Server side copy docs use default description if empty (Nick Craig-Wood)
๐ซง Dropbox
- Make error
insufficient spaceto be fatal (harry) - Add info about required redirect url (Elan Ruusamรคe)
๐ Fichier
- Add support for
--header-uploadand--header-download(Tim Gallant) - Implement custom pacer to deal with the new rate limiting (buengese)
๐ FTP
- Fix lockup when using concurrency limit on failed connections (Nick Craig-Wood)
- Fix lockup on failed upload when using concurrency limit (Nick Craig-Wood)
- Fix lockup on
Closefailures when using concurrency limit (Nick Craig-Wood) - Work around pureftp sending spurious
150messages (Nick Craig-Wood)
โ๏ธ Google Cloud Storage
- Add support for
--header-uploadand--header-download(Nick Craig-Wood) - Add
ARCHIVEstorage class to help (Adam Stroud) - Ignore directory markers at the root (Nick Craig-Wood)
๐ท Googlephotos
- Make the start year configurable (Daven)
- Add support for
--header-uploadand--header-download(Tim Gallant) - Create feature/favorites directory (Brandon Philips)
- Fix "concurrent map write" error (Nick Craig-Wood)
- Don't put an image in error message (Nick Craig-Wood)
๐ HTTP
- Improved directory listing with new template from Caddy project (calisro)
๐๏ธ Jottacloud
- Implement
--jottacloud-trashed-only(buengese) - Add support for
--header-uploadand--header-download(Tim Gallant) - Use
RawURLEncodingwhen decoding base64 encoded login token (buengese) - Implement cleanup (buengese)
- Update docs regarding cleanup, removed remains from old auth, and added warning about special mountpoints. (albertony)
๐ง Mailru
- Describe 2FA requirements (valery1707)
๐ช Onedrive
- Implement
--onedrive-server-side-across-configs(Nick Craig-Wood) - Add support for
--header-uploadand--header-download(Tim Gallant) - Fix occasional
416errors on multipart uploads (Nick Craig-Wood) - Added maximum chunk size limit warning in the docs (Harry)
- Fix missing drive on config (Nick Craig-Wood)
- Make error
quotaLimitReachedto be fatal (harry)
๐ Opendrive
- Add support for
--header-uploadand--header-download(Tim Gallant)
๐ ฟ๏ธ Pcloud
- Added support for interchangeable root folder for pCloud backend (Sunil Patra)
- Add support for
--header-uploadand--header-download(Tim Gallant) - Fix initial config "Auth state doesn't match" message (Nick Craig-Wood)
๐ Premiumizeme
- Add support for
--header-uploadand--header-download(Tim Gallant) - Prune unused functions (Lars Lehtonen)
๐ฌ Putio
- Add support for
--header-uploadand--header-download(Nick Craig-Wood) - Make downloading files use the rclone http Client (Nick Craig-Wood)
- Fix parsing of remotes with leading and trailing
/(Nick Craig-Wood)
๐ฃ Qingstor
- Make
rclone cleanupremove pending multipart uploads older than 24h (Nick Craig-Wood) - Try harder to cancel failed multipart uploads (Nick Craig-Wood)
- Prune
multiUploader.list()(Lars Lehtonen) - Lint fix (Lars Lehtonen)
๐ชฃ S3
- Add support for
--header-uploadand--header-download(Tim Gallant) - Use memory pool for buffer allocations (Maciej Zimnoch)
- Add SSE-C support for AWS, Ceph, and MinIO (Jack Anderson)
- Fail fast multipart upload (Michaล Matczuk)
- Report errors on bucket creation (mkdir) correctly (Nick Craig-Wood)
- Specify that Minio supports URL encoding in listings (Nick Craig-Wood)
- Added
500asretryErrorCode(Michaล Matczuk) - Use
--low-level-retriesas the number of SDK retries (Aleksandar Jankoviฤ) - Fix multipart abort context (Aleksandar Jankovic)
- Replace deprecated
session.New()withsession.NewSession()(Lars Lehtonen) - Use the provided size parameter when allocating a new memory pool (Joachim Brandon LeBlanc)
- Use rclone's low level retries instead of AWS SDK to fix listing retries (Nick Craig-Wood)
- Ignore directory markers at the root also (Nick Craig-Wood)
- Use single memory pool (Michaล Matczuk)
- Do not resize buf on put to memBuf (Michaล Matczuk)
- Improve docs for
--s3-disable-checksum(Nick Craig-Wood) - Don't leak memory or tokens in edge cases for multipart upload (Nick Craig-Wood)
๐ Seafile
- Implement 2FA (Fred)
๐ SFTP
- Added
--sftp-pem-keyto support inline key files (calisro) - Fix post transfer copies failing with 0 size when using
set_modtime=false(Nick Craig-Wood)
๐ค Sharefile
- Add support for
--header-uploadand--header-download(Tim Gallant)
๐ฌ Sugarsync
- Add support for
--header-uploadand--header-download(Tim Gallant)
๐ฆ Swift
- Add support for
--header-uploadand--header-download(Nick Craig-Wood) - Fix cosmetic issue in error message (Martin Michlmayr)
๐งฌ Union
- Implement multiple writable remotes (Max Sum)
- Fix server-side copy (Max Sum)
- Implement
ListR(Max Sum) - Enable
ListRwhen upstreams contain local (Max Sum)
๐ธ๏ธ WebDAV
- Add support for
--header-uploadand--header-download(Tim Gallant) - Fix
X-OC-Mtimeheader for Transip compatibility (Nick Craig-Wood) - Report full and consistent usage with
about(Yves G)
๐ก Yandex
- Add support for
--header-uploadand--header-download(Tim Gallant)
๐ v1.51.0 - 2020-02-01
๐ New backends
- Memory (
https://rclone.org/memory/) (Nick Craig-Wood) - Sugarsync (
https://rclone.org/sugarsync/) (Nick Craig-Wood)
โจ New Features
- Adjust all backends to have
--backend-encodingparameter (Nick Craig-Wood)- this enables the encoding for special characters to be adjusted or disabled
- Add
--max-durationflag to control the maximum duration of a transfer session (boosh) - Add
--expect-continue-timeoutflag, default1s(Nick Craig-Wood) - Add
--no-check-destflag for copying without testing the destination (Nick Craig-Wood) - Implement
--order-byflag to order transfers (Nick Craig-Wood) - accounting
- Don't show entries in both transferring and checking (Nick Craig-Wood)
- Add option to delete stats (Aleksandar Jankovic)
- build
- Compress the test builds with gzip (Nick Craig-Wood)
- Implement a framework for starting test servers during tests (Nick Craig-Wood)
- cmd: Always print elapsed time to tenth place seconds in progress (Gary Kim)
- config
- Add
--password-commandto allow dynamic config password (Damon Permezel) - Give config questions default values (Nick Craig-Wood)
- Check a remote exists when creating a new one (Nick Craig-Wood)
- Add
- copyurl: Add
--stdoutflag to write to stdout (Nick Craig-Wood) - dedupe: Implement keep smallest too (Nick Craig-Wood)
- hashsum: Add flag
--base64flag (landall) - lsf: Speed up on s3/swift/etc by not reading mimetype by default (Nick Craig-Wood)
- lsjson: Add
--no-mimetypeflag (Nick Craig-Wood) - rc: Add methods to turn on blocking and mutex profiling (Nick Craig-Wood)
- rcd
- Adding group parameter to stats (Chaitanya)
- Move webgui apart; option to disable browser (Xiaoxing Ye)
- serve sftp: Add support for public key with auth proxy (Paul Tinsley)
- stats: Show deletes in stats and hide zero stats (anuar45)
๐ Bug Fixes
- accounting
- Fix error counter counting multiple times (Ankur Gupta)
- Fix error count shown as checks (Cnly)
- Clear finished transfer in stats-reset (Maciej Zimnoch)
- Added StatsInfo locking in
statsGroupssum function (Michaล Matczuk)
- asyncreader: Fix EOF error (buengese)
- check: Fix
--one-wayrecursing more directories than it needs to (Nick Craig-Wood) - chunkedreader: Disable hash calculation for first segment (Nick Craig-Wood)
- config
- Do not open browser on headless on drive/gcs/google photos (Xiaoxing Ye)
SetValueAndSaveignore error if config section does not exist yet (buengese)
- cmd: Fix completion with an encrypted config (Danil Semelenov)
- dbhashsum: Stop it returning UNSUPPORTED on dropbox (Nick Craig-Wood)
- dedupe: Add missing modes to help string (Nick Craig-Wood)
- operations
- Fix dedupe continuing on errors like
insufficientFilePersimmon(SezalAgrawal) - Clear accounting before low level retry (Maciej Zimnoch)
- Write debug message when hashes could not be checked (Ole Schรผtt)
- Move interface assertion to tests to remove pflag dependency (Nick Craig-Wood)
- Make
NewOverrideObjectInfopublic and factor uses (Nick Craig-Wood)
- Fix dedupe continuing on errors like
- proxy: Replace use of bcrypt with sha256 (Nick Craig-Wood)
- vendor
- Update
bazil.org/fuseto fix FreeBSD 12.1 (Nick Craig-Wood) - Update
github.com/t3rm1n4l/go-megato fix mega "illegal base64 data at input byte 22" (Nick Craig-Wood) - Update
termbox-goto fix ncdu command on FreeBSD (Kuang-che Wu)
- Update
and bestie we are so not done yet, there's still more changelog energy coming ๐ โจ
- ๐
Updated
t3rm1n4l/go-megaโ this is the fix formega: couldn't login: crypto/aes: invalid key size 0, and bestie it was so needed (Nick Craig-Wood) ๐
๐ง Mount
- Enabled async reads and it's a 20% speedup, which is honestly iconic (Nick Craig-Wood) ๐ฅ
- Swapped
WriteAtout forWritewhen the cache mode is>= writesandO_APPENDis in play (Brett Dutro) - Made sure
unmountactually gets called when we exit, no more ghosting the kernel (Nick Craig-Wood) - Doesn't build on
go1.10anymore bcbazil/fusedoesn't support it (Nick Craig-Wood) - When setting dates, out of range dates get discarded (Nick Craig-Wood)
๐ฆ VFS
- Newly created files go straight into the directory (Nick Craig-Wood)
- Only one hash gets calculated for reads, which is a speedup (Nick Craig-Wood)
ReadAtfor non cached files now works better with non-sequential reads (Nick Craig-Wood)- Fixed the edge cases when reading
ModTimefrom a file (Nick Craig-Wood) - Existing files opened for write now show the correct size (Nick Craig-Wood)
- The path is no longer cached in RW file objects, which fixes renaming (Nick Craig-Wood)
- Fixed rename of open files when using the VFS cache (Nick Craig-Wood)
- When renaming files in the cache, the cache item gets renamed in memory too (Nick Craig-Wood)
- Fixed open file renaming on drive when using
--vfs-cache-mode writes(Nick Craig-Wood) - Fixed the incorrect modtime for
mvinto a mount with--vfs-cache-modes writes(Nick Craig-Wood) - On rename, it renames in the cache too if the file exists (Anagh Kumar Baranwal)
๐ Local
- Source file being updated errors are now
NoLowLevelRetryerrors (Nick Craig-Wood) - Fixed the update of hidden files on Windows (Nick Craig-Wood)
๐๏ธ Cache
- Followed the move of the upstream library from
github.com/coreos/bbolttogithub.com/etcd-io/bbolt(Nick Craig-Wood) - Fixed
fatal error: concurrent map writes(Nick Craig-Wood)
๐ Crypt
- Reordered the filename encryption options (Thomas Eales)
- Handles the trailing dot correctly (buengese)
๐งฉ Chunker
- Reduced the length of the temporary suffix (Ivan Andreev)
๐ Drive
- Added the
--drive-stop-on-upload-limitflag to stop syncs when the upload limit is reached (Nick Craig-Wood) - Added
--drive-use-shared-dateto use the date the file was shared instead of the modified date (Garry McNulty) - Invalid auth for teamdrives always reports an error now, no more silent suffering (Nick Craig-Wood)
- Fixed
--fast-listwhen usingappDataFolder(Nick Craig-Wood) - Uses multipart resumable uploads for streaming and uploads in mount (Nick Craig-Wood)
- Logs an
ERRORif an incomplete search is returned (Nick Craig-Wood) - Hides the dangerous config from the configurator (Nick Craig-Wood)
๐ฆ Dropbox
- Treats
insufficient_spaceerrors as non retriable errors (Nick Craig-Wood)
๐๏ธ Jottacloud
- Uses the new auth method that the official client uses (buengese)
- Added the URL to generate a Login Token to the config wizard (Nick Craig-Wood)
- Added support for whitelabel versions (buengese)
๐ฉ Koofr
- Uses the rclone HTTP client. (jaKa)
โ๏ธ Onedrive
- Added the
Sites.Read.Allpermission (Benjamin Richter) - Added support for the
"Retry-After"header (Motonori IWAMURO)
๐ฃ๏ธ Opendrive
- Implemented
--opendrive-chunk-size(Nick Craig-Wood)
๐ชฃ S3
- Re-implemented multipart upload to fix memory issues (Nick Craig-Wood)
- Added
--s3-copy-cutofffor the size at which it switches to multipart copy (Nick Craig-Wood) - Added the new region Asia Pacific (Hong Kong) (Outvi V)
- Reduced memory usage when streaming files by reducing the max stream upload size (Nick Craig-Wood)
- Added the
--s3-list-chunkoption for bucket listing (Thomas Kriechbaumer) - Forced path style bucket access off for the AWS deprecation (Nick Craig-Wood)
- Uses the AWS web identity role provider if it's available (Tennix)
- Added StackPath Object Storage Support (Dave Koston)
- Fixed the
ExpiryWindowvalue (Aleksandar Jankovic) - Fixed the
DisableChecksumcondition (Aleksandar Jankoviฤ) - Fixed the URL decoding of
NextMarker(Nick Craig-Wood)
๐ SFTP
- Added
--sftp-skip-linksto skip symlinks and non regular files (Nick Craig-Wood) - Retries the Creation of Connection (Sebastian Brandt)
- Fixed the
"failed to parse private key file: ssh: not an encrypted key"error (Nick Craig-Wood) - Opens files for update write only, which fixes AWS SFTP interop (Nick Craig-Wood)
๐ฆ Swift
- Reserves segments of dynamic large object when deleting objects in a container that had versioning enabled. (Nguyแป n Hแปฏu Luรขn)
- Fixed the parsing of
X-Object-Manifest(Nick Craig-Wood) - Updated the OVH API endpoint (unbelauscht)
๐ธ๏ธ WebDAV
- Makes nextcloud only upload
SHA1checksums (Nick Craig-Wood) - Fixed the case of
"Bearer"in theAuthorization:header so it agrees with the RFC (Nick Craig-Wood) - Added the
Refererheader to fix problems with WAFs (Nick Craig-Wood)
๐ v1.50.2 - 2019-11-19
๐ Bug Fixes
accounting: fixed a memory leak on retries operations (Nick Craig-Wood)
๐ Drive
- Fixed the listing of the root directory with
drive.filesscope (Nick Craig-Wood) - Fixed
--drive-root-folder-idwith team/shared drives (Nick Craig-Wood)
๐ธ v1.50.1 - 2019-11-02
๐ Bug Fixes
hash: fixed the accidentally changed hash names forDropboxHashandCRC-32(Nick Craig-Wood)fshttp: fixed error reporting ontpslimittoken bucket errors (Nick Craig-Wood)fshttp: doesn't print token bucket errors on context cancelled (Nick Craig-Wood)
๐ Local
- Fixed listings of
.on Windows (Nick Craig-Wood)
โ๏ธ Onedrive
- Fixed
DirMove/Moveafter the Onedrive change (Xiaoxing Ye)
โจ v1.50.0 - 2019-10-26
๐ New backends
- Citrix Sharefile (
https://rclone.org/sharefile/) (Nick Craig-Wood) - Chunker (
https://rclone.org/chunker/) โ an overlay backend to split files into smaller parts (Ivan Andreev) - Mail.ru Cloud (
https://rclone.org/mailru/) (Ivan Andreev)
๐ New Features
encodings(Fabian Mรถller & Nick Craig-Wood)- All backends now use file name encoding to ensure any file name can be written to any backend.
- See the restricted file name docs (
https://rclone.org/overview/#restricted-filenames) for more info, plus the local backend docs. - Some file names may look different in rclone if you're using any control characters in names or unicode FULLWIDTH symbols (
https://en.wikipedia.org/wiki/Halfwidth_and_Fullwidth_Forms_(Unicode_block)).
build- Update to use
go1.13for the build (Nick Craig-Wood) - Dropped support for
go1.9(Nick Craig-Wood) - Build rclone with GitHub actions (Nick Craig-Wood)
- Converted the python scripts to
python3(Nick Craig-Wood) - Swapped
Azure/go-ansitermformattn/go-colorable(Nick Craig-Wood) - Dockerfile fixes (Matei David)
- Added plugin support (
https://github.com/rclone/rclone/blob/master/CONTRIBUTING.md#writing-a-plugin) for backends and commands (Richard Patel)
- Update to use
config- Uses alternating Red/Green in config to make it more obvious (Nick Craig-Wood)
contrib- Added a sample DLNA server Docker Compose manifest. (pataquets)
- Added a sample WebDAV server Docker Compose manifest. (pataquets)
copyurl- Added the
--auto-filenameflag for using the file name from the URL in the destination path (Denis)
- Added the
serve dlna:- Many compatibility improvements (Dan Walters)
- Support for external srt subtitles (Dan Walters)
rc- Added the command
core/quit(Saksham Khanna)
- Added the command
๐ Bug Fixes
sync- Made
--update/-unot transfer files that haven't changed (Nick Craig-Wood) - Objects get freed after they come out of the transfer pipe, to save memory (Nick Craig-Wood)
- Fixed
--files-fromwithout--no-traversedoing a recursive scan (Nick Craig-Wood)
- Made
operations- Fixed accounting for server-side copies (Nick Craig-Wood)
- Displays
'All duplicates removed'only if dedupe was successful (Sezal Agrawal) - Displays
'Deleted X extra copies'only if dedupe was successful (Sezal Agrawal)
accounting- Only allows up to 100 completed transfers in the accounting list, to save memory (Nick Craig-Wood)
- Culls the old time ranges when possible, to save memory (Nick Craig-Wood)
- Fixed the panic due to server-side copy fallback (Ivan Andreev)
- Fixed a memory leak that was noticeable for transfers of large numbers of objects (Nick Craig-Wood)
- Fixed the total duration calculation (Nick Craig-Wood)
cmd- Fixed environment variables not setting command line flags (Nick Craig-Wood)
- Made autocomplete compatible with bash's posix mode for macOS (Danil Semelenov)
- Made
--progresswork in git bash on Windows (Nick Craig-Wood) - Fixed
'compopt: command not found'on autocomplete on macOS (Danil Semelenov)
config- Fixed the setting of non top level flags from environment variables (Nick Craig-Wood)
- Checks config names more carefully and reports errors (Nick Craig-Wood)
- Removed the error:
can't use --size-only and --ignore-size together.(Nick Craig-Wood)
filter: prevents mixing options when--files-fromis in use (Michele Caci)serve sftp: fixed the crash on unsupported operations (e.g.Readlink) (Nick Craig-Wood)
๐ง Mount
- Allows files of unknown size to be read properly (Nick Craig-Wood)
- Skips tests on
<= 2CPUs to avoid lockup (Nick Craig-Wood) - Fixed the panic on
File.Open(Nick Craig-Wood) - Fixed
"mount_fusefs: -o timeout=: option not supported"on FreeBSD (Nick Craig-Wood) - Doesn't pass huge filenames (
>4k) to FUSE bc it can't cope (Nick Craig-Wood)
๐ฆ VFS
- Added the flag
--vfs-case-insensitivefor windows/macOS mounts (Ivan Andreev) - Made objects of unknown size readable through the VFS (Nick Craig-Wood)
- Moved the writeback of dirty data out of the
close()method into its own method (FlushWrites) and removed theclose()call fromFlush()(Brett Dutro) - Stops empty dirs disappearing when renamed on bucket-based remotes (Nick Craig-Wood)
- Stops change notify polling clearing so much of the directory cache (Nick Craig-Wood)
๐ต Azure Blob
- Disabled logging to the Windows event log (Nick Craig-Wood)
๐ ฑ๏ธ B2
- Remove the
unverified:prefix on sha1 โ it was messing with interop (hi CyberDuck bestie) (Nick Craig-Wood) - Box ๐
- Add options so you can grab the access token via JWT auth (David)
- Drive ๐
- Disable HTTP/2 by default to dodge those INTERNAL_ERROR problems (Nick Craig-Wood)
- Make sure the drive root ID is always canonical, always (Nick Craig-Wood)
- Fix
--drive-shared-with-mefrom the root when you're doinglsand--fast-list(Nick Craig-Wood) - Fix ChangeNotify polling for shared drives (Nick Craig-Wood)
- Fix change notify polling when you're using
appDataFolder(Nick Craig-Wood)
- Dropbox ๐ฆ
- Make disallowed filenames errors not retry, like, stop trying (Nick Craig-Wood)
- Fix that nil pointer exception on restricted files (Nick Craig-Wood)
- Fichier
- Fix accessing files > 2GB on 32 bit systems (Nick Craig-Wood)
- FTP
- Allow disabling EPSV mode (Jon Fautley)
- HTTP
- HEAD directory entries in parallel for a lil speedup (Nick Craig-Wood)
- Add
--http-no-headso rclone stops doing HEAD in listings (Nick Craig-Wood)
- Putio
- Add the ability to resume uploads (Cenk Alti)
- S3
- Fix signature v2_auth headers (Anthony Rusdi)
- Fix encoding for control characters (Nick Craig-Wood)
- Only ask for URL encoded directory listings if we actually need them on Ceph (Nick Craig-Wood)
- Add an option for multipart failure behaviour (Aleksandar Jankovic)
- Support for multipart copy (ๅบๅคฉ็ฟผ)
- Fix nil pointer reference if no metadata comes back for an object (Nick Craig-Wood)
- SFTP
- Fix
--sftp-ask-passwordtrying to contact the ssh agent (Nick Craig-Wood) - Fix hashes of files with backslashes (Nick Craig-Wood)
- Include more ciphers with
--sftp-use-insecure-cipher(Carlos Ferreyra)
- Fix
- WebDAV
- Parse and return Sharepoint error response (Henning Surmeier)
v1.49.5 - 2019-10-05 ๐๏ธโจ
Bug Fixes ๐
- Revert back to go1.12.x for the v1.49.x builds, because go1.13.x was causing issues (Nick Craig-Wood)
- Fix rpm packages by using master builds of nfpm (Nick Craig-Wood)
- Fix macOS build after brew changes (Nick Craig-Wood)
v1.49.4 - 2019-09-29 ๐๏ธ
Bug Fixes ๐
cmd/rcd: Address the ZipSlip vulnerability (Richard Patel)accounting: Fix file handle leak on errors (Nick Craig-Wood)oauthutil: Fix security problem when running with two users on the same machine (Nick Craig-Wood)- FTP
- Fix listing of an empty root returning:
error dir not found(Nick Craig-Wood)
- Fix listing of an empty root returning:
- S3
- Fix SetModTime on GLACIER/ARCHIVE objects and implement set/get tier (Nick Craig-Wood)
v1.49.3 - 2019-09-15 ๐๏ธ
Bug Fixes ๐
accounting- Fix total duration calculation (Aleksandar Jankovic)
- Fix "file already closed" on transfer retries (Nick Craig-Wood)
v1.49.2 - 2019-09-08 ๐๏ธ
New Features โจ
build: Add Docker workflow support (Alfonso Montero)
Bug Fixes ๐
accounting: Fix locking in Transfer to avoid deadlock with--progress(Nick Craig-Wood)docs: Fix template argument for mktemp ininstall.sh(Cnly)operations: Fix-u/--updatewith google photos / files of unknown size (Nick Craig-Wood)rc: Fix docs forconfig/create/update/password(Nick Craig-Wood)- Google Cloud Storage
- Fix need for elevated permissions on SetModTime (Nick Craig-Wood)
v1.49.1 - 2019-08-28 ๐๏ธ
Bug Fixes ๐
config: Fix generated passwords being stored as empty password (Nick Craig-Wood)rcd: Added missing parameter for web-gui info logs. (Chaitanya)- Googlephotos
- Fix crash on error response (Nick Craig-Wood)
- Onedrive
- Fix crash on error response (Nick Craig-Wood)
v1.49.0 - 2019-08-26 ๐๏ธ๐
New backends ๐
- 1fichier (https://rclone.org/fichier/) (Laura Hausmann)
- Google Photos (https://rclone.org/googlephotos/) (Nick Craig-Wood)
- Putio (https://rclone.org/putio/) (Cenk Alti)
- premiumize.me (https://rclone.org/premiumizeme/) (Nick Craig-Wood)
New Features โจ
- Experimental web GUI (https://rclone.org/gui/) (Chaitanya Bankanhal)
- Implement
--compare-dest&--copy-dest(yparitcher) - Implement
--suffixwithout--backup-dirfor backup to current dir (yparitcher) config reconnectto re-login (re-run the oauth login) for the backend. (Nick Craig-Wood)config userinfoto discover which user you are logged in as. (Nick Craig-Wood)config disconnectto disconnect you (log out) from the backend. (Nick Craig-Wood)- Add
--use-json-logfor JSON logging (justinalin) - Add context propagation to rclone (Aleksandar Jankovic)
- Reworking internal statistics interfaces so they work with rc jobs (Aleksandar Jankovic)
- Add Higher units for ETA (AbelThar)
- Update rclone logos to new design (Andreas Chlupka)
hash: Add CRC-32 support (Cenk Alti)help showbackend: Fixed advanced option category when there are no standard options (buengese)ncdu: Display/Copy to Clipboard Current Path (Gary Kim)operations:- Run hashing operations in parallel (Nick Craig-Wood)
- Don't calculate checksums when using
--ignore-checksum(Nick Craig-Wood) - Check transfer hashes when using
--size-onlymode (Nick Craig-Wood) - Disable multi thread copy for local to local copies (Nick Craig-Wood)
- Debug successful hashes as well as failures (Nick Craig-Wood)
rc- Add ability to stop async jobs (Aleksandar Jankovic)
- Return current settings if
core/bwlimitcalled without parameters (Nick Craig-Wood) - Rclone-WebUI integration with rclone (Chaitanya Bankanhal)
- Added command line parameter to control the cross origin resource sharing (CORS) in the rcd. (Security Improvement) (Chaitanya Bankanhal)
- Add anchor tags to the docs so links are consistent (Nick Craig-Wood)
- Remove
_asynckey from input parameters after parsing so later operations won't get confused (buengese) - Add call to clear stats (Aleksandar Jankovic)
rcd- Auto-login for web-gui (Chaitanya Bankanhal)
- Implement
--baseurlfor rcd and web-gui (Chaitanya Bankanhal)
serve dlna- Only select interfaces which can multicast for SSDP (Nick Craig-Wood)
- Add more builtin mime types to cover standard audio/video (Nick Craig-Wood)
- Fix missing mime types on Android causing missing videos (Nick Craig-Wood)
serve ftp- Refactor to bring into line with other serve commands (Nick Craig-Wood)
- Implement
--auth-proxy(Nick Craig-Wood)
serve http: Implement--baseurl(Nick Craig-Wood)serve restic: Implement--baseurl(Nick Craig-Wood)serve sftp- Implement auth proxy (Nick Craig-Wood)
- Fix detection of whether server is authorized (Nick Craig-Wood)
serve webdav- Implement
--baseurl(Nick Craig-Wood) - Support
--auth-proxy(Nick Craig-Wood)
- Implement
Bug Fixes ๐
- Make "bad record MAC" a retriable error (Nick Craig-Wood)
copyurl: Fix copying files that return HTTP errors (Nick Craig-Wood)march: Fix checking sub-directories when using--no-traverse(buengese)rc- Fix unmarshalable http.AuthFn in options and put in test for marshalability (Nick Craig-Wood)
- Move job expire flags to rc to fix initialization problem (Nick Craig-Wood)
- Fix
--loopbackwithrc/listand others (Nick Craig-Wood)
rcat: Fix slowdown on systems with multiple hashes (Nick Craig-Wood)rcd: Fix permissions problems on cache directory with web gui download (Nick Craig-Wood)- Mount ๐ป
- Default
--daemon-timeoutto 15 minutes on macOS and FreeBSD (Nick Craig-Wood) - Update docs to show mounting from root OK for bucket-based (Nick Craig-Wood)
- Remove nonseekable flag from write files (Nick Craig-Wood)
- Default
- VFS
- Make write without cache more efficient (Nick Craig-Wood)
- Fix
--vfs-cache-modeminimal and writes ignoring cached files (Nick Craig-Wood)
- Local
- Add
--local-case-sensitiveand--local-case-insensitive(Nick Craig-Wood) - Avoid polluting page cache when uploading local files to remote backends (Michaล Matczuk)
- Don't calculate any hashes by default (Nick Craig-Wood)
- Fadvise run syscall on a dedicated go routine (Michaล Matczuk)
- Add
- Azure Blob
- Azure Storage Emulator support (Sandeep)
- Updated config help details to remove connection string references (Sandeep)
- Make all operations work from the root (Nick Craig-Wood)
- B2
- Implement link sharing (yparitcher)
- Enable server-side copy to copy between buckets (Nick Craig-Wood)
- Make all operations work from the root (Nick Craig-Wood)
- Drive
- Fix server-side copy of big files (Nick Craig-Wood)
- Update API for teamdrive use (Nick Craig-Wood)
- Add error for purge with
--drive-trashed-only(ginvine)
- Fichier
- Make FolderID int and adjust related code (buengese)
- Google Cloud Storage
- Reduce oauth scope requested as suggested by Google (Nick Craig-Wood)
- Make all operations work from the root (Nick Craig-Wood)
- HTTP
- Add
--http-headersflag for setting arbitrary headers (Nick Craig-Wood)
- Add
- Jottacloud
- Use new api for retrieving internal username (buengese)
- Refactor configuration and minor cleanup (buengese)
- Koofr
- Support setting modification times on Koofr backend. (jaKa)
- Opendrive
- Refactor to use existing
lib/restfacilities for uploads (Nick Craig-Wood)
- Refactor to use existing
- Qingstor
- Upgrade to v3 SDK and fix listing loop (Nick Craig-Wood)
- Make all operations work from the root (Nick Craig-Wood)
- S3
- Add INTELLIGENT_TIERING storage class (Matti Niemenmaa)
- Make all operations work from the root (Nick Craig-Wood)
- SFTP
- Add missing interface check and fix About (Nick Craig-Wood)
- Completely ignore all modtime checks if
SetModTime=false(Jon Fautley) - Support md5/sha1 with rsync.net (Nick Craig-Wood)
- Save the md5/sha1 command in use to the config file for efficiency (Nick Craig-Wood)
- Opt-in support for
diffie-hellman-group-exchange-sha256diffie-hellman-group-exchange-sha1(Yi FU) โ yes bestie, you get to opt in ๐ - Swift
- Use
FixRangeOptionto fix 0 length files via the VFS (Nick Craig-Wood) - Fix upload when using
no_chunkto return the correct size (Nick Craig-Wood) - Make all operations work from the root (Nick Craig-Wood)
- Fix segments leak during failed large file uploads. (nguyenhuuluan434)
- Use
- WebDAV
- Add
--webdav-bearer-token-command(Nick Craig-Wood) - Refresh token when it expires with
--webdav-bearer-token-command(Nick Craig-Wood) - Add docs for using
bearer_token_commandwithoidc-agent(Paul Millar)
- Add
๐ v1.48.0 - 2019-06-15 ๐
- New commands ๐
serve sftp: Serve an rclone remote over SFTP (Nick Craig-Wood)
- New Features โจ
- Multi threaded downloads to local storage (Nick Craig-Wood) ๐ฅ
- controlled with
--multi-thread-cutoffand--multi-thread-streams
- controlled with
- Use
rclone.conffrom rclone executable directory to enable portable use (albertony) ๐ - Allow sync of a file and a directory with the same name (forgems)
- this is common on bucket-based remotes, e.g.
s3,gcsโ iconic behavior tbh ๐ชฃ
- this is common on bucket-based remotes, e.g.
- Add
--ignore-case-syncfor forced case insensitivity (garry415) - Implement
--stats-one-line-dateand--stats-one-line-date-format(Peter Berbec) - Log an
ERRORfor all commands which exit with non-zero status (Nick Craig-Wood) - Use
go-homedirto read the home directory more reliably (Nick Craig-Wood) ๐ - Enable creating encrypted config through external script invocation (Wojciech Smigielski)
build: Drop support forgo1.8(Nick Craig-Wood)config: Make config create/update encrypt passwords where necessary (Nick Craig-Wood) ๐copyurl: Honor--no-check-certificate(Stefan Breunig)install: Linux skip man pages if nomandb(didil)lsf: Support showing the Tier of the object (Nick Craig-Wood)lsjson๐งพ- Added
EncryptedPathto output (calisro) - Support showing the Tier of the object (Nick Craig-Wood)
- Add
IsBucketfield for bucket-based remote listing of the root (Nick Craig-Wood)
- Added
rc๐๏ธ- Add
--loopbackflag to run commands directly without a server (Nick Craig-Wood) - Add
operations/fsinfo: Return information about the remote (Nick Craig-Wood) - Skip auth for
OPTIONSrequest (Nick Craig-Wood) cmd/providers: AddDefaultStr,ValueStrandTypefields (Nick Craig-Wood)jobs: Make job expiry timeouts configurable (Aleksandar Jankovic)
- Add
serve dlnareworked and improved (Dan Walters)serve ftp: add--ftp-public-ipflag to specify public IP (calistri)serve restic: Add support for--private-reposinserve restic(Florian Apolloner)serve webdav: Combineserve webdavandserve http(Gary Kim)size: Ignore negative sizes when calculating total (Garry McNulty)
- Multi threaded downloads to local storage (Nick Craig-Wood) ๐ฅ
- Bug Fixes ๐
- Make
moveandcopyindividual files obey--backup-dir(Nick Craig-Wood) - If
--ignore-checksumis in effect, don't calculate checksum (Nick Craig-Wood) moveto: Fix case-insensitive same remote move (Gary Kim)rc: Fix serving bucket-based objects with--rc-serve(Nick Craig-Wood)serve webdav: FixserveDirnot being updated with changes from webdav (Gary Kim)
- Make
- Mount ๐๏ธ
- Fix poll interval documentation (Animosity022)
- VFS
- Make
WriteAtfor non cached files work with non-sequential writes (Nick Craig-Wood)
- Make
- Local ๐ป
- Only calculate the required hashes for big speedup (Nick Craig-Wood) ๐๏ธ
- Log errors when listing instead of returning an error (Nick Craig-Wood)
- Fix preallocate warning on Linux with ZFS (Nick Craig-Wood)
- Crypt ๐ต๏ธ
- Make
rclone dedupework through crypt (Nick Craig-Wood) - Fix wrapping of
ChangeNotifyto decrypt directories properly (Nick Craig-Wood) - Support
PublicLink(rclone link) of underlying backend (Nick Craig-Wood) - Implement Optional methods
SetTier,GetTier(Nick Craig-Wood)
- Make
- B2
- Implement server-side copy (Nick Craig-Wood)
- Implement
SetModTime(Nick Craig-Wood)
- Drive ๐
- Fix move and copy from TeamDrive to GDrive (Fionera)
- Add notes that cleanup works in the background on drive (Nick Craig-Wood)
- Add
--drive-server-side-across-configsto default back to old server-side copy semantics by default (Nick Craig-Wood) - Add
--drive-size-as-quotato show storage quota usage for file size (Garry McNulty)
- FTP
- Add FTP List timeout (Jeff Quinn)
- Add FTP over TLS support (Gary Kim) ๐
- Add
--ftp-no-check-certificateoption for FTPS (Gary Kim)
- Google Cloud Storage
- Fix upload errors when uploading pre 1970 files (Nick Craig-Wood) โณ
- Jottacloud
- Add support for selecting device and mountpoint. (buengese)
- Mega
- Add cleanup support (Gary Kim)
- Onedrive
- More accurately check if root is found (Cnly)
- S3
- Support S3 Accelerated endpoints with
--s3-use-accelerate-endpoint(Nick Craig-Wood) ๐จ - Add config info for Wasabi's EU Central endpoint (Robert Marko)
- Make
SetModTimework for GLACIER while syncing (Philip Harvey)
- Support S3 Accelerated endpoints with
- SFTP
- Add About support (Gary Kim)
- Fix about parsing of
dfresults so it can cope with -ve results (Nick Craig-Wood) - Send custom client version and debug server version (Nick Craig-Wood)
- WebDAV
- Retry on 423 Locked errors (Nick Craig-Wood)
๐ฆ v1.47.0 - 2019-04-13 ๐ฆ
- New backends ๐
- Backend for Koofr cloud storage service. (jaKa)
- New Features โจ
- Resume downloads if the reader fails in copy (Nick Craig-Wood) ๐ช
- this means rclone will restart transfers if the source has an error
- this is most useful for downloads or cloud to cloud copies
- Use
--fast-listfor listing operations where it won't use more memory (Nick Craig-Wood)- this should speed up the following operations on remotes which support
ListR dedupe,serve resticlsf,ls,lsl,lsjson,lsd,md5sum,sha1sum,hashsum,size,delete,cat,settier- use
--disable ListRto get old behaviour if required
- this should speed up the following operations on remotes which support
- Make
--files-fromtraverse the destination unless--no-traverseis set (Nick Craig-Wood)- this fixes
--files-fromwith Google drive and excessive API use in general.
- this fixes
- Make server-side copy account bytes and obey
--max-transfer(Nick Craig-Wood) - Add
--create-empty-src-dirsflag and default to not creating empty dirs (ishuah) - Add client side TLS/SSL flags
--ca-cert/--client-cert/--client-key(Nick Craig-Wood) ๐ - Implement
--suffix-keep-extensionfor use with--suffix(Nick Craig-Wood) build:- Switch to semver compliant version tags to be go modules compliant (Nick Craig-Wood)
- Update to use
go1.12.xfor the build (Nick Craig-Wood)
serve dlna: Add connection manager service description to improve compatibility (Dan Walters)lsf: Add'e'format to show encrypted names and'o'for original IDs (Nick Craig-Wood)lsjson: Added--files-onlyand--dirs-onlyflags (calistri)rc: Implementoperations/publiclinkthe equivalent ofrclone link(Nick Craig-Wood)
- Resume downloads if the reader fails in copy (Nick Craig-Wood) ๐ช
- Bug Fixes ๐
accounting: Fix total ETA when--stats-unit bitsis in effect (Nick Craig-Wood)- Bash TAB completion ๐
- Use private custom func to fix clash between rclone and kubectl (Nick Craig-Wood)
- Fix for remotes with underscores in their names (Six)
- Fix completion of remotes (Florian Gambรถck)
- Fix autocompletion of remote paths with spaces (Danil Semelenov)
serve dlna: Fix root XML service descriptor (Dan Walters)ncdu: Fix display corruption with Chinese characters (Nick Craig-Wood) ๐ญ- Add
SIGTERMto signals which run the exit handlers on unix (Nick Craig-Wood) rc: Reload filter when the options are set via the rc (Nick Craig-Wood)
- VFS / Mount
- Fix FreeBSD: Ignore Truncate if called with no readers and already the correct size (Nick Craig-Wood)
- Read directory and check for a file before mkdir (Nick Craig-Wood)
- Shorten the locking window for
vfs/refresh(Nick Craig-Wood)
- Azure Blob
- Enable MD5 checksums when uploading files bigger than the "Cutoff" (Dr.Rx)
- Fix SAS URL support (Nick Craig-Wood)
- B2
- Allow manual configuration of backblaze
downloadUrl(Vince) - Ignore
already_hiddenerror on remove (Nick Craig-Wood) - Ignore malformed
src_last_modified_millis(Nick Craig-Wood)
- Allow manual configuration of backblaze
- Drive ๐
- Add
--skip-checksum-gphotosto ignore incorrect checksums on Google Photos (Nick Craig-Wood) - Allow server-side move/copy between different remotes. (Fionera)
- Add docs on team drives and
--fast-listeventual consistency (Nestar47) - Fix imports of text files (Nick Craig-Wood)
- Fix range requests on 0 length files (Nick Craig-Wood)
- Fix creation of duplicates with server-side copy (Nick Craig-Wood)
- Add
- Dropbox
- Retry blank errors to fix long listings (Nick Craig-Wood)
- FTP
- Add
--ftp-concurrencyto limit maximum number of connections (Nick Craig-Wood)
- Add
- Google Cloud Storage
- Fall back to default application credentials (marcintustin)
- Allow bucket policy only buckets (Nick Craig-Wood)
- HTTP
- Add
--http-no-slashfor websites with directories with no slashes (Nick Craig-Wood) - Remove duplicates from listings (Nick Craig-Wood)
- Fix socket leak on 404 errors (Nick Craig-Wood)
- Add
- Jottacloud
- Fix token refresh (Sebastian Bรผnger)
- Add device registration (Oliver Heyme)
- Onedrive
- Implement graceful cancel of multipart uploads if rclone is interrupted (Cnly)
- Always add trailing colon to path when addressing items, (Cnly)
- Return errors instead of panic for invalid uploads (Fabian Mรถller)
- S3
- Add support for "Glacier Deep Archive" storage class (Manu) ๐ง
- Update Dreamhost endpoint (Nick Craig-Wood)
- Note incompatibility with CEPH Jewel (Nick Craig-Wood)
- SFTP
- Allow custom ssh client config (Alexandru Bumbacea)
๐ฆ Swift
- Obey
Retry-Afterso you can actually restore from OVH cold storage, bestie ๐ง (Nick Craig-Wood) - Work around token expiry on CEPH (Nick Craig-Wood)
๐ WebDAV
- Let the
IsCollectionproperty be an integer or a boolean, honestly either works (Nick Craig-Wood) - Fixed a race when creating directories (Nick Craig-Wood)
- Fixed
About/dfwhen reading the available/total returns 0 (Nick Craig-Wood)
๐ v1.46 - 2019-02-09
โจ New backends
- Alibaba Cloud (Aliyun) OSS is now supported via the
s3backend (Nick Craig-Wood)
โจ New commands
serve dlna: serves a remote via DLNA for the local network (nicolov)
โจ New Features
copy,move: restored the deprecated--no-traverseflag (Nick Craig-Wood)- this is genuinely so useful when you're transferring a small number of files into a large destination
genautocomplete: added remote path completion for bash completion (Christopher Peterson & Danil Semelenov)- Buffer memory handling got reworked so it returns memory back to the OS better (Nick Craig-Wood)
- a buffer recycling library now replaces
sync.Pool - optionally uses memory mapped memory for better memory shrinking
- turn it on with
--use-mmapif you're having memory problems โ not default yet
- a buffer recycling library now replaces
- Reading of files specified by
--files-fromis now parallelised (Nick Craig-Wood) check: added stats showing total files matched (Dario Guzik)- Allow rename/delete of open files under Windows (Nick Craig-Wood)
lsjson: use exactly the correct number of decimal places in the seconds (Nick Craig-Wood)- Added cookie support with the cmdline switch
--use-cookiesfor all HTTP based remotes (qip) - Warn if
--checksumis set but there are no hashes available (Nick Craig-Wood) - Reworked rate limiting (pacer) to be more accurate and allow bursting (Nick Craig-Wood)
- Improved error reporting for too many/few arguments in commands (Nick Craig-Wood)
listremotes: removed the-lshort flag since it conflicts with the new global flag (weetmuts)- http serving with auth now generates INFO messages when auth fails (Nick Craig-Wood)
๐ Bug Fixes
- Fixed the layout of stats (Nick Craig-Wood)
- Fixed
--progresscrash under Windows Jenkins (Nick Craig-Wood) - Fixed transfer of google/onedrive docs by calling
RcatinCopywhen size is-1(Cnly) copyurl: fixed checking of--dry-run(Denis Skovpen)
๐ป Mount
- Check that the mountpoint and the local directory to mount don't overlap (Nick Craig-Wood)
- Fixed mount size under 32 bit Windows (Nick Craig-Wood)
๐ VFS
- Implemented renaming of directories for backends without
DirMove(Nick Craig-Wood)- now all backends except
b2support renaming directories
- now all backends except
- Implemented
--vfs-cache-max-sizeto limit the total size of the cache (Nick Craig-Wood) - Added
--dir-permsand--file-permsflags to set default permissions (Nick Craig-Wood) - Fixed deadlock on concurrent operations on a directory (Nick Craig-Wood)
- Fixed deadlock between
RWFileHandle.closeandFile.Remove(Nick Craig-Wood) - Fixed renaming/deleting open files with cache mode "writes" under Windows (Nick Craig-Wood)
- Fixed panic on rename with
--dry-runset (Nick Craig-Wood) - Fixed
vfs/refreshwithrecurse=trueneeding the--fast-listflag
๐ Local
- Added support for
-l/--links(symbolic link translation) (yair@unicorn)- this works by showing links as
link.rclonelinkโ see the local backend docs for more info - โ ๏ธ this errors if used with
-L/--copy-links
- this works by showing links as
- Fixed renaming/deleting open files on Windows (Nick Craig-Wood)
๐ Crypt
- Check for maximum length before decrypting a filename to fix a panic (Garry McNulty)
โ๏ธ Azure Blob
- Allow building the azureblob backend on *BSD (themylogin)
- Use the rclone HTTP client to support
--dump headers,--tpslimit, etc. (Nick Craig-Wood) - Use the s3 pacer for 0 delay in non error conditions (Nick Craig-Wood)
- Ignore directory markers (Nick Craig-Wood)
- Stop
Mkdirfrom attempting to create containers that already exist (Nick Craig-Wood)
๐ ฑ๏ธ B2
cleanup: will remove unfinished large files >24hrs old (Garry McNulty)- For a bucket limited application key, check the bucket name (Nick Craig-Wood)
- before this, rclone would use the authorised bucket no matter what you put on the command line ๐
- Added
--b2-disable-checksumflag (Wojciech Smigielski)- this enables large files to be uploaded without a SHA-1 hash, purely for speed reasons
๐ Drive
- Set default pacer to 100ms for 10 tps (Nick Craig-Wood)
- this fits the Google defaults so much better and reduces the 403 errors massively
- added
--drive-pacer-min-sleepand--drive-pacer-burstto control the pacer
- Improved
ChangeNotifysupport for items with multiple parents (Fabian Mรถller) - Fixed
ListRfor items with multiple parents โ this fixes oddities withvfs/refresh(Fabian Mรถller) - Fixed using
--drive-impersonateand appfolders (Nick Craig-Wood) - Fixed google docs in
rclone mountfor some (not all) applications (Nick Craig-Wood)
๐ฆ Dropbox
Retry-Aftersupport for the Dropbox backend (Mathieu Carbou)
๐ก FTP
- Wait for 60 seconds for a connection to
Closethen declare it dead (Nick Craig-Wood)- helps with indefinite hangs on some FTP servers
๐ฉ Google Cloud Storage
- Updated google cloud storage endpoints (weetmuts)
๐ HTTP
- Added an example with username and password, which is supported but wasn't documented (Nick Craig-Wood)
- Fixed backend with
--files-fromand nonexistent files (Nick Craig-Wood)
๐ซ๐ท Hubic
- Make the error message more informative if authentication fails (Nick Craig-Wood)
๐ Jottacloud
- Resume and deduplication support (Oliver Heyme)
- Use token auth for all API requests, and don't store the password anymore (Sebastian Bรผnger)
- Added support for 2-factor authentication (Sebastian Bรผnger)
๐ Mega
- Implemented v2 account login, which fixes logins for newer Mega accounts (Nick Craig-Wood)
- Return an error if an unknown length file is attempted to be uploaded (Nick Craig-Wood)
- Added new error codes for better error reporting (Nick Craig-Wood)
๐ต Onedrive
- Fixed broken support for "shared with me" folders (Alex Chen)
- Fixed root ID not normalised (Cnly)
- Return
errinstead of panic on unknown-sized uploads (Cnly)
๐ Qingstor
- Fixed go routine leak on multipart upload errors (Nick Craig-Wood)
- Added upload chunk size/concurrency/cutoff control (Nick Craig-Wood)
- Default
--qingstor-upload-concurrencyto 1 to work around a bug (Nick Craig-Wood)
๐ชฃ S3
- Implemented
--s3-upload-cutofffor single part uploads below this (Nick Craig-Wood) - Changed
--s3-upload-concurrencydefault to 4 to increase performance (Nick Craig-Wood) - Added
--s3-bucket-aclto control bucket ACL (Nick Craig-Wood) - Auto detect region for buckets on operation failure (Nick Craig-Wood)
- Added GLACIER storage class (William Cocker)
- Added Scaleway to the s3 documentation (Rรฉmy Lรฉone)
- Added AWS endpoint
eu-north-1(weetmuts)
๐ SFTP
- Added support for PEM encrypted private keys (Fabian Mรถller)
- Added an option to force the usage of an ssh-agent (Fabian Mรถller)
- Perform environment variable expansion on key-file (Fabian Mรถller)
- Fixed
rmdiron Windows based servers (e.g. CrushFTP) (Nick Craig-Wood) - Fixed
rmdirdeleting directory contents on some SFTP servers (Nick Craig-Wood) - Fixed error on dangling symlinks (Nick Craig-Wood)
๐ฆ Swift
- Added
--swift-no-chunkto disable segmented uploads inrcat/mount(Nick Craig-Wood) - Introduced application credential auth support (kayrus)
- Fixed memory usage by slimming
Object(Nick Craig-Wood) - Fixed extra requests on upload (Nick Craig-Wood)
- Fixed reauth on big files (Nick Craig-Wood)
๐ค Union
- Fixed
poll-intervalnot working (Nick Craig-Wood)
๐ WebDAV
- Support
About, which meansrclone mountwill show the correct disk size (Nick Craig-Wood) - Support MD5 and SHA1 hashes with Owncloud and Nextcloud (Nick Craig-Wood)
- Fail soft on time parsing errors (Nick Craig-Wood)
- Fixed infinite loop on failed directory creation (Nick Craig-Wood)
- Fixed identification of directories for Bitrix Site Manager (Nick Craig-Wood)
- Fixed upload of 0 length files on some servers (Nick Craig-Wood)
- If
MKCOLfails with 423 Locked, assume the directory already exists (Nick Craig-Wood)
๐ v1.45 - 2018-11-24
โจ New backends
- The Yandex backend was re-written โ see below for details (Sebastian Bรผnger)
โจ New commands
rcd: a brand new command that just serves the remote control API (Nick Craig-Wood)
โจ New Features
- The remote control API (
rc) was greatly expanded to allow full control over rclone (Nick Craig-Wood)- sensitive operations require authorization, or the
--rc-no-authflag config/*operations to configure rcloneoptions/*for reading/setting command line flagsoperations/*for all low level operations, e.g. copy file, list directorysync/*for sync, copy and move--rc-filesflag to serve files on the rc http server- this is for building web native GUIs for rclone
- optionally serving objects on the rc http server
- ensure rclone fails to start up if the
--rcport is in use already - see the rc docs (https://rclone.org/rc/) for more info
- sensitive operations require authorization, or the
sync/copy/move- Make
--files-fromonly read the objects specified and not scan directories (Nick Craig-Wood)- this is a huuuge speed improvement for destinations with lots of files
- Make
- filter: added
--ignore-caseflag (Nick Craig-Wood) - ncdu: added remove function ('
d' key) (Henning Surmeier) - rc command
- added
--jsonflag for structured JSON input (Nick Craig-Wood) - added
--userand--passflags, and interpret--rc-user,--rc-pass,--rc-addr(Nick Craig-Wood)
- added
- build
- require go1.8 or later for compilation (Nick Craig-Wood)
- enable softfloat on MIPS arch (Scott Edlund)
- Integration test framework revamped with a better report and better retries (Nick Craig-Wood)
- Bug Fixes
cmd: Make--progressupdate the stats correctly at the end ๐ (Nick Craig-Wood)config: Create config directory on save if it is missing (Nick Craig-Wood)dedupe: Check for existing filename before renaming a dupe file (ssaqua)move: Don't create directories with--dry-run(Nick Craig-Wood)operations: FixPurgeandRmdirswhen dir is not the root (Nick Craig-Wood)serve http/webdav/restic: Ensure rclone exits if the port is in use (Nick Craig-Wood)
- Mount
- Make
--volnamework for Windows and macOS (Nick Craig-Wood)
- Make
- Azure Blob
- Avoid context deadline exceeded error by setting a large
TryTimeoutvalue (brused27) - Fix erroneous
Rmdirerror "directory not empty" (Nick Craig-Wood) - Wait for up to 60s to create a just deleted container (Nick Craig-Wood)
- Avoid context deadline exceeded error by setting a large
- Dropbox
- Add dropbox impersonate support (Jake Coggiano)
- Jottacloud
- Fix bug in
--fast-listhanding of empty folders (albertony)
- Fix bug in
- Opendrive
- Fix transfer of files with
+and&in (Nick Craig-Wood) - Fix retries of upload chunks (Nick Craig-Wood)
- Fix transfer of files with
- S3
- Set ACL for server-side copies to that provided by the user (Nick Craig-Wood)
- Fix
role_arn,credential_source, ... (Erik Swanson) - Add config info for Wasabi's US-West endpoint (Henry Ptasinski)
- SFTP
- Ensure file hash checking is really disabled (Jon Fautley)
- Swift
- Add pacer for retries to make swift more reliable (Nick Craig-Wood)
- WebDAV
- Add
Content-TypetoPUTrequests (Nick Craig-Wood) - Fix config parsing so
--webdav-userand--webdav-passflags work (Nick Craig-Wood) - Add RFC3339 date format (Ralf Hemberger)
- Add
- Yandex
- The yandex backend was re-written (Sebastian Bรผnger)
- This implements low level retries (Sebastian Bรผnger)
Copy,Move,DirMove,PublicLinkandAboutoptional interfaces (Sebastian Bรผnger)- Improved general error handling (Sebastian Bรผnger)
- Removed
ListRfor now due to inconsistent behaviour (Sebastian Bรผnger)
- The yandex backend was re-written (Sebastian Bรผnger)
v1.44 - 2018-10-15 ๐
- New commands
serve ftp: Add ftp server (Antoine GIRARD)settier: perform storage tier changes on supported remotes (sandeepkru)
- New Features
- Reworked command line help
- Make default help less verbose (Nick Craig-Wood)
- Split flags up into global and backend flags (Nick Craig-Wood)
- Implement specialised help for flags and backends (Nick Craig-Wood)
- Show URL of backend help page when starting config (Nick Craig-Wood)
stats: Long names now split in center (Joanna Marek)- Add
--log-formatflag for more control over log output (dcpu) rc: Add support forOPTIONSand basic CORS (frenos)stats: showFatalErrorsandNoRetryErrorsin stats (Cรฉdric Connes)
- Reworked command line help
- Bug Fixes
- Fix
-Pnot ending with a new line (Nick Craig-Wood) config: don't create default config dir when user supplies--config(albertony)- Don't print non-ASCII characters with
--progresson windows (Nick Craig-Wood) - Correct logs for excluded items (ssaqua)
- Fix
- Mount
- Remove EXPERIMENTAL tags (Nick Craig-Wood)
- VFS
- Fix race condition detected by serve ftp tests (Nick Craig-Wood)
- Add
vfs/poll-intervalrc command (Fabian Mรถller) - Enable rename for nearly all remotes using server-side
MoveorCopy(Nick Craig-Wood) - Reduce directory cache cleared by poll-interval (Fabian Mรถller)
- Remove EXPERIMENTAL tags (Nick Craig-Wood)
- Local
- Skip bad symlinks in dir listing with
-Lenabled (Cรฉdric Connes) - Preallocate files on Windows to reduce fragmentation (Nick Craig-Wood)
- Preallocate files on linux with
fallocate(2)(Nick Craig-Wood)
- Skip bad symlinks in dir listing with
- Cache
- Add
cache/fetchrc function (Fabian Mรถller) - Fix worker scale down (Fabian Mรถller)
- Improve performance by not sending info requests for cached chunks (dcpu)
- Fix error return value of
cache/fetchrc method (Fabian Mรถller) - Documentation fix for
cache-chunk-total-size(Anagh Kumar Baranwal) - Preserve leading
/in wrapped remote path (Fabian Mรถller) - Add
plex_insecureoption to skip certificate validation (Fabian Mรถller) - Remove entries that no longer exist in the source (dcpu)
- Add
- Crypt
- Preserve leading
/in wrapped remote path (Fabian Mรถller)
- Preserve leading
- Alias
- Fix handling of Windows network paths (Nick Craig-Wood)
- Azure Blob
- Add
--azureblob-list-chunkparameter (Santiago Rodrรญguez) - Implemented
settiercommand support on azureblob remote. (sandeepkru) - Work around SDK bug which causes errors for chunk-sized files (Nick Craig-Wood)
- Add
- Box
- Implement link sharing. (Sebastian Bรผnger)
- Drive
- Add
--drive-import-formats- google docs can now be imported (Fabian Mรถller)- Rewrite mime type and extension handling (Fabian Mรถller)
- Add document links (Fabian Mรถller)
- Add support for multipart document extensions (Fabian Mรถller)
- Add support for apps-script to json export (Fabian Mรถller)
- Fix escaped chars in documents during list (Fabian Mรถller)
- Add
--drive-v2-download-min-sizea workaround for slow downloads (Fabian Mรถller) - Improve directory notifications in
ChangeNotify(Fabian Mรถller) - When listing team drives in config, continue on failure (Nick Craig-Wood)
- Add
- FTP
- Add a small pause after failed upload before deleting file (Nick Craig-Wood)
- Google Cloud Storage
- Fix
service_account_filebeing ignored (Fabian Mรถller)
- Fix
- Jottacloud
- Minor improvement in quota info (omit if unlimited) (albertony)
- Add
--fast-listsupport (albertony) - Add permanent delete support:
--jottacloud-hard-delete(albertony) - Add link sharing support (albertony)
- Fix handling of reserved characters. (Sebastian Bรผnger)
- Fix socket leak on
Object.Remove(Nick Craig-Wood)
- Onedrive
- Rework to support Microsoft Graph (Cnly)
- NB this will require re-authenticating the remote
- Removed upload cutoff and always do session uploads (Oliver Heyme)
- Use single-part upload for empty files (Cnly)
- Fix new fields not saved when editing old config (Alex Chen)
- Fix sometimes special chars in filenames not replaced (Alex Chen)
- Ignore OneNote files by default (Alex Chen)
- Add link sharing support (jackyzy823)
- Rework to support Microsoft Graph (Cnly)
- S3
- Use custom pacer, to retry operations when reasonable (Craig Miskell)
- Use configured server-side-encryption and storage class options when calling
CopyObject()(Paul Kohout) - Make
--s3-v2-authflag (Nick Craig-Wood) - Fix v2 auth on files with spaces (Nick Craig-Wood)
- Union
- Implement union backend which reads from multiple backends (Felix Brucker)
- Implement optional interfaces (
Move,DirMove,Copy, etc.) (Nick Craig-Wood) - Fix
ChangeNotifyto support multiple remotes (Fabian Mรถller) - Fix
--backup-diron union backend (Nick Craig-Wood)
- WebDAV
- Add another time format (Nick Craig-Wood)
- Add a small pause after failed upload before deleting file (Nick Craig-Wood)
- Add workaround for missing mtime (buergi)
- Sharepoint: Renew cookies after 12hrs (Henning Surmeier)
- Yandex
- Remove redundant nil checks (teresy)
v1.43.1 - 2018-09-07 ๐
Point release to fix hubic and azureblob backends.
- Bug Fixes
ncdu: Return error instead oflog.FatalinShow(Fabian Mรถller)cmd: Fix crash with--progressand--stats 0(Nick Craig-Wood)docs: Tidy website display (Anagh Kumar Baranwal)
- Azure Blob:
- Fix multi-part uploads. (sandeepkru)
- Hubic
- Fix uploads (Nick Craig-Wood)
- Retry auth fetching if it fails to make hubic more reliable (Nick Craig-Wood)
v1.43 - 2018-09-01 ๐ฆ
- New backends
- Jottacloud (Sebastian Bรผnger)
- New commands
copyurl: copies a URL to a remote (Denis)
- New Features
- Reworked config for backends (Nick Craig-Wood)
- All backend config can now be supplied by command line, env var or config file
- Advanced section in the config wizard for the optional items
- A large step towards rclone backends being usable in other go software
- Allow on the fly remotes with
:backend:syntax
- Stats revamp
- Add
--progress/-Pflag to show interactive progress (Nick Craig-Wood) - Show the total progress of the sync in the stats (Nick Craig-Wood)
- Add
--stats-one-lineflag for single line stats (Nick Craig-Wood)
- Add
- Added weekday schedule into
--bwlimit(Mateusz) lsjson: Add option to show the original object IDs (Fabian Mรถller)serve webdav: MakeContent-Typewithout reading the file and add--etag-hash(Nick Craig-Wood)- build
- Build macOS with native compiler (Nick Craig-Wood)
- Update to use go1.11 for the build (Nick Craig-Wood)
- rc
- Added
core/statsto return the stats (reddi1)
- Added
version --check: Prints the current release and beta versions (Nick Craig-Wood)
- Reworked config for backends (Nick Craig-Wood)
- Bug Fixes
- accounting
- Fix time to completion estimates (Nick Craig-Wood)
- Fix moving average speed for file stats (Nick Craig-Wood)
config: Fix error reading password from piped input (Nick Craig-Wood)move: Fix--delete-empty-src-dirsflag to delete all empty dirs on move (ishuah)
- accounting
- Mount
- Implement
--daemon-timeoutflag for OSXFUSE (Nick Craig-Wood) - Fix mount
--daemonnot working with encrypted config (Alex Chen) - Clip the number of blocks to
2^32-1on macOS - fixes borg backup (Nick Craig-Wood)
- Implement
- VFS
- Enable
vfs-read-chunk-sizeby default (Fabian Mรถller) - Add the
vfs/refreshrc command (Fabian Mรถller) - Add non recursive mode to
vfs/refreshrc command (Fabian Mรถller) - Try to seek buffer on read only files (Fabian Mรถller)
- Enable
- Local
- Fix the crash that happened whenever the deprecated
--local-no-unicode-normalizationgot supplied (Nick Craig-Wood) ๐ญ like bestie it literally did not want to be used - Fix that mkdir error when you try to copy files to the root of a drive on windows (Nick Craig-Wood) ๐
๐ Cache
- Fix a nil pointer deref when using
lsjsonon a cached directory (Nick Craig-Wood) - Fix a nil pointer deref that caused an occasional crash on playback (Nick Craig-Wood)
๐ Crypt
- Fix the accounting when checking hashes on upload (Nick Craig-Wood)
โ๏ธ Amazon Cloud Drive
- Made it very clear in the docs that rclone has no ACD keys (Nick Craig-Wood) โ no cap, none, stop asking
๐ฉต Azure Blob
- Add connection string and SAS URL auth (Nick Craig-Wood)
- List the container to see if it exists (Nick Craig-Wood)
- Port new Azure Blob Storage SDK (sandeepkru)
- Added blob tier, tier between Hot, Cool and Archive. (sandeepkru)
- Remove leading
/from paths (Nick Craig-Wood)
๐งบ B2
- Support Application Keys (Nick Craig-Wood)
- Remove leading
/from paths (Nick Craig-Wood)
๐ฆ Box
- Fix upload of > 2GB files on 32 bit platforms (Nick Craig-Wood)
- Make
--box-commit-retriesflag defaulting to 100 to fix large uploads (Nick Craig-Wood)
๐ Drive
- Add
--drive-keep-revision-foreverflag (lewapm) - Handle gdocs when filtering file names in list (Fabian Mรถller)
- Support using
--fast-listfor large speedups (Fabian Mรถller)
๐ FTP
- Fix
Put mkParentDir failed: 521for BunnyCDN (Nick Craig-Wood)
๐ฉ๏ธ Google Cloud Storage
- Fix index out of range error with
--fast-list(Nick Craig-Wood)
๐ Jottacloud
- Fix MD5 error check (Oliver Heyme)
- Handle empty time values (Martin Polden)
- Calculate missing MD5s (Oliver Heyme)
- Docs, fixes and tests for MD5 calculation (Nick Craig-Wood)
- Add optional MimeTyper interface. (Sebastian Bรผnger)
- Implement optional About interface (for df support). (Sebastian Bรผnger)
๐ฆ Mega
- Wait for events instead of arbitrary sleeping (Nick Craig-Wood)
- Add
--mega-hard-deleteflag (Nick Craig-Wood) - Fix failed logins with upper case chars in email (Nick Craig-Wood)
๐ Onedrive
- Shared folder support (Yoni Jah)
- Implement
DirMove(Cnly) - Fix rmdir sometimes deleting directories with contents (Nick Craig-Wood) ๐ the audacity
๐ธ Pcloud
- Delete half uploaded files on upload error (Nick Craig-Wood)
๐๏ธ Qingstor
- Remove leading
/from paths (Nick Craig-Wood)
๐ชฃ S3
- Fix index out of range error with
--fast-list(Nick Craig-Wood) - Add
--s3-force-path-style(Nick Craig-Wood) - Add support for KMS Key ID (bsteiss)
- Remove leading
/from paths (Nick Craig-Wood)
๐ Swift
- Add
storage_policy(Ruben Vandamme) - Make it so just
storage_urlorauth_tokencan be overridden (Nick Craig-Wood) - Fix server-side copy bug for unusual file names (Nick Craig-Wood)
- Remove leading
/from paths (Nick Craig-Wood)
๐ WebDAV
- Ensure we call
MKCOLwith a URL with a trailing/for QNAP interop (Nick Craig-Wood) - If root ends with
/then don't check if it is a file (Nick Craig-Wood) - Don't accept redirects when reading metadata (Nick Craig-Wood)
- Add bearer token (Macaroon) support for dCache (Nick Craig-Wood)
- Document dCache and Macaroons (Onno Zweers)
- Sharepoint recursion with different depth (Henning)
- Attempt to remove failed uploads (Nick Craig-Wood)
โญ Yandex
- Fix listing/deleting files in the root (Nick Craig-Wood)
๐ v1.42 โ 2018-06-16
โจ New backends
- OpenDrive (Oliver Heyme, Jakub Karlicek, ncw)
๐ New commands
deletefilecommand (Filip Bartodziej)
๐ New Features
copy,move: Copy single files directly, don't use--files-fromwork-around- this makes them much more efficient ๐ฅ
- Implement
--max-transferflag to quit transferring at a limit- make exit code 8 for
--max-transferexceeded
- make exit code 8 for
copy: copy empty source directories to destination (Ishuah Kariuki)check: Add--one-wayflag (Kasper Byrdal Nielsen)- Add siginfo handler for macOS for ctrl-T stats (kubatasiemski)
- rc
- add
core/gcto run a garbage collection on demand - enable go profiling by default on the
--rcport - return error from remote on failure
- add
- lsf
- Add
--absoluteflag to add a leading/onto path names - Add
--csvflag for compliant CSV output - Add
'm'format specifier to show the MimeType - Implement
'i'format for showing object ID
- Add
- lsjson
- Add
MimeTypeto the output - Add
IDfield to output to show Object ID
- Add
- Add
--retries-sleepflag (Benjamin Joseph Dag) - Oauth tidy up web page and error handling (Henning Surmeier)
๐ Bug Fixes
- Password prompt output with
--log-filefixed for unix (Filip Bartodziej) - Calculate
ModifyWindoweach time on the fly to fix various problems (Stefan Breunig)
๐ง Mount
- Only print
"File.rename error"if there actually is an error (Stefan Breunig) - Delay rename if file has open writers instead of failing outright (Stefan Breunig)
- Ensure atexit gets run on interrupt
- macOS enhancements
- Make
--noappledouble--noapplexattr - Add
--volnameflag and remove special chars from it - Make Get/List/Set/Remove xattr return
ENOSYSfor efficiency - Make
--daemonwork for macOS without CGO
- Make
๐ช VFS
- Add
--vfs-read-chunk-sizeand--vfs-read-chunk-size-limit(Fabian Mรถller) - Fix
ChangeNotifyfor new or changed folders (Fabian Mรถller)
๐ Local
- Fix symlink/junction point directory handling under Windows
- NB you will need to add
-Lto your command line to copy files with reparse points
- NB you will need to add
๐ Cache
- Add non cached dirs on notifications (Remus Bunduc)
- Allow root to be expired from rc (Remus Bunduc)
- Clean remaining empty folders from temp upload path (Remus Bunduc)
- Cache lists using batch writes (Remus Bunduc)
- Use secure websockets for HTTPS Plex addresses (John Clayton)
- Reconnect plex websocket on failures (Remus Bunduc)
- Fix panic when running without plex configs (Remus Bunduc)
- Fix root folder caching (Remus Bunduc)
๐ Crypt
- Check the encrypted hash of files when uploading for extra data security
๐ฅ Dropbox
- Make Dropbox for business folders accessible using an initial
/in the path
๐ฉ๏ธ Google Cloud Storage
- Low level retry all operations if necessary
๐ Google Drive
- Add
--drive-acknowledge-abuseto download flagged files - Add
--drive-alternate-exportto fix large doc export - Don't attempt to choose Team Drives when using
rclone config create - Fix change list polling with team drives
- Fix
ChangeNotifyfor folders (Fabian Mรถller) - Fix about (and df on a mount) for team drives
๐ Onedrive
- Errorhandler for onedrive for business requests (Henning Surmeier)
๐ชฃ S3
- Adjust upload concurrency with
--s3-upload-concurrency(themylogin) - Fix
--s3-chunk-sizewhich was always using the minimum
๐ SFTP
- Add
--ssh-path-overrideflag (Piotr Oleszczyk) - Fix slow downloads for long latency connections
๐ Webdav
- Add workarounds for biz.mail.ru
- Ignore
Reason-Phrasein status line to fix 4shared (Rodrigo) - Better error message generation
๐ v1.41 โ 2018-04-28
โจ New backends
- Mega support added
- Webdav now supports SharePoint cookie authentication (hensur)
๐ New commands
link: create public link to files and folders (Stefan Breunig)about: gets quota info from a remote (a-roussos, ncw)hashsum: a generic tool for any hash to produce md5sum like output
๐ New Features
lsd: Add-Rflag and fix and update docs for all ls commandsncdu: added a "refresh" key โ CTRL+L (Keith Goldfarb)serve restic: Add append-only mode (Steve Kriss)serve restic: Disallow overwriting files in append-only mode (Alexander Neumann)serve restic: Print actual listener address (Matt Holt)size: Add--jsonflag (Matthew Holt)sync: implement--ignore-errors(Mateusz Pabian)dedupe: Add dedupe largest functionality (Richard Yang)fs: Extend SizeSuffix to include TB and PB forrclone aboutfs: add--dump goroutinesand--dump openfilesfor debuggingrc: implementcore/memstatsto print internal memory usage inforc: new callrc/pid(Michael P. Dubner)
๐ ๏ธ Compile
- Drop support for go1.6
๐ Release
- Fix
make tarball(Chih-Hsuan Yen)
๐ Bug Fixes
filter: fix--min-ageand--max-agetogether checkfs: limitMaxIdleConnsandMaxIdleConnsPerHostin transportlsd,lsf: make sure all times we output are in local timerc: fix setting bwlimit to unlimitedrc: take note of the--rc-addrflag too as per the docs
๐ง Mount
- Use About to return the correct disk total/used/free (e.g. in
df) - Set
--attr-timeoutdefault to 1s โ fixes:- rclone using too much memory
- rclone not serving files to samba
- excessive time listing directories
- Fix
df -i(upstream fix)
๐ช VFS
- Filter files
.and..from directory listing - Only make the VFS cache if
--vfs-cache-mode > Off
๐ Local
- Add
--local-no-check-updatedto disable updated file checks - Retry remove on Windows sharing violation error
๐ Cache
- Flush the memory cache after close
- Purge file data on notification
- Always forget parent dir for notifications
- Integrate with Plex websocket
- Add
rc cache/stats(seuffert) - Add info log on notification
๐ฆ Box
- Fix failure reading large directories โ parse file/directory size as
float
๐ฅ Dropbox
- Fix crypt+obfuscate on dropbox
- Fix repeatedly uploading the same files
๐ FTP
- Work around strange response from box FTP server
- More workarounds for FTP servers to fix mkParentDir error
- Fix no error on listing nonexistent directory
๐ฉ๏ธ Google Cloud Storage
- Add
service_account_credentials(Matt Holt) - Detect bucket presence by listing it โ minimises permissions needed
- Ignore zero length directory markers
(okay so this first one is just finishing up the list of the backend that came right before this โ carry on bestie ๐ )
- Google Drive ๐
- Add
service_account_credentials(Matt Holt) - Fix directory move leaving a hardlinked directory behind
- Return proper google errors when Opening files
- When initialized with a filepath, optional features used incorrect root path (Stefan Breunig)
- Add
- HTTP
- Fix sync for servers which don't return
Content-LengthinHEAD
- Fix sync for servers which don't return
- Onedrive
- Add
QuickXorHashsupport for OneDrive for business - Fix socket leak in multipart session upload
- Add
- S3
- Look in S3 named profile files for credentials
- Add
--s3-disable-checksumto disable checksum uploading (Chris Redekop) - Hierarchical configuration support (Giri Badanahatti)
- Add in config for all the supported S3 providers
- Add One Zone Infrequent Access storage class (Craig Rachel)
- Add
--use-server-modtimesupport (Peter Baumgartner) - Add
--s3-chunk-sizeoption to control multipart uploads - Ignore zero length directory markers
- SFTP
- Update docs to match code, fix typos and clarify
disable_hashcheckprompt (Michael G. Noll) - Update docs with Synology quirks
- Fail soft with a debug on hash failure
- Update docs to match code, fix typos and clarify
- Swift
- Add
--use-server-modtimesupport (Peter Baumgartner)
- Add
- Webdav
- Support SharePoint cookie authentication (hensur)
- Strip leading and trailing
/off root
v1.40 - 2018-03-19 ๐
- New backends ๐ฑ
- Alias backend to create aliases for existing remote names (Fabian Mรถller)
- New commands โจ
lsf: list for parsing purposes (Jakub Tasiemski)- by default this is a simple non recursive list of files and directories
- it can be configured to add more info in an easy to parse way
serve restic: for serving a remote as a Restic REST endpoint- This enables restic to use any backends that rclone can access
- Thanks Alexander Neumann for help, patches and review
rc: enable the remote control of a running rclone- The running rclone must be started with
--rcand related flags. - Currently there is support for bwlimit, and flushing for mount and cache.
- The running rclone must be started with
- New Features ๐
--max-deleteflag to add a delete threshold (Bjรธrn Erik Pedersen)- All backends now support
RangeOptionfor ranged Opencat: UseRangeOptionfor limited fetches to make more efficientcryptcheck: make reading of nonce more efficient withRangeOption
serve http/webdav/restic- support SSL/TLS
- add
--user--passand--htpasswdfor authentication
copy/move: detect file size change during copy/move and abort transfer (ishuah)cryptdecode: added option to return encrypted file names. (ishuah)lsjson: add--encryptedto show encrypted name (Jakub Tasiemski)- Add
--stats-file-name-lengthto specify the printed file name length for stats (Will Gunn)
- Compile ๐ ๏ธ
- Code base was shuffled and factored
- backends moved into a backend directory
- large packages split up
- See the
CONTRIBUTING.mddoc for info as to what lives where now
- Update to using
go1.10as the default go version - Implement daily full integration tests (https://pub.rclone.org/integration-tests/)
- Code base was shuffled and factored
- Release ๐ฆ
- Include a source tarball and sign it and the binaries
- Sign the git tags as part of the release process
- Add
.deband.rpmpackages as part of the build - Make a beta release for all branches on the main repo (but not pull requests)
- Bug Fixes ๐
config: fixes errors on nonexistent config by loading config file only on first accessconfig: retry saving the config after failure (Mateusz)sync: when using--backup-dirdon't delete files if we can't set their modtime- this fixes odd behaviour with Dropbox and
--backup-dir
- this fixes odd behaviour with Dropbox and
fshttp: fix idle timeouts for HTTP connectionsserve http: fix serving files with:in - fixes- Fix
--exclude-if-presentto ignore directories which it doesn't have permission for (Iakov Davydov) - Make accounting work properly with crypt and b2
- remove
--no-traverseflag because it is obsolete
- Mount ๐ป
- Add
--attr-timeoutflag to control attribute caching in kernel- this now defaults to
0which is correct but less efficient - see the mount docs (https://rclone.org/commands/rclone_mount/#attribute-caching) for more info
- this now defaults to
- Add
--daemonflag to allow mount to run in the background (ishuah) - Fix: Return
ENOSYSrather thanEIOon attempted link- This fixes FileZilla accessing an rclone mount served over sftp.
- Fix setting modtime twice
- Mount tests now run on CI for Linux (mount & cmount)/Mac/Windows
- Many bugs fixed in the VFS layer - see below
- Add
- VFS ๐ฆ
- Many fixes for
--vfs-cache-mode writesand above- Update cached copy if we know it has changed (fixes stale data)
- Clean path names before using them in the cache
- Disable cache cleaner if
--vfs-cache-poll-interval=0 - Fill and clean the cache immediately on startup
- Fix Windows opening every file when it stats the file
- Fix applying modtime for an open Write Handle
- Fix creation of files when truncating
- Write
0bytes when flushing unwritten handles to avoid race conditions in FUSE - Downgrade "poll-interval is not supported" message to Info
- Make
OpenFileand friends returnEINVALifO_RDONLYandO_TRUNC
- Many fixes for
- Local ๐
- Downgrade "invalid cross-device link: trying copy" to debug
- Make
DirMovereturnfs.ErrorCantDirMoveto allow fallback to Copy for cross device - Fix race conditions updating the hashes
- Cache ๐ง
- Add support for polling - cache will update when remote changes on supported backends
- Reduce log level for Plex api
- Fix dir cache issue
- Implement
--cache-db-wait-timeflag - Improve efficiency with
RangeOptionandRangeSeek - Fix dirmove with temp fs enabled
- Notify vfs when using temp fs
- Offline uploading
- Remote control support for path flushing
- Amazon cloud drive
- Rclone no longer has any working keys - disable integration tests
- Implement
DirChangeNotifyto notify cache/vfs/mount of changes
- Azureblob
- Don't check for bucket/container presence if listing was OK
- this makes rclone do one less request per invocation
- Improve accounting for chunked uploads
- Don't check for bucket/container presence if listing was OK
- Backblaze B2
- Don't check for bucket/container presence if listing was OK
- this makes rclone do one less request per invocation
- Don't check for bucket/container presence if listing was OK
- Box
- Improve accounting for chunked uploads
- Dropbox
- Fix custom oauth client parameters
- Google Cloud Storage
- Don't check for bucket/container presence if listing was OK
- this makes rclone do one less request per invocation
- Don't check for bucket/container presence if listing was OK
- Google Drive ๐
- Migrate to api v3 (Fabian Mรถller)
- Add scope configuration and root folder selection
- Add
--drive-impersonatefor service accounts- thanks to everyone who tested, explored and contributed docs
- Add
--drive-use-created-dateto use created date as modified date (nbuchanan) - Request the export formats only when required
- This makes rclone quicker when there are no google docs
- Fix finding paths with latin1 chars (a workaround for a drive bug)
- Fix copying of a single Google doc file
- Fix
--drive-auth-owner-onlyto look in all directories
- HTTP
- Fix handling of directories with
&in
- Fix handling of directories with
- Onedrive
- Removed upload cutoff and always do session uploads
- this stops the creation of multiple versions on business onedrive
- Overwrite object size value with real size when reading file. (Victor)
- this fixes oddities when onedrive misreports the size of images
- Removed upload cutoff and always do session uploads
- Pcloud
- Remove unused chunked upload flag and code
- Qingstor
- Don't check for bucket/container presence if listing was OK
- this makes rclone do one less request per invocation
- Don't check for bucket/container presence if listing was OK
- S3
- Support hashes for multipart files (Chris Redekop)
- Initial support for IBM COS (S3) (Giri Badanahatti)
- Update docs to discourage use of v2 auth with CEPH and others
- Don't check for bucket/container presence if listing was OK
- this makes rclone do one less request per invocation
- Fix server-side copy and set modtime on files with
+in
- SFTP
- Add option to disable remote hash check command execution (Jon Fautley)
- Add
--sftp-ask-passwordflag to prompt for password when needed (Leo R. Lundgren) - Add
set_modtimeconfiguration option - Fix following of symlinks
- Fix reading config file outside of Fs setup
- Fix reading
$USERin username fallback not$HOME - Fix running under crontab - Use correct OS way of reading username
- Swift
- Fix refresh of authentication token
- in v1.39 a bug was introduced which ignored new tokens - this fixes it
- Fix extra HEAD transaction when uploading a new file
- Don't check for bucket/container presence if listing was OK
- this makes rclone do one less request per invocation
- Fix refresh of authentication token
- Webdav
- Add new time formats to support mydrive.ch and others
v1.39 - 2017-12-23 ๐
- New backends ๐ฑ
- WebDAV
- tested with nextcloud, owncloud, put.io and others!
- Pcloud
- cache - wraps a cache around other backends (Remus Bunduc)
- useful in combination with mount
- NB this feature is in beta so use with care
- WebDAV
- New commands โจ
servecommand with subcommands:serve webdav: this implements a webdav server for any rclone remote.serve http: command to serve a remote over HTTP
config: add sub commands for full config file managementcreate/delete/dump/edit/file/password/providers/show/update
touch: to create or update the timestamp of a file (Jakub Tasiemski)
- New Features ๐
- curl install for rclone (Filip Bartodziej)
--statsnow shows percentage, size, rate and ETA in condensed form (Ishuah Kariuki)--exclude-if-presentto exclude a directory if a file is present (Iakov Davydov)rmdirs: add--leave-rootflag (lewapm)
- If the remote file is the same, rclone will update the modtime without re-uploading ๐
- If the remote file is different, rclone will upload the file again
- Add
--drive-use-trashโ nah wait, that's Drive. For Dropbox: "Fix entry doesn't belong in directory" โ hmm, that was v1.38. Let me stay faithful: the Dropbox v2 bullet list continues.
Actually re-reading: the original cuts off at:
โข Dropbox
โข Rewritten to use the v2 API
โข Now supports ModTime
โข Can only set by uploading the file again
โข If you uploaded with an old rclone, rclone may upload everything again
So v1.37's Dropbox section is incomplete, and there is more after. Since I only have up to that point, I should continue seamlessly โ but I don't have the rest of the original. The instruction says the page comes in 319 parts and this is part 309, and "More parts follow, so don't sign off at the end." So I should just render what's in the original faithfully.
Let me write the full part 309 rewrite covering from the start of the given text to the end.
The given text starts mid-bullet under v1.40 (probably) โ "move: add --delete-empty-src-dirs flag" โ actually these are changelog entries. The part starts in the middle of a section that's already had a heading printed in part 308. So I just carry on.
Let me structure: it's a changelog, so the items are nested bullets. I'll render with headings for version markers where they appear: v1.38 - 2017-09-30 and v1.37 - 2017-07-22.
The initial chunk (before v1.38) is a continuation of some version's bullet list โ with "Compile", "Bug Fixes", "Mount", "Local", "Dropbox", "Swift", "Google Drive", "S3", "Backblaze B2", "Swift", "SFTP", "Amazon cloud drive", "crypt", "onedrive". These are subsections of the changelog entries. I'll render them as "## " subheadings? Hmm, but they were probably already rendered as nested bullets in prior parts. To be safe and follow the format instructions, I'll use bullet lists with nesting.
Actually the original uses "โข Move" style bullets with indentation. I'll keep them as nested bullets to preserve structure, since we're mid-section. But headings might be nicer. Since the part starts mid-section, and previous parts presumably rendered similarly, I'll just use bullets consistently.
Hmm, but I don't know how prior parts rendered. The safest bet that respects "Keep the same sections in the same order" โ these are sub-bullets though. I'll use nested bullets.
Let me write it.
I need to preserve all details:
- move: add --delete-empty-src-dirs flag to remove dirs after move (Ishuah Kariuki)
- Add --dump flag, introduce --dump requests, responses and remove --dump-auth, --dump-filters
- Obscure X-Auth-Token: from headers when dumping too
- Document and implement exit codes for different failure modes (Ishuah Kariuki)
- Compile
- Bug Fixes
- Retry lots more different types of errors to make multipart transfers more reliable
- Save the config before asking for a token, fixes disappearing oauth config
- Warn the user if --include and --exclude are used together (Ernest Borowski)
- Fix duplicate files (e.g. on Google drive) causing spurious copies
- Allow trailing and leading whitespace for passwords (Jason Rose)
- ncdu: fix crashes on empty directories
- rcat: fix goroutine leak
- moveto/copyto: Fix to allow copying to the same name
- Mount
- --vfs-cache mode to make writes into mounts more reliable.
- this requires caching files on the disk (see --cache-dir)
- As this is a new feature, use with care
- Use sdnotify to signal systemd the mount is ready (Fabian Mรถller)
- Check if directory is not empty before mounting (Ernest Borowski)
- --vfs-cache mode to make writes into mounts more reliable.
- Local
- Add error message for cross file system moves
- Fix equality check for times
- Dropbox
- Rework multipart upload
- buffer the chunks when uploading large files so they can be retried
- change default chunk size to 48MB now we are buffering them in memory
- retry every error after the first chunk is done successfully
- Fix error when renaming directories
- Rework multipart upload
- Swift
- Fix crash on bad authentication
- Google Drive
- Add service account support (Tim Cooijmans)
- S3
- Make it work properly with Digital Ocean Spaces (Andrew Starr-Bochicchio)
- Fix crash if a bad listing is received
- Add support for ECS task IAM roles (David Minor)
- Backblaze B2
- Fix multipart upload retries
- Fix --hard-delete to make it work 100% of the time
- Swift
- Allow authentication with storage URL and auth key (Giovanni Pizzi)
- Add new fields for swift configuration to support IBM Bluemix Swift (Pierre Carlson)
- Add OS_TENANT_ID and OS_USER_ID to config
- Allow configs with user id instead of user name
- Check if swift segments container exists before creating (John Leach)
- Fix memory leak in swift transfers (upstream fix)
- SFTP
- Add option to enable the use of aes128-cbc cipher (Jon Fautley)
- Amazon cloud drive
- Fix download of large files failing with "Only one auth mechanism allowed"
- crypt
- Option to encrypt directory names or leave them intact
- Implement DirChangeNotify (Fabian Mรถller)
- onedrive
- Add option to choose resourceURL during setup of OneDrive Business account if more than one is available for user
Then v1.38 - 2017-09-30 with all its bullets.
Then v1.37 - 2017-07-22 with all its bullets, ending mid-Dropbox.
Let me write it all with personality but full fidelity.
Note: I should use <pink> etc. tags for flair, headings use "# / ## / ###".
Since we're continuing mid-section, I'll not repeat a heading. I'll just start with the bullets.
Hmm, but bullet nesting depth here is like 9 levels for v1.38. The instruction: "indent two spaces per nesting level". OK.
Let me just do it.
Actually for readability and since these are effectively subsections, I might use headings. The original manpage itself uses these as bullets under the version number. Prior parts presumably rendered version headings. Within v1.38, "New backends", "New commands", "New Features", "Compile", "Bug Fixes", "Local", "Mount", "Dropbox", "Swift", "Google Drive", "S3", "Backblaze B2", "Swift", "SFTP", "Amazon cloud drive", "crypt", "onedrive" โ these would be sub-sub headings. The instruction says "## Heading" for subsections, "### Heading" below that. So maybe use ### under the v1.38 # heading. But version headings โ the changelog section is a main section "Changelog" (# heading, presumably given as covered). Then version numbers would be "## v1.38 - 2017-09-30", and the categories "### Bug Fixes" etc.
Hmm, but the preceding text before v1.38 is also a version block whose heading was in part 308. So its categories would be "### " too. That works โ I'll start directly with "### Compile"? No wait, the preceding bullets "move: add --delete-empty-src-dirs..." come before "Compile". So I should just continue the bullet list under whatever heading, then use "### Compile" for the Compile item.
Hmm, mixture. Actually cleanest: since we're mid-listing, continue bullets, and then when "Compile" / "Bug Fixes" appear, make them ### headings matching the sibling structure. That's consistent with "if this part starts in the middle of a section, just carry on without repeating its heading."
Yes. Let me do that. So:
- move: add
--delete-empty-src-dirsflag to remove dirs after move (Ishuah Kariuki) - Add
--dumpflag, introduce--dump requests,responsesand remove--dump-auth,--dump-filters- Obscure
X-Auth-Token:from headers when dumping too
- Obscure
- Document and implement exit codes for different failure modes (Ishuah Kariuki)
Compile
Bug Fixes
...
Hmm but for the version block that was already opened in part 308, its "Compile" is a sibling of the version's other headings. Using ### matches v1.38's structure categories. Good.
Let me write.
For the flourishing, careful: "Obscure X-Auth-Token: from headers when dumping too" โ keep exact.
Let me now produce.
I'll be generous with emoji and color tags but keep sentences readable.
Write now.- move: add --delete-empty-src-dirs flag to remove dirs after move (Ishuah Kariuki) ๐งน
- Add
--dumpflag, introduce--dump requests,responsesand remove--dump-auth,--dump-filters- Obscure
X-Auth-Token:from headers when dumping too ๐
- Obscure
- Document and implement exit codes for different failure modes (Ishuah Kariuki)
Compile ๐
Bug Fixes ๐
- Retry lots more different types of errors so multipart transfers are way more reliable ๐
- Save the config before asking for a token โ fixes that disappearing oauth config situation ๐ญ
- Warn the user if
--includeand--excludeare used together (Ernest Borowski) โ ๏ธ - Fix duplicate files (e.g. on Google Drive) causing spurious copies ๐ซ
- Allow trailing and leading whitespace for passwords (Jason Rose)
ncdu: fix crashes on empty directories ๐rcat: fix goroutine leakmoveto/copyto: fix to allow copying to the same name ๐
Mount ๐ฑ
--vfs-cachemode to make writes into mounts more reliable.- this requires caching files on the disk (see
--cache-dir) ๐พ - As this is a new feature, use with care
- this requires caching files on the disk (see
bestie this one is baby-fresh, so be a lil careful with it, ok? ๐ซถ
- Use
sdnotifyto signal systemd the mount is ready (Fabian Mรถller) - Check if directory is not empty before mounting (Ernest Borowski)
Local ๐
- Add error message for cross file system moves
- Fix equality check for times
Dropbox ๐ฆ
- Rework multipart upload
- buffer the chunks when uploading large files so they can be retried ๐
- change default chunk size to
48MBnow we are buffering them in memory - retry every error after the first chunk is done successfully
- Fix error when renaming directories
Swift โก
- Fix crash on bad authentication
Google Drive ๐
- Add service account support (Tim Cooijmans)
S3 โ๏ธ
- Make it work properly with Digital Ocean Spaces (Andrew Starr-Bochicchio)
- Fix crash if a bad listing is received
- Add support for ECS task IAM roles (David Minor)
Backblaze B2 ๐พ
- Fix multipart upload retries
- Fix
--hard-deleteto make it work 100% of the time
Swift โก
- Allow authentication with storage URL and auth key (Giovanni Pizzi)
- Add new fields for swift configuration to support IBM Bluemix Swift (Pierre Carlson)
- Add
OS_TENANT_IDandOS_USER_IDto config - Allow configs with user id instead of user name
- Check if swift segments container exists before creating (John Leach)
- Fix memory leak in swift transfers (upstream fix)
SFTP ๐
- Add option to enable the use of
aes128-cbccipher (Jon Fautley)
Amazon cloud drive ๐
- Fix download of large files failing with
"Only one auth mechanism allowed"
crypt ๐ฎ
- Option to encrypt directory names or leave them intact
- Implement
DirChangeNotify(Fabian Mรถller)
onedrive ๐ช
- Add option to choose
resourceURLduring setup of OneDrive Business account if more than one is available for user
v1.38 - 2017-09-30 ๐
New backends โจ
- Azure Blob Storage (thanks Andrei Dragomir)
- Box
- Onedrive for Business (thanks Oliver Heyme)
- QingStor from QingCloud (thanks wuyu)
New commands ๐ ๏ธ
rcatโ read from standard input and stream uploadtreeโ shows a nicely formatted recursive listingcryptdecodeโ decode encrypted file names (thanks ishuah)config showโ print the config fileconfig fileโ print the config file location
New Features ๐
- Empty directories are deleted on sync
dedupeโ implement merging of duplicate directoriescheckandcryptcheckmade more consistent and use less memorycleanupfor remaining remotes (thanks ishuah)--immutablefor ensuring that files don't change (thanks Jacob McNamee)--user-agentoption (thanks Alex McGrath Kraak)--disableflag to disable optional features--bindflag for choosing the local addr on outgoing connections- Support for zsh auto-completion (thanks bpicode) โจ
- Stop normalizing file names but do a normalized compare in
sync
Compile ๐
- Update to using
go1.9as the default go version - Remove snapd build due to maintenance problems
Bug Fixes ๐
- Improve retriable error detection which makes multipart uploads better
- Make
checkobey--ignore-size - Fix
bwlimittoggle in conjunction with schedules (thanks cbruegg) configensures newly written config is on the same mount
Local ๐
- Revert to copy when moving file across file system boundaries
--skip-linksto suppress symlink warnings (thanks Zhiming Wang)
Mount ๐ฑ
- Reuse
rcatinternals to support uploads from all remotes
Dropbox ๐ฆ
- Fix
"entry doesn't belong in directory"error - Stop using deprecated API methods
Swift โก
- Fix server-side copy to empty container with
--fast-list
Google Drive ๐
- Change the default for
--drive-use-trashtotrue
S3 โ๏ธ
- Set session token when using STS (thanks Girish Ramakrishnan)
- Glacier docs and error messages (thanks Jan Varho)
- Read
1000(not1024) items in dir listings to fix Wasabi
Backblaze B2 ๐พ
- Fix SHA1 mismatch when downloading files with no SHA1
- Calculate missing hashes on the fly instead of spooling
--b2-hard-deleteto permanently delete (not hide) files (thanks John Papandriopoulos)
Hubic ๐
- Fix creating containers โ no longer have to use the default container
Swift โก
- Optionally configure from a standard set of OpenStack environment vars
- Add
endpoint_typeconfig
Google Cloud Storage ๐ฉ๏ธ
- Fix bucket creation to work with limited permission users
SFTP ๐
- Implement connection pooling for multiple ssh connections
- Limit new connections per second
- Add support for MD5 and SHA1 hashes where available (thanks Christian Brรผggemann)
HTTP ๐
- Fix URL encoding issues
- Fix directories with
:in - Fix panic with URL encoded content
v1.37 - 2017-07-22 ๐ฆ
New backends โจ
- FTP โ thanks to Antonio Messina
- HTTP โ thanks to Vasiliy Tolstov
New commands ๐ ๏ธ
rclone ncduโ for exploring a remote with a text based user interface.rclone lsjsonโ for listing with a machine-readable outputrclone dbhashsumโ to show Dropbox style hashes of files (local or Dropbox)
New Features ๐
- Implement
--fast-listflag- This allows remotes to list recursively if they can
- This uses less transactions (important if you pay for them) ๐ธ
- This may or may not be quicker
- This will use more memory as it has to hold the listing in memory
--old-sync-methoddeprecated โ the remaining uses are covered by--fast-list- This involved a major re-write of all the listing code
- Add
--tpslimitand--tpslimit-burstto limit transactions per second- this is useful in conjunction with
rclone mountto limit external apps
- this is useful in conjunction with
- Add
--stats-log-levelso can see--statswithout-v - Print password prompts to stderr โ Hraban Luyat
- Warn about duplicate files when syncing
- Oauth improvements
- allow
auth_urlandtoken_urlto be set in the config file - Print redirection URI if using own credentials.
- allow
- Don't Mkdir at the start of sync to save transactions
Compile ๐
- Update build to
go1.8.3 - Require
go1.6for building rclone - Compile
386builds with"GO386=387"for maximum compatibility
Bug Fixes ๐
- Fix menu selection when no remotes
- Config saving reworked to not kill the file if disk gets full
- Don't delete remote if name does not change while renaming
moveto,copyto: report transfers and checks as permoveandcopy
Local ๐
- Add
--local-no-unicode-normalizationflag โ Bob Potter
Mount ๐ฑ
- Now supported on Windows using cgofuse and WinFsp โ thanks to Bill Zissimopoulos for much help ๐ช
- Compare checksums on upload/download via FUSE
- Unmount when program ends with
SIGINT(Ctrl+C) orSIGTERMโ Jรฉrรดme Vizcaino - On read only open of file, make open pending until first read
- Make
--read-onlyreject modify operations - Implement
ModTimevia FUSE for remotes that support it - Allow
modTimeto be changed even before all writers are closed - Fix panic on renames
- Fix hang on errored upload
Crypt ๐ฎ
- Report the
name:rootas specified by the user - Add an
"obfuscate"option for filename encryption โ Stephen Harris
Amazon Drive ๐
- Fix initialization order for token renewer
- Remove revoked credentials, allow oauth proxy config and update docs
B2 ๐พ
- Reduce minimum chunk size to
5MB
Drive ๐
- Add team drive support
- Reduce bandwidth by adding fields for partial responses โ Martin Kristensen
- Implement
--drive-shared-with-meflag to view shared with me files โ Danny Tsai - Add
--drive-trashed-onlyto read only the files in the trash - Remove obsolete
--drive-full-list - Add missing seek to start on retries of chunked uploads
- Fix stats accounting for upload
- Convert
/in names to a unicode equivalent (๏ผ) - Poll for Google Drive changes when mounted
OneDrive ๐ช
- Fix the uploading of files with spaces
- Fix initialization order for token renewer
- Display speeds accurately when uploading โ Yoni Jah
- Swap to using
http://localhost:53682/as redirect URL โ Michael Ledin - Retry on token expired error, reset upload body on retry โ Yoni Jah
Google Cloud Storage ๐ฉ๏ธ
- Add ability to specify location and storage class via config and command line โ thanks gdm85
- Create container if necessary on server-side copy
- Increase directory listing chunk to
1000to increase performance - Obtain a refresh token for GCS โ Steven Lu
Yandex ๐ฑ
- Fix the name reported in log messages (was empty)
- Correct error return for listing empty directory
Dropbox ๐ฆ
- Rewritten to use the v2 API
- Now supports
ModTime- Can only set by uploading the file again
- If you uploaded with an old rclone, rclone may upload everything again
- Now supports
- use
--size-onlyor--checksumto dodge this whole situation ๐ - and now it speaks the Dropbox content hashing scheme ๐
- and now it does low level retries ๐
S3
- works around eventual consistency when you're creating a bucket โจ
- creates the container if it needs to, on server-side copy
- adds the
us-east-2(Ohio) andeu-west-2(London) S3 regions ๐ โ big ups to Zahiar Ahmed
Swift, Hubic
- fixes zero length directory markers showing up in the subdirectory listing
- and this is literally what caused, like, SO many duplicate transfers ๐ญ
- fixes paged directory listings
- which is what caused all those duplicate directory errors ๐
- creates the container if necessary on server-side copy
- bumps the directory listing chunk to
1000to make it faster ๐๏ธ - gives you a sensible error if you forget the container
SFTP
- adds support for using
sshkey files ๐ - fixes it under Windows
- fixes
sshagent on Windows - adapts to the latest version of the library โ Igor Kharin
โจ v1.36 - 2017-03-18 โจ
๐ New Features ๐
- SFTP remote โ Jack Schmidt
- re-implements the sync routine to work a directory at a time, so it uses way less memory ๐ง
- logging got revamped to be more in line with
rsyncโ it's much quieter now-vonly shows transfers-vvis for full debug--syslogto log to syslog on platforms that can do that
- implements
--backup-dirand--suffix - implements
--track-renames(initial implementation by Bjรธrn Erik Pedersen) - adds time-based bandwidth limits โ Lukas Loesche
rclone cryptcheck: checks integrity of crypt remotes ๐- lets all config file variables and options be set from environment variables ๐
- adds the
--buffer-sizeparameter to control buffer size for copy - makes
--delete-afterthe default - adds the
--ignore-checksumflag (fixed by Hisham Zarka) rclone check: adds the--downloadflag so it checks all the data, not just hashesrclone cat: adds--head,--tail,--offset,--countand--discardrclone config: when you're choosing from a list, it lets you enter the value toorclone config: lets you rename and copy remotesrclone obscure: for generating encrypted passwords for rclone's config โ T.C. Ferguson- complies with the XDG Base Directory specification โ Dario Giovannetti
- this moves the default location of the config file in a backwards compatible way
- release changes
- Ubuntu snap support โ Dedsec1
- compiles with
go 1.8 - MIPS/Linux big and little endian support
๐ Bug Fixes ๐
- fixes
copytocopying things to the wrong place if the destination dir didn't exist ๐ฌ - fixes parsing of remotes in
movetoandcopyto - fixes
--delete-beforedeleting files on copy - fixes
--files-fromwith an empty file copying everything - fixes sync: doesn't update mod times if
--dry-runis set - fixes
MimeTypepropagation - fixes filters to add
**rules to directory rules
Local
- implements the
-L,--copy-linksflag so rclone can follow symlinks - opens files in write only mode so rclone can write to an rclone mount
- fixes unnormalised unicode causing problems reading directories
- fixes the interaction between the
-xflag and--max-depth
Mount
- implements proper directory handling (
mkdir,rmdir, renaming) - makes include and exclude filters apply to mount
- implements read and write async buffers โ control them with
--buffer-size - fixes
fsyncon for directories - fixes retry on network failure when reading off crypt
Crypt
- adds
--crypt-show-mappingto show the encrypted file mapping - fixes the crypt writer getting stuck in a loop
IMPORTANT this bug had the potential to cause data corruption when - reading data from a network based remote and - writing to a crypt on Google Drive use the cryptcheck command to validate your data if you are concerned ๐ซถ if syncing two crypt remotes, sync the unencrypted remote
Amazon Drive
- fixes panics on
Move(rename) - fixes panic on token expiry
B2
- fixes inconsistent listings and
rclone check - fixes uploading empty files with
go1.8 - constrains memory usage when doing multipart uploads
- fixes the upload url not being refreshed properly
Drive
- fixes
Rmdiron directories with trashed files - fixes "Ignoring unknown object" when downloading
- adds
--drive-list-chunk - adds
--drive-skip-gdocsโ Kรกroly Olรกh
OneDrive
- implements
Move - fixes
Copy- fixes overwrite detection in
Copy - fixes
waitForJobto parse errors correctly
- fixes overwrite detection in
- uses the token renewer to stop auth errors on long uploads
- fixes uploading empty files with
go1.8
Google Cloud Storage
- fixes depth
1directory listings
Yandex
- fixes single level directory listing
Dropbox
- normalises the case for single level directory listings
- fixes depth
1listing
S3
- added the
ca-central-1region โ Jon Yergatian
โจ v1.35 - 2017-01-02 โจ
๐ New Features ๐
movetoandcopytocommands, for choosing a destination name on copy/move ๐ฏrmdirscommand, to recursively delete empty directories- lets you repeat
--include/--exclude/--filteroptions - only shows transfer stats on commands which actually transfer stuff
- show stats on any command using the
--statsflag
- show stats on any command using the
- allows overlapping directories in
movewhen server-side dir move is supported - adds the
--stats-unitoption โ thanks Scott McGillivray
๐ Bug Fixes ๐
- fixes the config file being overwritten when two rclone instances are running
- makes
rclone lsdobey the filters properly - fixes compilation on mips
- fixes not transferring files that don't differ in size
- fixes panic on nil retry/fatal error
Mount
- retries reads on error โ should help with reliability a LOT ๐
- reports the modification times for directories from the remote
- adds bandwidth accounting and limiting (fixes
--bwlimit) - if
--statsis provided it'll show stats and which files are transferring - supports R/W files if truncate is set.
- implements the
statfsinterface sodfworks - note that write is now supported on Amazon Drive
- reports the number of blocks in a file โ thanks Stefan Breunig
Crypt
- prevents the user from pointing crypt at itself ๐
- fixes
failed to authenticate decrypted blockerrors- these will now return the underlying
unexpected EOFinstead
- these will now return the underlying
Amazon Drive
- adds support for server-side move and directory move โ thanks Stefan Breunig
- fixes nil pointer deref on the size attribute
B2
- uses the new prefix and delimiter parameters in directory listings
- this makes
--max-depth 1dir listings as used in mount way faster
- this makes
- reauths the account while doing uploads too โ should help with token expiry
Drive
- makes
DirMovemore efficient and complains about moving the root - creates the destination directory on
Move()
โจ v1.34 - 2016-11-06 โจ
๐ New Features ๐
- stops single file and
--files-fromoperations from iterating through the source bucket. - stops removing failed uploads to cloud storage remotes
- makes
ContentTypebe preserved for cloud to cloud copies - adds support to toggle bandwidth limits via
SIGUSR2โ thanks Marco Paganini rclone checkshows the count of hashes that couldn't be checkedrclone listremotescommand ๐- supports the
linux/arm64build โ thanks Fredrik Fornwall - removes
Authorization:lines from--dump-headersoutput
๐ Bug Fixes ๐
- ignores files with control characters in the names
- fixes the
rclone movecommand- deletes src files which already existed in dst
- fixes deletion of src file when dst file is older
- fixes
rclone checkon encrypted file systems - makes failed uploads not count as "Transferred"
- makes sure high level retries show with
-q - uses a vendor directory with
godepfor repeatable builds
rclone mount - FUSE
- implements FUSE mount options
--no-modtime,--debug-fuse,--read-only,--allow-non-empty,--allow-root,--allow-other--default-permissions,--write-back-cache,--max-read-ahead,--umask,--uid,--gid
- adds
--dir-cache-timeto control caching of directory entries - implements seek for files opened for read (useful for video players) ๐ฌ
- with the
-no-seekflag to disable
- with the
- fixes crash on 32 bit ARM (alignment of 64 bit counter)
- ...and many more internal fixes and improvements!
Crypt
- doesn't show the encrypted password in the configurator, to stop confusion
Amazon Drive
- new wait for upload option
--acd-upload-wait-per-gb- upload timeouts scale by file size and can be disabled
- adds
502 Bad Gatewayto the list of errors we retry - fixes overwriting a file with a zero length file
- fixes the ACD file size warning limit โ thanks Felix Bรผnemann
Local
- Unix: implements
-x/--one-file-systemto stay on a single file system- thanks Durval Menezes and Luiz Carlos Rumbelsperger Viana
- Windows: ignores the symlink bit on files
- Windows: ignores directory-based junction points
B2
- makes sure each upload has at least one upload slot โ fixes strange upload stats
- fixes uploads when using crypt
- fixes download of large files (sha1 mismatch)
- returns an error when we try to create a bucket which someone else owns
- updates the B2 docs with Data usage, and a Crypt section โ thanks Tomasz Mazur
S3
- command line and config file support for
- setting/overriding ACL โ thanks Radek ล enfeld
- setting storage class โ thanks Asko Tamm
Drive
- makes exponential backoff work exactly as per the Google specification
- adds
.epub,.odpand.tsvas export formats.
Swift
- doesn't read metadata for directory marker objects
โจ v1.33 - 2016-08-24 โจ
๐ New Features ๐
- implements encryption ๐
- data encrypted in NACL secretbox format
- with optional file name encryption
- new commands
rclone mountโ implements FUSE mounting of remotes (EXPERIMENTAL)- works on Linux, FreeBSD and OS X (need testers for the last 2!) ๐
rclone catโ outputs remote file or files to the terminalrclone genautocompleteโ command to make a bash completion script for rclone
- Editing a remote using
rclone confignow goes through the wizard โจ- Compile with
go 1.7โ this fixes rclone on macOS Sierra and on 386 processors ๐ช - Use cobra for sub commands and docs generation
- Compile with
drive- Document how to make your own
client_id
- Document how to make your own
s3- User-configurable Amazon S3 ACL (thanks Radek ล enfeld)
b2- Fix stats accounting for upload โ no more jumping to 100% done ๐ญ
- On cleanup delete hide marker if it is the current file
- New B2 API endpoint (thanks Per Cederberg)
- Set maximum backoff to 5 Minutes
onedrive- Fix URL escaping in file names โ e.g. uploading files with
+in them.
- Fix URL escaping in file names โ e.g. uploading files with
amazon cloud drive- Fix token expiry during large uploads
- Work around
408 REQUEST_TIMEOUTand504 GATEWAY_TIMEOUTerrors
local- Fix filenames with invalid UTF-8 not being uploaded
- Fix problem with some UTF-8 characters on OS X
๐ v1.32 - 2016-07-13 ๐
- Backblaze B2
- Fix upload of files large files not in root
๐ v1.31 - 2016-07-13 ๐
- New Features
- Reduce memory on sync by about 50% ๐ง โจ
- Implement
--no-traverseflag to stop copy traversing the destination remote.- This can be used to reduce memory usage down to the smallest possible.
- Useful to copy a small number of files into a large destination folder.
- Implement cleanup command for emptying trash / removing old versions of files
- Currently B2 only
- Single file handling improved
- Now copied with
--files-from - Automatically sets
--no-traversewhen copying a single file
- Now copied with
- Info on using installing with ansible โ thanks Stefan Weichinger
- Implement
--no-update-modtimeflag to stop rclone fixing the remote modified times.
- Bug Fixes
- Fix move command โ stop it running for overlapping Fses โ this was causing data loss. ๐
- Local
- Fix incomplete hashes โ this was causing problems for B2.
- Amazon Drive
- Rename Amazon Cloud Drive to Amazon Drive โ no changes to config file needed.
- Swift
- Add support for non-default project domain โ thanks Antonio Messina.
- S3
- Add instructions on how to use rclone with minio.
- Add
ap-northeast-2(Seoul) andap-south-1(Mumbai) regions. - Skip setting the modified time for objects >
5GBas it isn't possible.
- Backblaze B2
- Add
--b2-versionsflag so old versions can be listed and retrieved. - Treat
403errors (e.g. cap exceeded) as fatal. - Implement cleanup command for deleting old file versions.
- Make error handling compliant with B2 integrations notes.
- Fix handling of token expiry.
- Implement
--b2-test-modeto setX-Bz-Test-Modeheader. - Set cutoff for chunked upload to
200MBas per B2 guidelines. - Make upload multi-threaded.
- Add
- Dropbox
- Don't retry
461errors.
- Don't retry
๐ v1.30 - 2016-06-18 ๐
- New Features
- Directory listing code reworked for more features and better error reporting (thanks to Klaus Post for help). This enables
- Directory include filtering for efficiency
--max-depthparameter- Better error reporting
- More to come
- Retry more errors
- Add
--ignore-sizeflag โ for uploading images to onedrive - Log
-voutput to stdout by default - Display the transfer stats in more human-readable form
- Make
0size files specifiable with--max-size 0b - Add
bsuffix so we can specify bytes in--bwlimit,--min-size, etc. - Use
"password:"instead of"password>"prompt โ thanks Klaus Post and Leigh Klotz
- Directory listing code reworked for more features and better error reporting (thanks to Klaus Post for help). This enables
- Bug Fixes
- Fix retry doing one too many retries
- Local
- Fix problems with OS X and UTF-8 characters
- Amazon Drive
- Check a file exists before uploading to help with
408 Conflicterrors - Reauth on
401errors โ this has been causing a lot of problems - Work around spurious
403errors - Restart directory listings on error
- Check a file exists before uploading to help with
- Google Drive
- Check a file exists before uploading to help with duplicates
- Fix retry of multipart uploads
- Backblaze B2
- Implement large file uploading
- S3
- Add
AES256server-side encryption for โ thanks Justin R. Wilson
- Add
- Google Cloud Storage
- Make sure we don't use conflicting content types on upload
- Add service account support โ thanks Michal Witkowski
- Swift
- Add auth version parameter
- Add domain option for openstack (v3 auth) โ thanks Fabian Ruff
๐ v1.29 - 2016-04-18 ๐
- New Features
- Implement
-I,--ignore-timesfor unconditional upload - Improve dedupecommand
- Now removes identical copies without asking
- Now obeys
--dry-run - Implement
--dedupe-modefor non interactive running--dedupe-mode interactiveโ interactive the default.--dedupe-mode skipโ removes identical files then skips anything left.--dedupe-mode firstโ removes identical files then keeps the first one.--dedupe-mode newestโ removes identical files then keeps the newest one.--dedupe-mode oldestโ removes identical files then keeps the oldest one.--dedupe-mode renameโ removes identical files then renames the rest to be different.
- Implement
- Bug fixes
- Make rclone check obey the
--size-onlyflag. - Use
"application/octet-stream"if discovered mime type is invalid. - Fix missing
"quit"option when there are no remotes.
- Make rclone check obey the
- Google Drive
- Increase default chunk size to
8 MBโ increases upload speed of big files - Speed up directory listings and make more reliable
- Add missing retries for Move and DirMove โ increases reliability
- Preserve mime type on file update
- Increase default chunk size to
- Backblaze B2
- Enable mod time syncing
- This means that B2 will now check modification times
- It will upload new files to update the modification times
- (there isn't an API to just set the mod time.)
- If you want the old behaviour use
--size-only.
- Update API to new version
- Fix parsing of mod time when not in metadata
- Enable mod time syncing
- Swift/Hubic
- Don't return an
MD5SUMfor static large objects
- Don't return an
- S3
- Fix uploading files bigger than
50GB
- Fix uploading files bigger than
๐ v1.28 - 2016-03-01 ๐
- New Features
- Configuration file encryption โ thanks Klaus Post
- Improve
rclone configadding more help and making it easier to understand - Implement
-u/--updateso creation times can be used on all remotes - Implement
--low-level-retriesflag - Optionally disable gzip compression on downloads with
--no-gzip-encoding
- Bug fixes
- Don't make directories if
--dry-runset - Fix and document the move command
- Fix redirecting stderr on unix-like OSes when using
--log-file - Fix delete command to wait until all finished โ fixes missing deletes.
- Don't make directories if
- Backblaze B2
- Use one upload URL per go routine fixes more than one upload using auth token
- Add pacing, retries and reauthentication โ fixes token expiry problems
- Upload without using a temporary file from local (and remotes which support
SHA1) - Fix reading metadata for all files when it shouldn't have been
- Drive
- Fix listing drive documents at root
- Disable copy and move for Google docs
- Swift
- Fix uploading of chunked files with non ASCII characters
- Allow setting of
storage_urlin the config โ thanks Xavier Lucas
- S3
- Allow IAM role and credentials from environment variables โ thanks Brian Stengaard
- Allow low privilege users to use S3 (check if directory exists during
Mkdir) โ thanks Jakub Gedeon
- Amazon Drive
- Retry on more things to make directory listings more reliable
๐ v1.27 - 2016-01-31 ๐
- New Features
- Easier headless configuration with
rclone authorize - Add support for multiple hash types โ we now check
SHA1as well asMD5hashes. - delete command which does obey the filters (unlike purge)
- dedupe command to deduplicate a remote. Useful with Google Drive.
- Add
--ignore-existingflag to skip all files that exist on destination. - Add
--delete-before,--delete-during,--delete-afterflags. - Add
--memprofileflag to debug memory use. - Warn the user about files with same name but different case
- Make
--includerules add their implicit exclude*at the end of the filter list - Deprecate compiling with
go1.3
- Easier headless configuration with
- Amazon Drive
- Fix download of files >
10 GB - Fix directory traversal (
"Next token is expired") for large directory listings - Remove
409conflict from error codes we will retry โ stops very long pauses
- Fix download of files >
- Backblaze B2
SHA1hashes now checked by rclone core
- Drive
- Add
--drive-auth-owner-onlyto only consider files owned by the user โ thanks Bjรถrn Harrtell - Export Google documents
- Add
- Dropbox
- Make file exclusion error controllable with
-q
- Make file exclusion error controllable with
- Swift
- Fix upload from unprivileged user.
- S3
- Fix updating of mod times of files with
+in.
- Fix updating of mod times of files with
- Local
- Add local file system option to disable UNC on Windows.
๐ v1.26 - 2016-01-02 ๐
- New Features
- Yandex storage backend โ thank you Dmitry Burdeev ("dibu")
- Implement Backblaze B2 storage backend
- Add
--min-ageand--max-ageflags โ thank you Adriano Aurรฉlio Meirelles - Make
ls/lsl/md5sum/size/checkobey includes and excludes
- Fixes
- Fix crash in http logging
- Upload releases to github too
- Swift
- Fix sync for chunked files
- OneDrive
- Re-enable server-side copy
- Don't mask HTTP error codes with JSON decode error
- S3
- Fix corrupting
Content-Typeon mod time update (thanks Joseph Spurrier)
- Fix corrupting
๐ v1.25 - 2015-11-14 ๐
- New features
- Implement Hubic storage system
- Fixes
- Fix deletion of some excluded files without
--delete-excluded- This could have deleted files unexpectedly on sync
- Always check first with
--dry-run! ๐จ
- Fix deletion of some excluded files without
- Swift
- Stop
SetModTimelosing metadata (e.g.X-Object-Manifest)
- Stop
๐ v1.24 โ 2015-11-07
- New features โจ
- Add support for Microsoft OneDrive ๐
- Add
--no-check-certificateoption to disable server certificate verification - Add async readahead buffer for faster transfer of big files โก
- Fixes ๐ ๏ธ
- Allow spaces in remotes and check remote names for validity at creation time
- Allow
'&'and disallow':'in Windows filenames.
- Swift ๐ฆ
- Ignore directory marker objects where appropriate - allows working with Hubic
- Don't delete the container if fs wasn't at root
- S3 ๐
- Don't delete the bucket if fs wasn't at root
- Google Cloud Storage โ๏ธ
- Don't delete the bucket if fs wasn't at root
๐ธ v1.23 โ 2015-10-03
- New features
- Implement
rclone sizefor measuring remotes ๐
- Implement
- Fixes
- Fix headless config for drive and gcs
- Tell the user they should try again if the webserver method failed ๐
- Improve output of
--dump-headers
- S3
- Allow anonymous access to public buckets
- Swift
- Stop chunked operations logging "Failed to read info: Object Not Found"
- Use Content-Length on uploads for extra reliability
๐ v1.22 โ 2015-09-28
- Implement rsync like include and exclude flags ๐ฉ
- swift
- Support files > 5GB - thanks Sergey Tolmachev
โญ v1.21 โ 2015-09-22
- New features
- Display individual transfer progress
- Make lsl output times in localtime ๐
- Fixes
- Fix allowing user to override credentials again in Drive, GCS and ACD
- Amazon Drive
- Implement compliant pacing scheme ๐ข
- Google Drive
- Make directory reads concurrent for increased speed. โก
๐ v1.20 โ 2015-09-15
- New features
- Amazon Drive support ๐
- Oauth support redone - fix many bugs and improve usability
- Use
"golang.org/x/oauth2"as oauth library of choice - Improve oauth usability for smoother initial signup
drive,googlecloudstorage: optionally use auto config for the oauth token
- Use
- Implement
--dump-headersand--dump-bodiesdebug flags - Show multiple matched commands if abbreviation too short
- Implement server-side move where possible
- local
- Always use UNC paths internally on Windows - fixes a lot of bugs ๐ช
- dropbox
- force use of our custom transport which makes timeouts work
- Thanks to Klaus Post for lots of help with this release ๐ซถ
๐ง v1.19 โ 2015-08-28
- New features
- Server side copies for
s3/swift/drive/dropbox/gcs - Move command - uses server-side copies if it can
- Implement
--retriesflag - tries 3 times by default - Build for
plan9/amd64andsolaris/amd64too ๐๏ธ
- Server side copies for
- Fixes
- Make a current version download with a fixed URL for scripting
- Ignore rmdir in limited fs rather than throwing error
- dropbox
- Increase chunk size to improve upload speeds massively ๐
- Issue an error message when trying to upload bad file name
๐ v1.18 โ 2015-08-17
- drive
- Add
--drive-use-trashflag so rclone trashes instead of deletes ๐๏ธ - Add "Forbidden to download" message for files with no
downloadURL
- Add
- dropbox
- Remove datastore
- This was deprecated and it caused a lot of problems
- Modification times and MD5SUMs no longer stored
- Fix uploading files > 2GB
- Remove datastore
- s3
- use official AWS SDK from
github.com/aws/aws-sdk-go - NB will most likely require you to delete and recreate remote โ ๏ธ
- enable multipart upload which enables files > 5GB
- tested with Ceph / RadosGW / S3 emulation
- many thanks to Sam Liston and Brian Haymore at the Utah Center for High Performance Computing (https://www.chpc.utah.edu/) for a Ceph test account ๐
- use official AWS SDK from
- misc
- Show errors when reading the config file
- Do not print stats in quiet mode - thanks Leonid Shalupov
- Add FAQ
- Fix created directories not obeying umask
- Linux installation instructions - thanks Shimon Doodkin
๐ฆ v1.17 โ 2015-06-14
dropbox: fix case insensitivity issues - thanks Leonid Shalupov
๐ฅ v1.16 โ 2015-06-09
- Fix uploading big files which was causing timeouts or panics ๐ต
- Don't check md5sum after download with
--size-only
๐ v1.15 โ 2015-06-06
- Add
--checksumflag to only discard transfers by MD5SUM - thanks Alex Couper - Implement
--size-onlyflag to sync on size not checksum & modtime - Expand docs and remove duplicated information
- Document rclone's limitations with directories
dropbox: update docs about case insensitivity
๐ v1.14 โ 2015-05-21
local: fix encoding of non utf-8 file names - fixes a duplicate file problemdrive: docs about rate limitinggoogle cloud storage: Fix compile after API change in"google.golang.org/api/storage/v1"
๐ v1.13 โ 2015-05-10
- Revise documentation (especially sync)
- Implement
--timeoutand--conntimeout s3: ignore etags from multipart uploads which aren't md5sums
๐ v1.12 โ 2015-03-15
drive: Use chunked upload for files above a certain sizedrive: add--drive-chunk-sizeand--drive-upload-cutoffparametersdrive: switch to insert from update when a failed copy deletes the uploadcore: Log duplicate files if they are detected
๐ v1.11 โ 2015-03-04
swift: add region parameterdrive: fix crash on failed to update remote mtime- In remote paths, change native directory separators to
/ - Add synchronization to
ls/lsl/lsdoutput to stop corruptions - Ensure all stats/log messages to go stderr
- Add
--log-fileflag to log everything (including panics) to file - Make it possible to disable stats printing with
--stats=0 - Implement
--bwlimitto limit data transfer bandwidth ๐
โจ v1.10 โ 2015-02-12
s3: list an unlimited number of items- Fix getting stuck in the configurator ๐ญ
๐ธ v1.09 โ 2015-02-07
windows: Stop drive letters (e.g.C:) getting mixed up with remotes (e.g.drive:)local: Fix directory separators on Windowsdrive: fix rate limit exceeded errors
๐ v1.08 โ 2015-02-04
drive: fix subdirectory listing to not list entire drivedrive: FixSetModTimedropbox: adapt code to recent library changes
๐ง v1.07 โ 2014-12-23
google cloud storage: fix memory leak ๐ง
โญ v1.06 โ 2014-12-12
- Fix "Couldn't find home directory" on OSX
swift: Add tenant parameter- Use new location of Google API packages
๐ v1.05 โ 2014-08-09
- Improved tests and consequently lots of minor fixes
core: Fix race detected by go race detectorcore: Fixes after running errcheckdrive: reset root directory onRmdirandPurgefs: Document thatPurgerreturns error on empty directory, test and fixgoogle cloud storage: fixListDiron subdirectorygoogle cloud storage: re-read metadata inSetModTimes3: make reading metadata more reliable to work around eventual consistency problemss3: strip trailing/fromListDir()swift: return directories without/inListDir
๐ฆ v1.04 โ 2014-07-21
google cloud storage: Fix crash on Update
๐ v1.03 โ 2014-07-20
swift,s3,dropbox: fix updated files being marked as corrupted- Make compile with go 1.1 again
๐ฅ v1.02 โ 2014-07-19
- Implement Dropbox remote
- Implement Google Cloud Storage remote
- Verify Md5sums and Sizes after copies
- Remove times from
"ls"command - lists sizes only - Add add
"lsl"- lists times and sizes - Add
"md5sum"command
๐ v1.01 โ 2014-07-04
drive: fix transfer of big files using up lots of memory
๐ v1.00 โ 2014-07-03
drive: fix whole second dates
๐ธ v0.99 โ 2014-06-26
- Fix
--dry-runnot working - Make compatible with go 1.1
๐ v0.98 โ 2014-05-30
s3: Treat missing Content-Length as 0 for some ceph installationsrclonetest: add file with a space in
โญ v0.97 โ 2014-05-05
- Implement copying of single files
s3&swift: support paths inside containers/buckets
๐ง v0.96 โ 2014-04-24
drive: Fix multiple files of same name being createddrive: Useo.Updateandfs.Putto optimise transfers- Add version number,
-Vand--version
๐ v0.95 โ 2014-03-28
- rclone.org: website, docs and graphics ๐
drive: fix path parsing
๐ v0.94 โ 2014-03-27
- Change remote format one last time
- GNU style flags
๐ v0.93 โ 2014-03-16
drive: store token in config file- cross compile other versions
- set strict permissions on config file ๐
โจ v0.92 โ 2014-03-15
- Config fixes and
--configoption
๐ v0.91 โ 2014-03-15
- Make config file
๐ v0.90 โ 2013-06-27
- Project named rclone
๐ฆ v0.00 โ 2012-11-18
- Project started ๐
๐ Bugs and Limitations ๐
Limitations ๐
Directory timestamps aren't preserved on some backends โฐ
As of v1.66, rclone supports syncing directory modtimes, if the backend supports it. Some backends do not support it โ peep the overview (https://rclone.org/overview/) for a complete list. Also bestie, heads up: empty directories are not synced by default (this can be enabled with --create-empty-src-dirs.)
Rclone struggles with millions of files in a directory/bucket ๐ญ
Currently rclone loads each directory/bucket entirely into memory before using it. Since each rclone object takes 0.5k-1k of memory this can take a very long time and use a large amount of memory. ๐
Millions of files in a directory tends to occur on bucket-based remotes (e.g. S3 buckets) since those remotes do not segregate subdirectories within the bucket.
Bucket-based remotes and folders ๐ชฃ
Bucket-based remotes (e.g. S3/GCS/Swift/B2) do not have a concept of directories. Rclone therefore cannot create directories in them which means that empty directories on a bucket-based remote will tend to disappear. ๐ป
Some software creates empty keys ending in / as directory markers. Rclone doesn't do this as it potentially creates more objects and costs more. This ability may be added in the future (probably via a flag/option).
Bugs ๐
Bugs are stored in rclone's GitHub project:
- Reported bugs (https://github.com/rclone/rclone/issues?q=is%3Aopen+is%3Aissue+label%3Abug)
- Known issues (https://github.com/rclone/rclone/issues?q=is%3Aopen+is%3Aissue+milestone%3A%22Known+Problem%22)
๐ FREQUENTLY ASKED QUESTIONS ๐
okay bestie, gather round, it's Q&A o'clock โจ these are the questions everyone asks and the answers that actually slap, no gatekeeping here ๐ซถ
Do all cloud storage systems support all rclone commands
Yes they do, periodt ๐
All the rclone commands (e.g. sync, copy, etc.) will work on all the remote storage systems. every single one. no favorites, no exceptions, we love that for them ๐
Can I copy the config from one machine to another
Sure! Rclone stores all of its config in a single file, like the whole vibe in one little box ๐ If you want to find this file, run rclone config file and it will literally tell you where it is. iconic behaviour honestly.
See the remote setup docs (https://rclone.org/remote_setup/) for more info.
How do I configure rclone on a remote / headless box with no browser?
This has now been documented in its own remote setup page (https://rclone.org/remote_setup/) ๐ go read it, it's got the whole situation covered.
How can I get rid of the "Config file not found" notice?
If you see a notice like NOTICE: Config file "rclone.conf" not found, this means you have not configured any remotes. it's giving "empty contact list" energy ๐ญ
If you need to configure a remote, see the config help docs (https://rclone.org/docs/#configure).
If you are using rclone entirely with on the fly remotes (https://rclone.org/docs/#backend-path-to-dir), you can create an empty config file to get rid of this notice, for example:
rclone config touch
Can rclone sync directly from drive to s3
Rclone can sync between two remote cloud storage systems just fine ๐ฅ slay.
Note that it effectively downloads the file and uploads it again, so the node running rclone would need to have lots of bandwidth. no shortcuts here bestie, it's doing the whole commute twice ๐
The syncs would be incremental (on a file by file basis).
e.g.
rclone sync --interactive drive:Folder s3:bucket
Using rclone from multiple locations at the same time
You can use rclone from multiple places at the same time if you choose different subdirectory for the output, e.g.
Server A> rclone sync --interactive /tmp/whatever remote:ServerA
Server B> rclone sync --interactive /tmp/whatever remote:ServerB
If you sync to the same directory then you should use rclone copy otherwise the two instances of rclone may delete each other's files, e.g.
Server A> rclone copy /tmp/whatever remote:Backup
Server B> rclone copy /tmp/whatever remote:Backup
โ ๏ธ bestie listen โ if both servers sync into the same directory they can literally delete each other's files. use copy and behave ๐
The file names you upload from Server A and Server B should be different in this case, otherwise some file systems (e.g. Drive) may make duplicates. so keep the names distinct, okay? no clones (unless you want clones, in which case, you get clones ๐).
Why doesn't rclone support partial transfers / binary diffs like rsync?
Rclone stores each file you transfer as a native object on the remote cloud storage system. This means that you can see the files you upload as expected using alternative access methods (e.g. using the Google Drive web interface). There is a 1:1 mapping between files on your hard disk and objects created in the cloud storage system. one file on your disk = one object in the cloud, they're soulmates ๐
Cloud storage systems (at least none I've come across yet) don't support partially uploading an object. You can't take an existing object, and change some bytes in the middle of it. literally not a thing, nope.
It would be possible to make a sync system which stored binary diffs like rsync does, instead of whole objects, but that would break the 1:1 mapping of files on your hard disk to objects in the remote cloud storage system. and we are NOT breaking the mapping, the mapping is sacred โจ
All the cloud storage systems support partial downloads of content, so it would be possible to make partial downloads work. However to make this work efficiently this would require storing a significant amount of metadata, which breaks the desired 1:1 mapping of files to objects. so like, technically yes, practically no, and it'd wreck the whole mapping situation anyway ๐
Can rclone do bi-directional sync?
Yes, since rclone v1.58.0, bidirectional cloud sync (https://rclone.org/bisync/) is available. she can go both ways ๐
๐
Can I use rclone with an HTTP proxy?
Yes. rclone will follow the standard environment variables for proxies, similar to cURL and other programs.
In general the variables are called http_proxy (for services reached over http) and https_proxy (for services reached over https). Most public services will be using https, but you may wish to set both.
The content of the variable is protocol://server:port. The protocol value is the one used to talk to the proxy server, itself, and is commonly either http or socks5.
Slightly annoyingly, there is no standard for the name; some applications may use http_proxy but another one HTTP_PROXY. The Go libraries used by rclone will try both variations, but you may wish to set all possibilities. So, on Linux, you may end up with code similar to
export http_proxy=http://proxyserver:12345
export https_proxy=$http_proxy
export HTTP_PROXY=$http_proxy
export HTTPS_PROXY=$http_proxy
Note: If the proxy server requires a username and password, then use
export http_proxy=http://username:password@proxyserver:12345
export https_proxy=$http_proxy
export HTTP_PROXY=$http_proxy
export HTTPS_PROXY=$http_proxy
The NO_PROXY allows you to disable the proxy for specific hosts. Hosts must be comma separated, and can contain domains or parts. For instance "foo.com" also matches "bar.foo.com".
e.g.
export no_proxy=localhost,127.0.0.0/8,my.host.name
export NO_PROXY=$no_proxy
๐จ note that the FTP backend does not support ftp_proxy yet. ftp is lowkey not invited to the proxy party ๐ญ
You can use the command line argument --http-proxy to set the proxy, and in turn use an override in the config file if you want it set for a single backend, eg override.http_proxy = http://... in the config file.
The FTP and SFTP backends have their own http_proxy settings to support an HTTP CONNECT proxy ( --ftp-http-proxy (https://rclone.org/ftp/#ftp-http-proxy) and --sftp-http-proxy (https://rclone.org/ftp/#sftp-http-proxy) ) ๐
Rclone gives x509 SSL root certificates error
x509: failed to load system roots and no roots provided means that rclone can't find the SSL root certificates. Likely you are running rclone on a NAS with a cut-down Linux OS, or possibly on Solaris. she's looking for her roots and cannot find them ๐ญ
x509: certificate signed by unknown authority error may occur on outdated systems, where rclone can't verify the server with the SSL root certificates.
Rclone (via the Go runtime) tries to load the root certificates from these places on Linux.
"/etc/ssl/certs/ca-certificates.crt", // Debian/Ubuntu/Gentoo etc.
"/etc/pki/tls/certs/ca-bundle.crt", // Fedora/RHEL
"/etc/ssl/ca-bundle.pem", // OpenSUSE
"/etc/pki/tls/cacert.pem", // OpenELEC
So doing something like this should fix the problem. It also sets the time which is important for SSL to work properly. yes the clock matters bestie, SSL is dramatic like that ๐ฐ๏ธโจ
mkdir -p /etc/ssl/certs/
curl -o /etc/ssl/certs/ca-certificates.crt https://raw.githubusercontent.com/bagder/ca-bundle/master/ca-bundle.crt
ntpclient -s -h pool.ntp.org
The two environment variables SSL_CERT_FILE and SSL_CERT_DIR, mentioned in the x509 package (https://godoc.org/crypto/x509), provide an additional way to provide the SSL root certificates on Unix systems other than macOS.
Note that you may need to add the --insecure option to the curl command line if it doesn't work without.
curl --insecure -o /etc/ssl/certs/ca-certificates.crt https://raw.githubusercontent.com/bagder/ca-bundle/master/ca-bundle.crt
On macOS, you can install ca-certificates (https://formulae.brew.sh/formula/ca-certificates) with Homebrew, and specify the SSL root certificates with the --ca-cert (https://rclone.org/docs/#ca-cert-stringarray) flag. ๐
brew install ca-certificates
find $(brew --prefix)/etc/ca-certificates -type f
Rclone gives Failed to load config file: function not implemented error
Likely this means that you are running rclone on Linux version not supported by the go runtime, ie earlier than version 2.6.23. old kernel, no config, tragic ๐
See the system requirements section in the go install docs (https://golang.org/doc/install) for full details.
All my uploaded docx/xlsx/pptx files appear as archive/zip
This is caused by uploading these files from a Windows computer which hasn't got the Microsoft Office suite installed. The easiest way to fix is to install the Word viewer and the Microsoft Office Compatibility Pack for Word, Excel, and PowerPoint 2007 and later versions' file formats. classic Windows being Windows ๐ญ
tcp lookup some.domain.com no such host
This happens when rclone cannot resolve a domain. Please check that your DNS setup is generally working, e.g.
# both should print a long list of possible IP addresses
dig www.googleapis.com # resolve using your default DNS
dig www.googleapis.com @8.8.8.8 # resolve with Google's DNS server
If you are using systemd-resolved (default on Arch Linux), ensure it is at version 233 or higher. Previous releases contain a bug which causes not all domains to be resolved properly. so if DNS is being flaky, check that version, fr fr ๐
The Go resolver decision can be influenced with the GODEBUG=netdns=... environment variable. This also allows to resolve certain issues with DNS resolution. On Windows or MacOS systems, try forcing use of the internal Go resolver by setting GODEBUG=netdns=go at runtime. On other systems (Linux, *BSD, etc) try forcing use of the system name resolver by setting GODEBUG=netdns=cgo (and recompile rclone from source with CGO enabled if necessary). See the name resolution section in the go docs (https://golang.org/pkg/net/#hdr-Name_Resolution).
Failed to start auth webserver on Windows
Error: config failed to refresh token: failed to start auth webserver: listen tcp 127.0.0.1:53682: bind: An attempt was made to access a socket in a way forbidden by its access permissions.
...
yyyy/mm/dd hh:mm:ss Fatal error: config failed to refresh token: failed to start auth webserver: listen tcp 127.0.0.1:53682: bind: An attempt was made to access a socket in a way forbidden by its access permissions.
This is sometimes caused by the Host Network Service causing issues with opening the port on the host. Windows really said "no port for you today" ๐
A simple solution may be restarting the Host Network Service with eg. Powershell
Restart-Service hns
The total size reported in the stats for a sync is wrong and keeps changing
It is likely you have more than 10,000 files that need to be synced. By default, rclone only gets 10,000 files ahead in a sync so as not to use up too much memory. You can change this default with the --max-backlog (https://rclone.org/docs/#max-backlog-int) flag. so if the numbers are doing the cha-cha slide, this is probably why ๐
Rclone is using too much memory or appears to have a memory leak
Rclone is written in Go which uses a garbage collector. The default settings for the garbage collector mean that it runs when the heap size has doubled. it's not leaking bestie, it's just vibing at 2x ๐๏ธ
However it is possible to tune the garbage collector to use less memory by setting GOGC (https://dave.cheney.net/tag/gogc) to a lower value, say export GOGC=20. This will make the garbage collector work harder, reducing memory size at the expense of CPU usage. trade-offs, we love a trade-off ๐
The most common cause of rclone using lots of memory is a single directory with millions of files in. one giant directory is giving "hoarder room" energy and it WILL eat your RAM ๐ญ
Before rclone v1.70 it literally had to load this entire thing into memory as rclone objects ๐ญ and each rclone object eats up 0.5k-1k of memory, no cap. There's a workaround for this (https://github.com/rclone/rclone/wiki/Big-syncs-with-millions-of-files) but it involves a bit of scripting, soโฆ bestie, it's giving โจdo it yourselfโจ energy.
However ๐
with rclone v1.70 and later, rclone will automatically save directory entries to disk when a directory with more than --list-cutoff (https://rclone.org/docs/#list-cutoff) (1,000,000 by default) entries is detected. Automatic. Self-care. We love to see it ๐
From v1.70 rclone also has the --max-buffer-memory (https://rclone.org/docs/#max-buffer-memory) flag which helps particularly when multi-thread transfers are using too much memory ๐ฅ
Rclone changes fullwidth Unicode punctuation marks in file names ๐ธ
For example: on a Windows system, you have a file with name Test๏ผ1.jpg, where ๏ผ is the Unicode fullwidth colon symbol. When using rclone to copy this to your Google Drive, you will notice that the file gets renamed to Test:1.jpg, where : is the regular (halfwidth) colon. Not me being likeโฆ where did my colon go ๐
The reason for such renames is the way rclone handles different restricted filenames (https://rclone.org/overview/#restricted-filenames) on different cloud storage systems. It tries to avoid ambiguous file names as much as it can and allow moving files between many cloud storage systems transparently, by replacing invalid characters with similar looking Unicode characters when transferring to one storage system, and replacing back again when transferring to a different storage system where the original characters are supported. The way that it's out here doing character cosplay for compatibility ๐
When the same Unicode characters are intentionally used in file names, this replacement strategy leads to unwanted renames ๐ Read more under section caveats (https://rclone.org/overview/#restricted-filenames-caveats).
Why does rclone fail to connect over TLS but another client works? ๐ฆ
If you see TLS handshake failures (or packet captures show the server rejecting all offered ciphers), the server/proxy may only support legacy TLS cipher suites (for example RSA key-exchange ciphers such as RSA_WITH_AES_256_CBC_SHA256, or old 3DES ciphers). Recent Go versions (which rclone is built with) have removed insecure ciphers from the default list, so rclone may refuse to negotiate them even if other tools still do. rclone is the friend who will NOT sit with the sketchy crowd ๐ซ
If you can't update/reconfigure the server/proxy to support modern TLS (TLS 1.2/1.3) and ECDHE-based cipher suites you can re-enable legacy ciphers via GODEBUG:
- Windows (
cmd.exe):
set GODEBUG=tlsrsakex=1
rclone copy ...
- Windows (PowerShell):
$env:GODEBUG="tlsrsakex=1"
rclone copy ...
- Linux/macOS:
GODEBUG=tlsrsakex=1 rclone copy ...
If the server only supports 3DES, try:
GODEBUG=tls3des=1 rclone ...
This applies to any rclone feature using TLS (HTTPS, FTPS, WebDAV over TLS, proxies with TLS interception, etc.). Use these workarounds only long enough to get the server/proxy updated ๐ซถ like, it's a bandaid not a lifestyle, bestie.
License ๐๐
This is free software under the terms of the MIT license (check the COPYING file included with the source code).
Copyright (C) 2019 by Nick Craig-Wood https://www.craig-wood.com/nick/
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
Authors and contributors ๐๐
Authors ๐
- Nick Craig-Wood
<nick@craig-wood.com>
Contributors โจ๐
The way this list is a whole group chat of absolute legends, fr fr ๐
- Alex Couper
<amcouper@gmail.com> - Leonid Shalupov
<leonid@shalupov.com><shalupov@diverse.org.ru> - Shimon Doodkin
<helpmepro1@gmail.com> - Colin Nicholson
<colin@colinn.com> - Klaus Post
<klauspost@gmail.com> - Sergey Tolmachev
<tolsi.ru@gmail.com> - Adriano Aurรฉlio Meirelles
<adriano@atinge.com> - C. Bess
<cbess@users.noreply.github.com> - Dmitry Burdeev
<dibu28@gmail.com> - Joseph Spurrier
<github@josephspurrier.com> - Bjรถrn Harrtell
<bjorn@wololo.org> - Xavier Lucas
<xavier.lucas@corp.ovh.com> - Werner Beroux
<werner@beroux.com> - Brian Stengaard
<brian@stengaard.eu> - Jakub Gedeon
<jgedeon@sofi.com> - Jim Tittsler
<jwt@onjapan.net> - Michal Witkowski
<michal@improbable.io> - Fabian Ruff
<fabian.ruff@sap.com> - Leigh Klotz
<klotz@quixey.com> - Romain Lapray
<lapray.romain@gmail.com> - Justin R. Wilson
<jrw972@gmail.com> - Antonio Messina
<antonio.s.messina@gmail.com> - Stefan G. Weichinger
<office@oops.co.at> - Per Cederberg
<cederberg@gmail.com> - Radek ล enfeld
<rush@logic.cz> - Fredrik Fornwall
<fredrik@fornwall.net> - Asko Tamm
<asko@deekit.net> - xor-zz
<xor@gstocco.com> - Tomasz Mazur
<tmazur90@gmail.com> - Marco Paganini
<paganini@paganini.net> - Felix Bรผnemann
<buenemann@louis.info> - Durval Menezes
<jmrclone@durval.com> - Luiz Carlos Rumbelsperger Viana
<maxd13_luiz_carlos@hotmail.com> - Stefan Breunig
<stefan-github@yrden.de> - Alishan Ladhani
<ali-l@users.noreply.github.com> - 0xJAKE
<0xJAKE@users.noreply.github.com> - Thibault Molleman
<thibaultmol@users.noreply.github.com> - Scott McGillivray
<scott.mcgillivray@gmail.com> - Bjรธrn Erik Pedersen
<bjorn.erik.pedersen@gmail.com> - Lukas Loesche
<lukas@mesosphere.io> - emyarod
<emyarod@users.noreply.github.com> - T.C. Ferguson
<tcf909@gmail.com> - Brandur
<brandur@mutelight.org> - Dario Giovannetti
<dev@dariogiovannetti.net> - Kรกroly Olรกh
<okaresz@aol.com> - Jon Yergatian
<jon@macfanatic.ca> - Jack Schmidt
<github@mowsey.org> - Dedsec1
<Dedsec1@users.noreply.github.com> - Hisham Zarka
<hzarka@gmail.com> - Jรฉrรดme Vizcaino
<jerome.vizcaino@gmail.com> - Mike Tesch
<mjt6129@rit.edu> - Marvin Watson
<marvwatson@users.noreply.github.com> - Danny Tsai
<danny8376@gmail.com> - Yoni Jah
<yonjah+git@gmail.com><yonjah+github@gmail.com> - Stephen Harris
<github@spuddy.org><sweharris@users.noreply.github.com> - Ihor Dvoretskyi
<ihor.dvoretskyi@gmail.com> - Jon Craton
<jncraton@gmail.com> - Hraban Luyat
<hraban@0brg.net> - Michael Ledin
<mledin89@gmail.com> - Martin Kristensen
<me@azgul.com> - Too Much IO
<toomuchio@users.noreply.github.com> - Anisse Astier
<anisse@astier.eu> - Zahiar Ahmed
<zahiar@live.com> - Igor Kharin
<igorkharin@gmail.com> - Bill Zissimopoulos
<billziss@navimatics.com> - Bob Potter
<bobby.potter@gmail.com> - Steven Lu
<tacticalazn@gmail.com> - Sjur Fredriksen
<sjurtf@ifi.uio.no> - Ruwbin
<hubus12345@gmail.com> - Fabian Mรถller
<fabianm88@gmail.com><f.moeller@nynex.de> - Edward Q. Bridges
<github@eqbridges.com> - Vasiliy Tolstov
<v.tolstov@selfip.ru> - Harshavardhana
<harsha@minio.io> - sainaen
<sainaen@gmail.com> - gdm85
<gdm85@users.noreply.github.com> - Yaroslav Halchenko
<debian@onerussian.com> - John Papandriopoulos
<jpap@users.noreply.github.com> - Zhiming Wang
<zmwangx@gmail.com> - Andy Pilate
<cubox@cubox.me> - Oliver Heyme
<olihey@googlemail.com><olihey@users.noreply.github.com><de8olihe@lego.com> - wuyu
<wuyu@yunify.com> - Andrei Dragomir
<adragomi@adobe.com> - Christian Brรผggemann
<mail@cbruegg.com> - Alex McGrath Kraak
<amkdude@gmail.com> - bpicode
<bjoern.pirnay@googlemail.com> - Daniel Jagszent
<daniel@jagszent.de> - Josiah White
<thegenius2009@gmail.com> - Ishuah Kariuki
<kariuki@ishuah.com><ishuah91@gmail.com> - Jan Varho
<jan@varho.org> - Girish Ramakrishnan
<girish@cloudron.io> - LingMan
<LingMan@users.noreply.github.com> - Jacob McNamee
<jacobmcnamee@gmail.com> - jersou
<jertux@gmail.com> - thierry
<thierry@substantiel.fr> - Simon Leinen
<simon.leinen@gmail.com><ubuntu@s3-test.novalocal> - Dan Dascalescu
<ddascalescu+github@gmail.com> - Jason Rose
<jason@jro.io> - Andrew Starr-Bochicchio
<a.starr.b@gmail.com> - John Leach
<john@johnleach.co.uk> - Corban Raun
<craun@instructure.com> - Pierre Carlson
<mpcarl@us.ibm.com> - Ernest Borowski
<er.borowski@gmail.com> - Remus Bunduc
<remus.bunduc@gmail.com> - Iakov Davydov
<iakov.davydov@unil.ch><dav05.gith@myths.ru> - Jakub Tasiemski
<tasiemski@gmail.com> - David Minor
<dminor@saymedia.com> - Tim Cooijmans
<cooijmans.tim@gmail.com> - Laurence
<liuxy6@gmail.com> - Giovanni Pizzi
<gio.piz@gmail.com> - Filip Bartodziej
<filipbartodziej@gmail.com> - Jon Fautley
<jon@dead.li> - lewapm
<32110057+lewapm@users.noreply.github.com> - Yassine Imounachen
<yassine256@gmail.com> - Chris Redekop
<chris-redekop@users.noreply.github.com><chris.redekop@gmail.com> - Jon Fautley
<jon@adenoid.appstal.co.uk> - Will Gunn
<WillGunn@users.noreply.github.com> - Lucas Bremgartner
<lucas@bremis.ch> - Jody Frankowski
<jody.frankowski@gmail.com> - Andreas Roussos
<arouss1980@gmail.com> - nbuchanan
<nbuchanan@utah.gov> - Durval Menezes
<rclone@durval.com> - Victor
<vb-github@viblo.se> - Mateusz
<pabian.mateusz@gmail.com> - Daniel Loader
<spicypixel@gmail.com> - David0rk
<davidork@gmail.com> - Alexander Neumann
<alexander@bumpern.de> - Giri Badanahatti
<gbadanahatti@us.ibm.com@Giris-MacBook-Pro.local> - Leo R. Lundgren
<leo@finalresort.org> - wolfv
<wolfv6@users.noreply.github.com> - Dave Pedu
<dave@davepedu.com> - Stefan Lindblom
<lindblom@spotify.com> - seuffert
<oliver@seuffert.biz> - gbadanahatti
<37121690+gbadanahatti@users.noreply.github.com> - Keith Goldfarb
<barkofdelight@gmail.com> - Steve Kriss
<steve@heptio.com> - Chih-Hsuan Yen
<yan12125@gmail.com>
...and the list just keeps going, bestie. Like genuinely, this is the part where you realize rclone is not a one-person situation โ it's a whole group chat that somehow ships code. ๐
- Alexander Neumann <fd0@users.noreply.github.com>
- Matt Holt <mholt@users.noreply.github.com>
- Eri Bastos <bastos.eri@gmail.com>
- Michael P. Dubner <pywebmail@list.ru>
- Antoine GIRARD <sapk@users.noreply.github.com>
- Mateusz Piotrowski <mpp302@gmail.com>
- Animosity022 <animosity22@users.noreply.github.com> <earl.texter@gmail.com>
- Peter Baumgartner <pete@lincolnloop.com>
- Craig Rachel <craig@craigrachel.com>
- Michael G. Noll <miguno@users.noreply.github.com>
- hensur <me@hensur.de>
- Oliver Heyme <de8olihe@lego.com>
- Richard Yang <richard@yenforyang.com>
- Piotr Oleszczyk <piotr.oleszczyk@gmail.com>
- Rodrigo <rodarima@gmail.com>
- NoLooseEnds <NoLooseEnds@users.noreply.github.com>
- Jakub Karlicek <jakub@karlicek.me>
- John Clayton <john@codemonkeylabs.com>
- Kasper Byrdal Nielsen <byrdal76@gmail.com>
- Benjamin Joseph Dag <bjdag1234@users.noreply.github.com>
- themylogin <themylogin@gmail.com>
- Onno Zweers <onno.zweers@surfsara.nl>
- Jasper Lievisse Adriaanse <jasper@humppa.nl>
- sandeepkru <sandeep.ummadi@gmail.com> <sandeepkru@users.noreply.github.com>
- HerrH <atomtigerzoo@users.noreply.github.com>
- Andrew <4030760+sparkyman215@users.noreply.github.com>
- dan smith <XX1011@gmail.com>
- Oleg Kovalov <iamolegkovalov@gmail.com>
- Ruben Vandamme <github-com-00ff86@vandamme.email>
- Cnly <minecnly@gmail.com>
- Andres Alvarez <1671935+kir4h@users.noreply.github.com>
- reddi1 <xreddi@gmail.com>
- Matt Tucker <matthewtckr@gmail.com>
- Sebastian Bรผnger <buengese@gmail.com> <buengese@protonmail.com>
- Martin Polden <mpolden@mpolden.no>
- Alex Chen <Cnly@users.noreply.github.com>
- Denis <deniskovpen@gmail.com>
okay the way this list has a whole fanbase energy to it, like every one of these humans touched the code and now they live in the manpage forever, iconic ๐
- bsteiss <35940619+bsteiss@users.noreply.github.com>
- Cรฉdric Connes <cedric.connes@gmail.com>
- Dr. Tobias Quathamer <toddy15@users.noreply.github.com>
- dcpu <42736967+dcpu@users.noreply.github.com>
- Sheldon Rupp <me@shel.io>
- albertony <12441419+albertony@users.noreply.github.com>
- cron410 <cron410@gmail.com>
- Anagh Kumar Baranwal <6824881+darthShadow@users.noreply.github.com>
- Felix Brucker <felix@felixbrucker.com>
- Santiago Rodrรญguez <scollazo@users.noreply.github.com>
- Craig Miskell <craig.miskell@fluxfederation.com>
- Antoine GIRARD <sapk@sapk.fr>
- Joanna Marek <joanna.marek@u2i.com>
- frenos <frenos@users.noreply.github.com>
- ssaqua <ssaqua@users.noreply.github.com>
- xnaas <me@xnaas.info>
- Frantisek Fuka <fuka@fuxoft.cz>
- Paul Kohout <pauljkohout@yahoo.com>
- dcpu <43330287+dcpu@users.noreply.github.com>
- jackyzy823 <jackyzy823@gmail.com>
- David Haguenauer <ml@kurokatta.org>
- teresy <hi.teresy@gmail.com>
- buergi <patbuergi@gmx.de>
- Florian Gamboeck <mail@floga.de>
- Ralf Hemberger <10364191+rhemberger@users.noreply.github.com>
- Scott Edlund <sedlund@users.noreply.github.com>
- Erik Swanson <erik@retailnext.net>
- Jake Coggiano <jake@stripe.com>
- brused27 <brused27@noemailaddress>
- Peter Kaminski <kaminski@istori.com>
- Henry Ptasinski <henry@logout.com>
- Alexander <kharkovalexander@gmail.com>
- Garry McNulty <garrmcnu@gmail.com>
- Mathieu Carbou <mathieu.carbou@gmail.com>
- Mark Otway <mark@otway.com>
- William Cocker <37018962+WilliamCocker@users.noreply.github.com>
- Franรงois Leurent <131.js@cloudyks.org>
- Arkadius Stefanski <arkste@gmail.com>
- Jay <dev@jaygoel.com>
- andrea rota <a@xelera.eu>
- nicolov <nicolov@users.noreply.github.com>
- Matt Joiner <anacrolix@gmail.com>
- Dario Guzik <dario@guzik.com.ar>
- qip <qip@users.noreply.github.com>
- yair@unicorn <yair@unicorn>
- Matt Robinson <brimstone@the.narro.ws>
- kayrus <kay.diam@gmail.com>
not us hitting the point in the credits where you're like "wait there's MORE?" โ bestie there is always more, this repo is a village ๐ซถ
- Rรฉmy Lรฉone <remy.leone@gmail.com>
- Wojciech Smigielski <wojciech.hieronim.smigielski@gmail.com>
- weetmuts <oehrstroem@gmail.com>
- Jonathan <vanillajonathan@users.noreply.github.com>
- James Carpenter <orbsmiv@users.noreply.github.com>
- Vince <vince0villamora@gmail.com>
- Nestar47 <47841759+Nestar47@users.noreply.github.com>
- Six <brbsix@gmail.com>
- Alexandru Bumbacea <alexandru.bumbacea@booking.com>
- calisro <robert.calistri@gmail.com>
- Dr.Rx <david.rey@nventive.com>
- marcintustin <marcintustin@users.noreply.github.com>
- jaKa Moฤnik <jaka@koofr.net>
- Fionera <fionera@fionera.de>
- Dan Walters <dan@walters.io>
- Danil Semelenov <sgtpep@users.noreply.github.com>
- xopez <28950736+xopez@users.noreply.github.com>
- Ben Boeckel <mathstuf@gmail.com>
- Manu <manu@snapdragon.cc>
- Kyle E. Mitchell <kyle@kemitchell.com>
- Gary Kim <gary@garykim.dev>
- Jon <jonathn@github.com>
- Jeff Quinn <jeffrey.quinn@bluevoyant.com>
- Peter Berbec <peter@berbec.com>
- didil <1284255+didil@users.noreply.github.com>
- id01 <gaviniboom@gmail.com>
- Robert Marko <robimarko@gmail.com>
- Philip Harvey <32467456+pharveybattelle@users.noreply.github.com>
- JorisE <JorisE@users.noreply.github.com>
- garry415 <garry.415@gmail.com>
- forgems <forgems@gmail.com>
- Florian Apolloner <florian@apolloner.eu>
- Aleksandar Jankoviฤ <office@ajankovic.com> <ajankovic@users.noreply.github.com>
- Maran <maran@protonmail.com>
- nguyenhuuluan434 <nguyenhuuluan434@gmail.com>
- Laura Hausmann <zotan@zotan.pw> <laura@hausmann.dev>
- yparitcher <y@paritcher.com>
- AbelThar <abela.tharen@gmail.com>
- Matti Niemenmaa <matti.niemenmaa+git@iki.fi>
- Russell Davis <russelldavis@users.noreply.github.com>
- Yi FU <yi.fu@tink.se>
- Paul Millar <paul.millar@desy.de>
- justinalin <justinalin@qnap.com>
- EliEron <subanimehd@gmail.com>
- justina777 <chiahuei.lin@gmail.com>
- Chaitanya Bankanhal <bchaitanya15@gmail.com>
- Michaล Matczuk <michal@scylladb.com>
- Macavirus <macavirus@zoho.com>
- Abhinav Sharma <abhi18av@outlook.com>
- ginvine <34869051+ginvine@users.noreply.github.com>
- Patrick Wang <mail6543210@yahoo.com.tw>
- Cenk Alti <cenkalti@gmail.com>
shoutout to everyone with a + in their GitHub handle btw, that's main character encoding right there โจ
- Andreas Chlupka <andy@chlupka.com>
- Alfonso Montero <amontero@tinet.org>
- Ivan Andreev <ivandeex@gmail.com>
- David Baumgold <david@davidbaumgold.com>
- Lars Lehtonen <lars.lehtonen@gmail.com>
- Matei David <matei.david@gmail.com>
- David <david.bramwell@endemolshine.com>
- Anthony Rusdi <33247310+antrusd@users.noreply.github.com>
- Richard Patel <me@terorie.dev>
- ๅบๅคฉ็ฟผ <zty0826@gmail.com>
- SwitchJS <dev@switchjs.com>
- Raphael <PowershellNinja@users.noreply.github.com>
- Sezal Agrawal <sezalagrawal@gmail.com>
- Tyler <TylerNakamura@users.noreply.github.com>
- Brett Dutro <brett.dutro@gmail.com>
- Vighnesh SK <booterror99@gmail.com>
- Arijit Biswas <dibbyo456@gmail.com>
- Michele Caci <michele.caci@gmail.com>
- AlexandrBoltris <ua2fgb@gmail.com>
- Bryce Larson <blarson@saltstack.com>
- Carlos Ferreyra <crypticmind@gmail.com>
- Saksham Khanna <sakshamkhanna@outlook.com>
- dausruddin <5763466+dausruddin@users.noreply.github.com>
- zero-24 <zero-24@users.noreply.github.com>
- Xiaoxing Ye <ye@xiaoxing.us>
- Barry Muldrey <barry@muldrey.net>
- Sebastian Brandt <sebastian.brandt@friday.de>
- Marco Molteni <marco.molteni@mailbox.org>
- Ankur Gupta <7876747+ankur0493@users.noreply.github.com>
- Maciej Zimnoch <maciej@scylladb.com>
- anuar45 <serdaliyev.anuar@gmail.com>
- Fernando <ferferga@users.noreply.github.com>
- David Cole <david.cole@sohonet.com>
- Wei He <git@weispot.com>
- Outvi V <19144373+outloudvi@users.noreply.github.com>
- Thomas Kriechbaumer <thomas@kriechbaumer.name>
- Tennix <tennix@users.noreply.github.com>
- Ole Schรผtt <ole@schuett.name>
- Kuang-che Wu <kcwu@csie.org>
- Thomas Eales <wingsuit@users.noreply.github.com>
- Paul Tinsley <paul.tinsley@vitalsource.com>
- Felix Hungenberg <git@shiftgeist.com>
- Benjamin Richter <github@dev.telepath.de>
- landall <cst_zf@qq.com>
- thestigma <thestigma@gmail.com>
quick vibe check: still not done. bestie the credits are LONGER than my attention span and I respect it ๐
- jtagcat <38327267+jtagcat@users.noreply.github.com>
- Damon Permezel <permezel@me.com>
- boosh <boosh@users.noreply.github.com>
- unbelauscht <58393353+unbelauscht@users.noreply.github.com>
- Motonori IWAMURO <vmi@nifty.com>
- Benjapol Worakan <benwrk@live.com>
- Dave Koston <dave.koston@stackpath.com>
- Durval Menezes <DurvalMenezes@users.noreply.github.com>
- Tim Gallant <me@timgallant.us>
- Frederick Zhang <frederick888@tsundere.moe>
- valery1707 <valery1707@gmail.com>
- Yves G <theYinYeti@yalis.fr>
- Shing Kit Chan <chanshingkit@gmail.com>
- Franklyn Tackitt <franklyn@tackitt.net>
- Robert-Andrรฉ Mauchin <zebob.m@gmail.com>
- evileye <48332831+ibiruai@users.noreply.github.com>
- Joachim Brandon LeBlanc <brandon@leblanc.codes>
- Patryk Jakuszew <patryk.jakuszew@gmail.com>
- fishbullet <shindu666@gmail.com>
- greatroar <@>
- Bernd Schoolmann <mail@quexten.com>
- Elan Ruusamรคe <glen@pld-linux.org>
- Max Sum <max@lolyculture.com>
- Mark Spieth <mspieth@users.noreply.github.com>
- harry <me@harry.plus>
- Samantha McVey <samantham@posteo.net>
- Jack Anderson <jack.anderson@metaswitch.com>
- Michael G <draget@speciesm.net>
- Brandon Philips <brandon@ifup.org>
- Daven <dooven@users.noreply.github.com>
- Martin Stone <martin@d7415.co.uk>
- David Bramwell <13053834+dbramwell@users.noreply.github.com>
- Sunil Patra <snl_su@live.com>
- Adam Stroud <adam.stroud@gmail.com>
- Kush <kushsharma@users.noreply.github.com>
- Matan Rosenberg <matan129@gmail.com>
- gitch1 <63495046+gitch1@users.noreply.github.com>
- ElonH <elonhhuang@gmail.com>
- Fred <fred@creativeprojects.tech>
- Sรฉbastien Gross <renard@users.noreply.github.com>
- Maxime Suret <11944422+msuret@users.noreply.github.com>
- Caleb Case <caleb@storj.io> <calebcase@gmail.com>
- Ben Zenker <imbenzenker@gmail.com>
- Martin Michlmayr <tbm@cyrius.com>
- Brandon McNama <bmcnama@pagerduty.com>
- Daniel Slyman <github@skylayer.eu>
- Alex Guerrero <guerrero@users.noreply.github.com>
- Matteo Pietro Dazzi <matteopietro.dazzi@gft.com>
- edwardxml <56691903+edwardxml@users.noreply.github.com>
okay bestie we're still deep in the author roll call and honestly this list is giving phone book but make it community โจ like every single one of these legends showed up for rclone and we are NOT skipping a single one. grab a snack, we're doing this properly ๐
- Roman Kredentser
<shareed2k@gmail.com> - Kamil Trzciลski
<ayufan@ayufan.eu> - Zac Rubin
<z-0@users.noreply.github.com> - Vincent Feltz
- Heiko Bornholdt
<bornholdt@informatik.uni-hamburg.de> - Matteo Pietro Dazzi
<matteopietro.dazzi@gmail.com> - jtagcat
<gitlab@c7.ee> - Petri Salminen
<petri@salminen.dev> - Tim Burke
<tim.burke@gmail.com> - Kai Lรผke
<kai@kinvolk.io> - Garrett Squire
<github@garrettsquire.com> - Evan Harris
<eharris@puremagic.com> - Kevin
<keyam@microsoft.com> - Morten Linderud
<morten@linderud.pw> - Dmitry Ustalov
<dmitry.ustalov@gmail.com> - Jack
<196648+jdeng@users.noreply.github.com> - kcris
<cristian.tarsoaga@gmail.com> - tyhuber1
<68970760+tyhuber1@users.noreply.github.com> - David Ibarra
<david.ibarra@realty.com> - Tim Gallant
<tim@lilt.com>
look at that roster. immaculate vibes, no notes ๐ซถ anywayโ
- Kaloyan Raev
<kaloyan@storj.io> - Jay McEntire
<jay.mcentire@gmail.com> - Leo Luan
<leoluan@us.ibm.com> - aus
<549081+aus@users.noreply.github.com> - Aaron Gokaslan
<agokaslan@fb.com> - Egor Margineanu
<egmar@users.noreply.github.com> - Lucas Kanashiro
<lucas.kanashiro@canonical.com> - WarpedPixel
<WarpedPixel@users.noreply.github.com> - Sam Edwards
<sam@samedwards.ca> - wjielai
<gouki0123@gmail.com> - Muffin King
<jinxz_k@live.com> - Christopher Stewart
<6573710+1f47a@users.noreply.github.com> - Russell Cattelan
<cattelan@digitalelves.com> - gyutw
<30371241+gyutw@users.noreply.github.com> - Hekmon
<edouardhur@gmail.com> - LaSombra
<lasombra@users.noreply.github.com> - Dov Murik
<dov.murik@gmail.com> - Ameer Dawood
<ameer1234567890@gmail.com> - Dan Hipschman
<dan.hipschman@opendoor.com> - Josh Soref
<jsoref@users.noreply.github.com><2119212+jsoref@users.noreply.github.com>
not the double-email flex, we love a main character with backups ๐ and it continues:
- David
<david@staron.nl> - Ingo
<ingo@hoffmann.cx> - Adam Plรกnskรฝ
<adamplansky@users.noreply.github.com><adamplansky@gmail.com> - Manish Gupta
<manishgupta.ait@gmail.com> - Deepak Sah
<sah.sslpu@gmail.com> - Marcin Zelent
<marcin@zelent.net> - zhucan
<zhucan.k8s@gmail.com> - James Lim
<james.lim@samsara.com> - Laurens Janssen
<BD69BM@insim.biz> - Bob Bagwill
<bobbagwill@gmail.com> - Nathan Collins
<colli372@msu.edu> - lostheli
- kelv
<kelvin@acks.org> - Milly
<milly.ca@gmail.com> - gtorelly
<gtorelly@gmail.com> - Brad Ackerman
<brad@facefault.org> - Mitsuo Heijo
<mitsuo.heijo@gmail.com> - Claudio Bantaloukas
<rockdreamer@gmail.com> - Benjamin Gustin
<gustin.ben@gmail.com> - Ingo Weiss
<ingo@redhat.com>
shoutout to the no-email babes holding it down, we see you ๐ still going:
- Kerry Su
<me@sshockwave.net> - Ilyess Bachiri
<ilyess.bachiri@sonder.com> - Yury Stankevich
<urykhy@gmail.com> - kice
<wslikerqs@gmail.com> - Denis Neuling
<denisneuling@gmail.com> - Janne Johansson
<icepic.dz@gmail.com> - Patrik Nordlรฉn
<patriki@gmail.com> - CokeMine
<aptx4561@gmail.com> - Sฦกn Trแบงn-Nguyแป
n
<github@sntran.com> - lluuaapp
<266615+lluuaapp@users.noreply.github.com> - Zach Kipp
<kipp.zach@gmail.com> - Riccardo Iaconelli
<riccardo@kde.org> - Sakuragawa Misty
<gyc990326@gmail.com> - Nicolas Rueff
<nicolas@rueff.fr> - Pau Rodriguez-Estivill
<prodrigestivill@gmail.com> - Bob Pusateri
<BobPusateri@users.noreply.github.com> - Alex JOST
<25005220+dimejo@users.noreply.github.com> - Alexey Tabakman
<samosad.ru@gmail.com> - David Sze
<sze.david@gmail.com> - cynthia kwok
<cynthia.m.kwok@gmail.com>
literally every one of these names is a little building block of the thing you're using rn, it's giving โจcollaboration coreโจ anywayโ
- Miron Veryanskiy
<MironVeryanskiy@gmail.com> - K265
<k.265@qq.com> - Vesnyx
<Vesnyx@users.noreply.github.com> - Dmitry Chepurovskiy
<me@dm3ch.net> - Rauno Ots
<rauno.ots@cgi.com> - Georg Neugschwandtner
<georg.neugschwandtner@gmx.net> - pvalls
<polvallsrue@gmail.com> - Robert Thomas
<31854736+wolveix@users.noreply.github.com> - Romeo Kienzler
<romeo.kienzler@gmail.com> - tYYGH
<tYYGH@users.noreply.github.com> - georne
<77802995+georne@users.noreply.github.com> - Maxwell Calman
<mcalman@MacBook-Pro.local> - Naveen Honest Raj
<naveendurai19@gmail.com> - Lucas Messenger
<lmesseng@cisco.com> - Manish Kumar
<krmanish260@gmail.com> - x0b
<x0bdev@gmail.com> - CERN through the CS3MESH4EOSC Project
- Nick Gaya
<nicholasgaya+github@gmail.com> - Ashok Gelal
<401055+ashokgelal@users.noreply.github.com> - Dominik Mydlil
<dominik.mydlil@outlook.com>
not a whole research org like CERN sliding into the contributor list, that's highkey iconic ๐๏ธ๐ moving on:
- Nazar Mishturak
<nazarmx@gmail.com> - Ansh Mittal
<iamAnshMittal@gmail.com> - noabody
<noabody@yahoo.com> - OleFrost
<82263101+olefrost@users.noreply.github.com> - Kenny Parsons
<kennyparsons93@gmail.com> - Jeffrey Tolar
<tolar.jeffrey@gmail.com> - jtagcat
<git-514635f7@jtag.cat> - Tatsuya Noyori
<63089076+public-tatsuya-noyori@users.noreply.github.com> - lewisxy
<lewisxy@users.noreply.github.com> - Nolan Woods
<nolan_w@sfu.ca> - Gautam Kumar
<25435568+gautamajay52@users.noreply.github.com> - Chris Macklin
<chris.macklin@10xgenomics.com> - Antoon Prins
<antoon.prins@surfsara.nl> - Alexey Ivanov
<rbtz@dropbox.com> - Serge Pouliquen
<sp31415@free.fr> - acsfer
<carlos@reendex.com> - Tom
<tom@tom-fitzhenry.me.uk> - Tyson Moore
<tyson@tyson.me> - database64128
<free122448@hotmail.com> - Chris Lu
<chrislusf@users.noreply.github.com>
okay yes jtagcat appears twice with two different emails and honestly? slay, multiple accounts, multiple eras ๐ still rolling:
- Reid Buzby
<reid@rethink.software> - darrenrhs
<darrenrhs@gmail.com> - Florian Penzkofer
<fp@nullptr.de> - Xuanchen Wu
<117010292@link.cuhk.edu.cn> - partev
<petrosyan@gmail.com> - Dmitry Sitnikov
<fo2@inbox.ru> - Haochen Tong
<i@hexchain.org> - Michael Hanselmann
<public@hansmi.ch> - Chuan Zh
<zhchuan7@gmail.com> - Antoine GIRARD
<antoine.girard@sapk.fr> - Justin Winokur (Jwink3101)
<Jwink3101@users.noreply.github.com> - Mariano Absatz (git)
<scm@baby.com.ar> - Greg Sadetsky
<lepetitg@gmail.com> - yedamo
<logindaveye@gmail.com> - hota
<lindwurm.q@gmail.com> - vinibali
<vinibali1@gmail.com> - Ken Enrique Morel
<ken.morel.santana@gmail.com> - Justin Hellings
<justin.hellings@gmail.com> - Parth Shukla
<pparth@pparth.net> - wzl
<wangzl31@outlook.com>
the way this list just keeps going and every line is a real person who fixed a real bug ๐ญ obsessed, fr fr:
- HNGamingUK
<connor@earnshawhome.co.uk> - Jonta
<359397+Jonta@users.noreply.github.com> - YenForYang
<YenForYang@users.noreply.github.com> - SimJoSt / Joda Stรถรer
<git@simjo.st> - Logeshwaran
<waranlogesh@gmail.com> - Rajat Goel
<rajat@dropbox.com> - r0kk3rz
<r0kk3rz@gmail.com> - Matthew Sevey
<mjsevey@gmail.com> - Filip Rysavy
<fil@siasky.net> - Ian Levesque
<ian@ianlevesque.org> - Thomas Stachl
<thomas@stachl.me> - Dmitry Bogatov
<git#v1@kaction.cc> - thomae
<4493560+thomae@users.noreply.github.com> - trevyn
<trevyn-git@protonmail.com> - David Liu
<david.yx.liu@oracle.com> - Chris Nelson
<stuff@cjnaz.com> - Felix Bunemann
<felix.buenemann@gmail.com> - Atรญlio Antรดnio
<atiliodadalto@hotmail.com> - Carlo Mion
<mion00@gmail.com> - Chris Lu
<chris.lu@gmail.com>
yes there's another Chris Lu further up, two Chris Lus, the multiverse is Lu-ing ๐ anyway keep going:
- Vitor Arruda
<vitor.pimenta.arruda@gmail.com> - bbabich
<bbabich@datamossa.com> - David
<dp.davide.palma@gmail.com> - Borna Butkovic
<borna@favicode.net> - Fredric Arklid
<fredric.arklid@consid.se> - Andy Jackson
<Andrew.Jackson@bl.uk> - Sinan Tan
<i@tinytangent.com> - deinferno
<14363193+deinferno@users.noreply.github.com> - rsapkf
<rsapkfff@pm.me> - Will Holtz
<wholtz@gmail.com> - GGG KILLER
<gggkiller2@gmail.com> - Logeshwaran Murugesan
<logeshwaran@testpress.in> - Lu Wang
<coolwanglu@gmail.com> - Bumsu Hyeon
<ksitht@gmail.com> - Shmz Ozggrn
<98463324+ShmzOzggrn@users.noreply.github.com> - Kim
<kim@jotta.no> - Niels van de Weem
<n.van.de.weem@smile.nl> - Koopa
<codingkoopa@gmail.com> - Yunhai Luo
<yunhai-luo@hotmail.com> - Charlie Jiang
<w@chariri.moe>
and another Logeshwaran-adjacent situation up top too, we're collecting them like pokรฉmon ๐ almost there bestie:
- Alain Nussbaumer
<alain.nussbaumer@alleluia.ch> - Vanessasaurus
<814322+vsoch@users.noreply.github.com> - Isaac Levy
<isaac.r.levy@gmail.com> - Gourav T
<workflowautomation@protonmail.com> - Paulo Martins
<paulo.pontes.m@gmail.com> - viveknathani
<viveknathani2402@gmail.com> - Eng Zer Jun
<engzerjun@gmail.com> - Abhiraj
<abhiraj.official15@gmail.com> - Mรกrton Elek
<elek@apache.org><elek@users.noreply.github.com> - Vincent Murphy
<vdm@vdm.ie> - ctrl-q
<34975747+ctrl-q@users.noreply.github.com> - Nil Alexandrov
<nalexand@akamai.com> - GuoXingbin
<101376330+guoxingbin@users.noreply.github.com> - Berkan Teber
<berkan@berkanteber.com> - Tobias Klauser
<tklauser@distanz.ch> - KARBOWSKI Piotr
<piotr.karbowski@gmail.com> - GH
<geeklihui@foxmail.com> - rafma0
<int.main@gmail.com> - Adrien Rey-Jarthon
<jobs@adrienjarthon.com> - Nick Gooding
<73336146+nickgooding@users.noreply.github.com>
okay so we're like, in the home stretch and everyone past this point is also a certified ๐:
- Leroy van Logchem
<lr.vanlogchem@gmail.com> - Zsolt Ero
<zsolt.ero@gmail.com> - Lesmiscore
<nao20010128@gmail.com> - ehsantdy
<ehsan.tadayon@arvancloud.com><ehsantadayon85@gmail.com> - SwazRGB
<65694696+swazrgb@users.noreply.github.com> - Mateusz Puczynski
<mati6095@gmail.com> - Michael C Tiernan - MIT-Research Computing Project
<mtiernan@mit.edu> - Kaspian
<34658474+KaspianDev@users.noreply.github.com> - Werner
<EvilOlaf@users.noreply.github.com> - Hugal31
<hugo.laloge@gmail.com> - Christian Galo
<36752715+cgalo5758@users.noreply.github.com> - Erik van Velzen
<erik@evanv.nl> - Derek Battams
<derek@battams.ca> - Paul
<devnoname120@gmail.com> - SimonLiu
<simonliu009@users.noreply.github.com> - Hugo Laloge
<hla@lescompanions.com> - Mr-Kanister
<68117355+Mr-Kanister@users.noreply.github.com> - Rob Pickerill
<r.pickerill@gmail.com> - Andrey
<to.merge@gmail.com> - Eric Wolf
<19wolf@gmail.com>
two Hugos, two ways, we stan a name that repeats itself ๐ซ final stretch bestie, don't blink:
- Nick
<nick.naumann@mailbox.tu-dresden.de> - Jason Zheng
<jszheng17@gmail.com> - Matthew Vernon
<mvernon@wikimedia.org> - Noah Hsu
<i@nn.ci> - m00594701
<mengpengbo@huawei.com> - Art M. Gallagher
<artmg50@gmail.com> - Sven Gerber
<49589423+svengerber@users.noreply.github.com> - CrossR
<r.cross@lancaster.ac.uk> - Maciej Radzikowski
<maciej@radzikowski.com.pl> - Scott Grimes
<scott.grimes@spaciq.com> - Phil Shackleton
<71221528+philshacks@users.noreply.github.com> - eNV25
<env252525@gmail.com> - Caleb
<inventor96@users.noreply.github.com> - J-P Treen
<jp@wraptious.com>
and that's the whole roll call for this chunk โ every name, every email, nothing skipped, nothing merged, periodt ๐ the way this community just showed up for a file-transfer tool and turned it into a whole phenomenon is genuinely giving "we did it together" energy and I am not okay ๐ญ๐ซถ
...and bestie, the roll call just keeps going ๐ญ this is giving festival lineup energy โ every single one of these gorgeous humans shipped something into rclone, and we're naming every last one. no skips, no "etc", we do not do that here ๐
- Martin Czygan <53705+miku@users.noreply.github.com>
- buda <sandrojijavadze@protonmail.com>
- mirekphd <36706320+mirekphd@users.noreply.github.com>
- vyloy <vyloy@qq.com>
- Anthrazz <25553648+Anthrazz@users.noreply.github.com>
- zzr93 <34027824+zzr93@users.noreply.github.com>
- Paul Norman <penorman@mac.com>
- Lorenzo Maiorfi <maiorfi@gmail.com>
- Claudio Maradonna <penguyman@stronzi.org>
- Ovidiu Victor Tatar <ovi.tatar@googlemail.com>
- Evan Spensley <epspensley@gmail.com>
- Yen Hu <61753151+0x59656e@users.noreply.github.com>
- Steve Kowalik <steven@wedontsleep.org>
- Jordi Gonzalez Muรฑoz <jordigonzm@gmail.com>
- Joram Schrijver <i@joram.io>
- Mark Trolley <marktrolley@gmail.com>
- Joรฃo Henrique Franco <joaohenrique.franco@gmail.com>
- anonion <aman207@users.noreply.github.com>
- Ryan Morey <4590343+rmorey@users.noreply.github.com>
- Simon Bos <simonbos9@gmail.com>
- YFdyh000 <yfdyh000@gmail.com>
- รyvind Heddeland Instefjord <instefjord@outlook.com>
- Dmitry Deniskin <110819396+ddeniskin@users.noreply.github.com>
- Alexander Knorr <106825+opexxx@users.noreply.github.com>
- Richard Bateman <richard@batemansr.us>
- Dimitri Papadopoulos Orfanos <3234522+DimitriPapadopoulos@users.noreply.github.com>
- Lorenzo Milesi <lorenzo.milesi@yetopen.com>
- Isaac Aymerich <isaac.aymerich@gmail.com>
- YanceyChiew <35898533+YanceyChiew@users.noreply.github.com>
- Manoj Ghosh <msays2000@gmail.com>
- Bachue Zhou <bachue.shu@gmail.com>
- Manoj Ghosh <manoj.ghosh@oracle.com>
- Tom Mombourquette <tom@devnode.com>
- Robert Newson <rnewson@apache.org>
- Samuel Johnson <esamueljohnson@gmail.com>
- coultonluke <luke@luke.org.uk>
- Anthony Pessy <anthony@cogniteev.com>
- Philip Harvey <pharvey@battelleecology.org>
- dgouju <dgouju@users.noreply.github.com>
- Clรฉment Notin <clement.notin@gmail.com>
- x3-apptech <66947598+x3-apptech@users.noreply.github.com>
- Arnie97 <arnie97@gmail.com>
- Roel Arents <2691308+roelarents@users.noreply.github.com>
- Aaron Gokaslan <aaronGokaslan@gmail.com>
- techknowlogick <matti@mdranta.net>
- rkettelerij <richard@mindloops.nl>
- Kamui <fin-kamui@pm.me>
- asdffdsazqqq <90116442+asdffdsazqqq@users.noreply.github.com>
- Nathaniel Wesley Filardo <nfilardo@microsoft.com>
- ycdtosa <ycdtosa@users.noreply.github.com>
- Erik Agterdenbos <agterdenbos@users.noreply.github.com>
- Kevin Verstaen <48050031+kverstae@users.noreply.github.com>
- MohammadReza <mrvashian@gmail.com>
- vanplus <60313789+vanplus@users.noreply.github.com>
- Jack <16779171+jkpe@users.noreply.github.com>
- Abdullah Saglam <abdullah.saglam@stonebranch.com>
- Marks Polakovs <github@markspolakovs.me>
- piyushgarg <piyushgarg80@gmail.com>
- Kaloyan Raev <kaloyan-raev@users.noreply.github.com>
- IMTheNachoMan <imthenachoman@gmail.com>
- alankrit <alankrit@google.com>
- Bryan Kaplan <#@bryankaplan.com>
- LXY <767763591@qq.com>
- Simmon Li (he/him) <li.simmon@gmail.com>
- happyxhw <44490504+happyxhw@users.noreply.github.com>
- Simmon Li (he/him) <hello@crespire.dev>
- Matthias Baur <baurmatt@users.noreply.github.com>
- Hunter Wittenborn <hunter@hunterwittenborn.com>
- logopk <peter@kreuser.name>
- Gerard Bosch <30733556+gerardbosch@users.noreply.github.com>
- ToBeFree <github@tfrei.de>
- NodudeWasTaken <75137537+NodudeWasTaken@users.noreply.github.com>
- Peter Brunner <peter@lugoues.net>
- Ninh Pham <dongian.rapclubkhtn@gmail.com>
- Ryan Caezar Itang <sitiom@proton.me>
- Peter Brunner <peter@psykhe.com>
- Leandro Sacchet <leandro.sacchet@animati.com.br>
- dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
- cycneuramus <56681631+cycneuramus@users.noreply.github.com>
- Arnavion <me@arnavion.dev>
- Christopher Merry <christopher.merry@mlb.com>
- Thibault Coupin <thibault.coupin@gmail.com>
- Richard Tweed <RichardoC@users.noreply.github.com>
- Zach Kipp <Zacho2@users.noreply.github.com>
- yuudi <26199752+yuudi@users.noreply.github.com>
- NickIAm <NickIAm@users.noreply.github.com>
- Juang, Yi-Lin <frankyjuang@gmail.com>
- jumbi77 <jumbi77@users.noreply.github.com>
- Aditya Basu <ab.aditya.basu@gmail.com>
- ed <s@ocv.me>
- Drew Parsons <dparsons@emerall.com>
- Joel <joelnb@users.noreply.github.com>
- wiserain <mail275@gmail.com>
- Roel Arents <roel.arents@kadaster.nl>
- Shyim <github@shyim.de>
- Rintze Zelle <78232505+rzelle-lallemand@users.noreply.github.com>
- Damo <damoclark@users.noreply.github.com>
- WeidiDeng <weidi_deng@icloud.com>
- Brian Starkey <stark3y@gmail.com>
- jladbrook <jhladbrook@gmail.com>
- Loren Gordon <lorengordon@users.noreply.github.com>
- dlitster <davidlitster@gmail.com>
- Tobias Gion <tobias@gion.io>
- Jฤnis Bebrฤซtis <janis.bebritis@wunder.io>
- Adam K <github.com@ak.tidy.email>
- Andrei Smirnov <smirnov.captain@gmail.com>
- Janne Hellsten <jjhellst@gmail.com>
- cc <12904584+shvc@users.noreply.github.com>
- Tareq Sharafy <tareq.sha@gmail.com>
- kapitainsky <dariuszb@me.com>
- douchen <playgoobug@gmail.com>
- Sam Lai <70988+slai@users.noreply.github.com>
- URenko <18209292+URenko@users.noreply.github.com>
- Stanislav Gromov <kullfar@gmail.com>
- Paulo Schreiner <paulo.schreiner@delivion.de>
- Mariusz Suchodolski <mariusz@suchodol.ski>
- danielkrajnik <dan94kra@gmail.com>
- Peter Fern <github@0xc0dedbad.com>
- zzq <i@zhangzqs.cn>
- mac-15 <usman.ilamdin@phpstudios.com>
- Sawada Tsunayoshi <34431649+TsunayoshiSawada@users.noreply.github.com>
- Dean Attali <daattali@gmail.com>
- Fjodor42 <molgaard@gmail.com>
- BakaWang <wa11579@hotmail.com>
- Mahad <56235065+Mahad-lab@users.noreply.github.com>
- Vladislav Vorobev <x.miere@gmail.com>
- darix <darix@users.noreply.github.com>
- Benjamin <36415086+bbenjamin-sys@users.noreply.github.com>
- Chun-Hung Tseng <henrybear327@users.noreply.github.com>
- Ricardo D'O. Albanus <rdalbanus@users.noreply.github.com>
- gabriel-suela <gscsuela@gmail.com>
- Tiago Boeing <contato@tiagoboeing.com>
- Edwin Mackenzie-Owen <edwin.mowen@gmail.com>
- Niklas Hambรผchen <mail@nh2.me>
- yuudi <yuudi@users.noreply.github.com>
- Zach <github@prozach.org>
- nielash <31582349+nielash@users.noreply.github.com>
- Julian Lepinski <lepinsk@users.noreply.github.com>
- Raymond Berger <RayBB@users.noreply.github.com>
- Nihaal Sangha <nihaal.git@gmail.com>
- Masamune3210 <1053504+Masamune3210@users.noreply.github.com>
- James Braza <jamesbraza@gmail.com>
- antoinetran <antoinetran@users.noreply.github.com>
- alexia <me@alexia.lol>
- nielash <nielronash@gmail.com>
- Vitor Gomes <vitor.gomes@delivion.de> <mail@vitorgomes.com>
- Jacob Hands <jacob@gogit.io>
- hideo aoyama <100831251+boukendesho@users.noreply.github.com>
- Roberto Ricci <io@r-ricci.it>
- Bjรธrn Smith <bjornsmith@gmail.com>
- Alishan Ladhani <8869764+aladh@users.noreply.github.com>
- zjx20 <zhoujianxiong2@gmail.com>
- Oksana <142890647+oks-maytech@users.noreply.github.com>
- Volodymyr Kit <v.kit@maytech.net>
- David Pedersen <limero@me.com>
- Drew Stinnett <drew@drewlink.com>
- Pat Patterson <pat@backblaze.com>
- Herby Gillot <herby.gillot@gmail.com>
- Nikita Shoshin <shoshin_nikita@fastmail.com>
- rinsuki <428rinsuki+git@gmail.com>
- Beyond Meat <51850644+beyondmeat@users.noreply.github.com>
- Saleh Dindar <salh@fb.com>
- Volodymyr <142890760+vkit-maytech@users.noreply.github.com>
- Gabriel Espinoza <31670639+gspinoza@users.noreply.github.com>
- Keigo Imai <keigo.imai@gmail.com>
- Ivan Yanitra <iyanitra@tesla-consulting.com>
- alfish2000 <alfish2000@gmail.com>
- wuxingzhong <qq330332812@gmail.com>
- Adithya Kumar <akumar42@protonmail.com>
- Tayo-pasedaRJ <138471223+Tayo-pasedaRJ@users.noreply.github.com>
- Peter Kreuser <logo@kreuser.name>
- fotile96 <fotile96@users.noreply.github.com>
- Luc Ritchie <luc.ritchie@gmail.com>
- cynful <cynful@users.noreply.github.com>
- wjielai <wjielai@tencent.com>
- Jack Deng <jackdeng@gmail.com>
- Mikubill <31246794+Mikubill@users.noreply.github.com>
- Artur Neumann <artur@jankaritech.com>
- Saw-jan <saw.jan.grg3e@gmail.com>
- Oksana Zhykina <o.zhykina@maytech.net>
- karan <karan.gupta92@gmail.com>
- viktor <viktor@yakovchuk.net>
- moongdal <moongdal@tutanota.com>
- Mina Galiฤ <freebsd@igalic.co>
- Alen ล iljak <dev@alensiljak.eu.org>
- ไฝ ็ฅ้ๆชๆฅๅ <rkonfj@gmail.com>
- Abhinav Dhiman <8640877+ahnv@users.noreply.github.com>
- halms <7513146+halms@users.noreply.github.com>
- ben-ba <benjamin.brauner@gmx.de>
- Eli Orzitzer <e_orz@yahoo.com>
- Anthony Metzidis <anthony.metzidis@gmail.com>
- keongalvin <keongalvin@gmail.com>
- rarspace01 <rarspace01@users.noreply.github.com>
- Paul Stern <paulstern45@gmail.com>
- Nikhil Ahuja <nikhilahuja@live.com>
- Harshit Budhraja <52413945+harshit-budhraja@users.noreply.github.com>
- Tera <24725862+teraa@users.noreply.github.com>
- Kyle Reynolds <kylereynoldsdev@gmail.com>
- Michael Eischer <michael.eischer@gmx.de>
- Thomas Mรผller <1005065+DeepDiver1975@users.noreply.github.com>
- DanielEgbers <27849724+DanielEgbers@users.noreply.github.com>
- Jack Provance <49460795+njprov@users.noreply.github.com>
- Gabriel Ramos <109390599+gabrielramos02@users.noreply.github.com>
- Dan McArdle <d@nmcardle.com>
- Joe Cai <joe.cai@bigcommerce.com>
- Anders Swanson <anders.swanson@oracle.com>
- huajin tong <137764712+thirdkeyword@users.noreply.github.com>
- John-Paul Smith <john-paulsmith@users.noreply.github.com>
- racerole <148756161+racerole@users.noreply.github.com>
- Gachoud Philippe <ph.gachoud@gmail.com>
- YukiUnHappy <saberhana@yandex.com>
- Kyle Reynolds <kyle.reynolds@bridgerphotonics.com>
- Lewis Hook <lewis@hook.im>
- hoyho <luohaihao@gmail.com>
- Vitaly <9034218+gvitali@users.noreply.github.com>
- iotmaestro <iotmaestro@proton.me>
- psychopatt <66741203+psychopatt@users.noreply.github.com>
- Alex Garel <alex@garel.org>
- Warrentheo <warrentheo@hotmail.com>
- Alexandre Lavigne <lavigne958@gmail.com>
not me tearing up at a contributor list ๐ฅน every one of those handles is a real person who opened a PR, squashed a bug, or explained something in an issue so the rest of us could stop suffering. icons only, no notes.
and bestieโฆ we are not done yet, hold on ๐
okay so the contributor roll call is still going and bestie, it's giving every single one of these people helped make rclone the icon it is ๐ no cap, every name here is a real one, so here we go โ
- ๐ฆ
yoelvini <134453420+yoelvini@users.noreply.github.com> - โจ
Erisa A <erisa@cloudflare.com> - ๐
Pieter van Oostrum <pieter@vanoostrum.org> - ๐
jakzoe <155812065+jakzoe@users.noreply.github.com> - ๐ธ
guangwu <guoguangwu@magic-shield.com> - ๐
static-moonlight <107991124+static-moonlight@users.noreply.github.com> - ๐ซถ
yudrywet <yudeyao@yeah.net> - ๐ญ
Butanediol <git@xnh.app> - ๐ฅ
Dave Nicolson <david.nicolson@gmail.com> - ๐
Katia Esposito <katia@linux.com> - ๐
pawsey-kbuckley <36438302+pawsey-kbuckley@users.noreply.github.com> - โญ
hidewrong <167099254+hidewrong@users.noreply.github.com> - ๐
Michael Terry <mike@mterry.name> - ๐
Sunny <25066078+LoSunny@users.noreply.github.com> - ๐
overallteach <cricis@foxmail.com> - ๐ง
JT Olio <jt@olio.lol> - ๐
Evan McBeth <64177332+AtomicRobotMan0101@users.noreply.github.com> - ๐
Dominik Joe Pantลฏฤek <dominik.pantucek@trustica.cz> - โจ
yumeiyin <155420652+yumeiyin@users.noreply.github.com> - ๐
Bruno Fernandes <54373093+folkzb@users.noreply.github.com> - ๐ฆ
Thomas Schneider <tspam.github@brainfuck.space> - ๐ธ
Charles Hamilton <52973156+chamilton-ccn@users.noreply.github.com> - ๐
Tomasz Melcer <tomasz@melcer.pl> - ๐ซถ
Michaล Dzienisiewicz <michal.piotr.dz@gmail.com> - ๐ญ
Florian Klink <flokli@flokli.de> - ๐ฅ
Bill Fraser <bill@wfraser.dev> - ๐
Thearas <thearas850@gmail.com> - ๐
Filipe Herculano <fifo_@live.com> - โญ
Russ Bubley <russ.bubley@googlemail.com> - ๐
Paul Collins <paul.collins@canonical.com> - ๐
Tomasz Melcer <liori@exroot.org> - ๐
itsHenry <2671230065@qq.com> - ๐ง
Ke Wang <me@ke.wang> - ๐
AThePeanut4 <49614525+AThePeanut4@users.noreply.github.com> - ๐
Tobias Markus <tobbi.bugs@googlemail.com> - โจ
Ernie Hershey <github@ernie.org> - ๐
Will Miles <wmiles@sgl.com> - ๐ฆ
David Seifert <16636962+SoapGentoo@users.noreply.github.com> - ๐ธ
Fornax <wimbrand96@gmail.com> - ๐
Sam Harrison <sam.harrison@files.com> - ๐ซถ
Pรฉter Bozsรณ <3806723+peterbozso@users.noreply.github.com> - ๐ญ
Georg Welzel <gwelzel@mailbox.org> - ๐ฅ
John Oxley <john.oxley@gmail.com> <joxley@meta.com> - ๐
Pawel Palucha <pawel.palucha@aetion.com> - ๐
crystalstall <crystalruby@qq.com> - โญ
nipil <nipil@users.noreply.github.com> - ๐
yuval-cloudinary <46710068+yuval-cloudinary@users.noreply.github.com> - ๐
Mathieu Moreau <mrx23dot@users.noreply.github.com> - ๐
fsantagostinobietti <6057026+fsantagostinobietti@users.noreply.github.com> - ๐ง
Oleg Kunitsyn <114359669+hiddenmarten@users.noreply.github.com> - ๐
Divyam <47589864+divyam234@users.noreply.github.com> - ๐
ttionya <ttionya@users.noreply.github.com> - โจ
quiescens <quiescens@gmail.com> - ๐
rishi.sridhar <rishi.sridhar@zohocorp.com> - ๐ฆ
Lawrence Murray <lawrence@indii.org> - ๐ธ
Leandro Piccilli <leandro.piccilli@thalesgroup.com> - ๐
Benjamin Legrand <benjamin.legrand@seagate.com> - ๐ซถ
Noam Ross <noam.ross@gmail.com> - ๐ญ
lostb1t <coding-mosses0z@icloud.com> - ๐ฅ
Matthias Gatto <matthias.gatto@outscale.com> - ๐
Andrรฉ Tran <andre.tran@outscale.com> - ๐
Simon Bos <simon@simonbos.be> - โญ
Alexandre Hamez <199517+ahamez@users.noreply.github.com> - ๐
Randy Bush <randy@psg.com> - ๐
Diego Monti <diegmonti@users.noreply.github.com> - ๐
tgfisher <tgfisher@stanford.edu> - ๐ง
Moises Lima <mozlima@gmail.com> - ๐
Dimitar Ivanov <mimiteto@gmail.com> - ๐
shenpengfeng <xinhangzhou@icloud.com> - โจ
Dimitrios Slamaris <dim0x69@users.noreply.github.com> - ๐
vintagefuture <39503528+vintagefuture@users.noreply.github.com> - ๐ฆ
David Seifert <soap@gentoo.org> - ๐ธ
Michael R. Davis <mrdvt92@users.noreply.github.com> - ๐
remygrandin <remy.gr@ndin.fr> - ๐ซถ
Ilias Ozgur Can Leonard <iscilyas@gmail.com> - ๐ญ
divinity76 <divinity76@gmail.com> - ๐ฅ
Martin Hassack <martin@redmaple.tech> - ๐
Filipe Azevedo <pasnox@gmail.com> - ๐
hayden.pan <hayden.pan@outlook.com> - โญ
Yxxx <45665172+marsjane@users.noreply.github.com> - ๐
Thomas ten Cate <ttencate@gmail.com> - ๐
Louis Laureys <louis@laureys.me> - ๐
Henry Lee <contact@nynxz.com> - ๐ง
ToM <thomas.faucher@bibliosansfrontieres.org> - ๐
TAKEI Yuya <853320+takei-yuya@users.noreply.github.com> - ๐
Francesco Frassinelli <fraph24@gmail.com> <francesco.frassinelli@nina.no> - โจ
Matt Ickstadt <mattico8@gmail.com> <matt@beckenterprises.com> - ๐
Spencer McCullough <mccullough.spencer@gmail.com> - ๐ฆ
Jonathan Giannuzzi <jonathan@giannuzzi.me> - ๐ธ
Christoph Berger <github@christophberger.com> - ๐
Tim White <tim.white@su.org.au> - ๐ซถ
Robin Schneider <robin.schneider@stackit.cloud> - ๐ญ
izouxv <izouxv@users.noreply.github.com> - ๐ฅ
Moises Lima <mozlima@users.noreply.github.com> - ๐
Bruno Fernandes <bruno.fernandes1996@hotmail.com> - ๐
Corentin Barreau <corentin@archive.org> - โญ
hiddenmarten <hiddenmarten@gmail.com> - ๐
Trevor Starick <trevor.starick@gmail.com> - ๐
b-wimmer <132347192+b-wimmer@users.noreply.github.com> - ๐
Jess <jess@jessie.cafe> - ๐ง
Zachary Vorhies <zachvorhies@protonmail.com> - ๐
Alexander Minbaev <minbaev@gmail.com> - ๐
Joel K Biju <joelkbiju18@gmail.com> - โจ
ll3006 <doublel3006@gmail.com> - ๐
jbagwell-akamai <113531113+jbagwell-akamai@users.noreply.github.com> - ๐ฆ
Michael Kebe <michael.kebe@gmail.com> - ๐ธ
Lorenz Brun <lorenz@brun.one> - ๐
Dave Vasilevsky <djvasi@gmail.com> <dave@vasilevsky.ca> - ๐ซถ
luzpaz <luzpaz@users.noreply.github.com> - ๐ญ
jack <9480542+jackusm@users.noreply.github.com> - ๐ฅ
Jรถrn Friedrich Dreyer <jfd@butonic.de> - ๐
alingse <alingse@foxmail.com> - ๐
Fernando Fernรกndez <ferferga@hotmail.com> - โญ
eccoisle <167755281+eccoisle@users.noreply.github.com> - ๐
Klaas Freitag <kraft@freisturz.de> - ๐
Danny Garside <dannygarside@outlook.com> - ๐
Samantha Bowen <sam@bbowen.net> - ๐ง
simonmcnair <101189766+simonmcnair@users.noreply.github.com> - ๐
huanghaojun <jasen.huang@ugreen.com> - ๐
Enduriel <endur1el@protonmail.com> - โจ
Markus Gerstel <markus.gerstel@osirium.com> - ๐
simwai <16225108+simwai@users.noreply.github.com> - ๐ฆ
Ben Alex <ben.alex@acegi.com.au> - ๐ธ
Klaas Freitag <opensource@freisturz.de> <klaas.freitag@kiteworks.com> - ๐
Andrew Kreimer <algonell@gmail.com> - ๐ซถ
Ed Craig-Wood <138211970+edc-w@users.noreply.github.com> - ๐ญ
Christian Richter <crichter@owncloud.com> <1058116+dragonchaser@users.noreply.github.com> - ๐ฅ
Ralf Haferkamp <r.haferkamp@opencloud.eu> - ๐
Jugal Kishore <me@devjugal.com> - ๐
Tho Neyugn <nguyentruongtho@users.noreply.github.com> - โญ
Ben Boeckel <mathstuf@users.noreply.github.com> - ๐
Clรฉment Wehrung <cwehrung@nurves.com> - ๐
Jeff Geerling <geerlingguy@mac.com> - ๐
Germรกn Casares <german.casares.march+github@gmail.com> - ๐ง
fhuber <florian.huber@noris.de> - ๐
wbulot <wbulot@hotmail.com> - ๐
Jeremy Daer <jeremydaer@gmail.com> - โจ
Oleksiy Stashok <ostashok@tesla.com> - ๐
PrathameshLakawade <prathameshlakawade@gmail.com> - ๐ฆ
Nathanael Demacon <7271496+quantumsheep@users.noreply.github.com> - ๐ธ
ahxxm <ahxxm@users.noreply.github.com> - ๐
Flora Thiebaut <johann.thiebaut@gmail.com> - ๐ซถ
kingston125 <support@filelu.com> <kingston125@github.com> - ๐ญ
Ser-Bul <30335009+Ser-Bul@users.noreply.github.com> - ๐ฅ
jinjingroad <jinjingroad@sina.com> - ๐
necaran <55765083+necaran@users.noreply.github.com> - ๐
Marvin Rรถsch <marvinroesch99@gmail.com> - โญ
curlwget <curlwget@icloud.com> - ๐
$@M@RTH_ <165886349+Samarth1015@users.noreply.github.com> - ๐
Ali Zein Yousuf <azy5030@gmail.com> - ๐
Davide Bizzarri <davide.bizzarri@willhaben.at> - ๐ง
Ross Smith II <ross@smithii.com> - ๐
Vikas Bhansali <64532198+vibhansa-msft@users.noreply.github.com> - ๐
Sudipto Baral <sudiptobaral.me@gmail.com> - โจ
Sam Pegg <samrpegg@gmail.com> <70067376+S-Pegg1@users.noreply.github.com> - ๐
liubingrun <liubr1@chinatelecom.cn> - ๐ฆ
Albin Parou <fumesover@gmail.com> - ๐ธ
n4n5 <56606507+Its-Just-Nans@users.noreply.github.com> - ๐
Florent Vennetier <florent.vennetier@ovhcloud.com> - ๐ซถ
houance <45840516+houance@users.noreply.github.com> - ๐ญ
Yu Xin <3188+is@users.noreply.github.com> - ๐ฅ
Antonin Goude <antonin.goude@ovhcloud.com> - ๐
Timothy Jacobs <timothy@ironbounddesigns.com> - ๐
praveen-solanki-oracle <praveen.solanki@oracle.com> - โญ
huangnauh <huanglibo2010@gmail.com> - ๐
Lucas Bremgartner <breml@users.noreply.github.com> - ๐
Binbin Qian <qianbinbin@hotmail.com> - ๐
cui <523516579@qq.com> - ๐ง
Tilman Vogel <tilman.vogel@web.de> - ๐
skbeh <60107333+skbeh@users.noreply.github.com> - ๐
Claudius Ellsel <claudius.ellsel@live.de> - โจ
Motte <37443982+dmotte@users.noreply.github.com> - ๐
dougal <dougal.craigwood@gmail.com> <147946567+roucc@users.noreply.github.com> - ๐ฆ
anon-pradip <pradipsubedi360@gmail.com> - ๐ธ
Robin Rolf <imer@imer.cc> - ๐
Jean-Christophe Cura <jcaspes@gmail.com> - ๐ซถ
russcoss <russcoss@outlook.com> - ๐ญ
Matt LaPaglia <mlapaglia@gmail.com> - ๐ฅ
Youfu Zhang <1315097+zhangyoufu@users.noreply.github.com> - ๐
juejinyuxitu <juejinyuxitu@outlook.com> - ๐
iTrooz <hey@itrooz.fr> - โญ
Microscotch <github.com@microscotch.net> - ๐
Andrew Ruthven <andrew@etc.gen.nz> - ๐
spiffytech <git@spiffy.tech> - ๐
Dulani Woods <Dulani@gmail.com> - ๐ง
Marco Ferretti <mferretti93@gmail.com> - ๐
hunshcn <hunsh.cn@gmail.com> - ๐
vastonus <vastonus@outlook.com> - โจ
Oleksandr Redko <oleksandr.red+github@gmail.com> - ๐
reddaisyy <reddaisy@outlook.jp> - ๐ฆ
viocha <viocha@qq.com> - ๐ธ
Aneesh Agrawal <aneesh@anthropic.com> - ๐
divinity76 <hans@loltek.net> - ๐ซถ
Andrew Gunnerson <accounts+github@chiller3.com> - ๐ญ
Lakshmi-Surekha <Lakshmi.Kovvuri@ibm.com> - ๐ฅ
dulanting <dulanting@outlook.jp> - ๐
Adam Dinwoodie <me-and@users.noreply.github.com> - ๐
Lukas Krejci <metlos@users.noreply.github.com> - โญ
Riaz Arbi <riazarbi@users.noreply.github.com> - ๐
Fawzib Rojas <fawzib.rojas@gmail.com> - ๐
fries1234 <fries1234@protonmail.com> - ๐
Joseph Brownlee <39440458+JellyJoe198@users.noreply.github.com> - ๐ง
Ted Robertson <10043369+tredondo@users.noreply.github.com> - ๐
SublimePeace <184005903+SublimePeace@users.noreply.github.com> - ๐
Copilot <198982749+Copilot@users.noreply.github.com> - โจ
Alex <64072843+A1ex3@users.noreply.github.com> - ๐
n4n5 <its.just.n4n5@gmail.com> - ๐ฆ
aliaj1 <ali19961@gmail.com> - ๐ธ
Sean Turner <30396892+seanturner026@users.noreply.github.com> - ๐
jijamik <30904953+jijamik@users.noreply.github.com> - ๐ซถ
Dominik Sander <git@dsander.de> - ๐ญ
Nikolay Kiryanov <nikolay@kiryanov.ru> - ๐ฅ
Diana <5275194+DianaNites@users.noreply.github.com> - ๐
Duncan Smart <duncan.smart@gmail.com> - ๐
vicerace <vicerace@sohu.com>
and bestie, the list literally keeps going in the next part, so don't you dare close the tab ๐๐
- Cliff Frey
<cliff@openai.com> - Vladislav Tropnikov
<vtr.name@gmail.com> - Leo
<i@hardrain980.com> - Johannes Rothe
<mail@johannes-rothe.de> - Tingsong Xu
<tingsong.xu@rightcapital.com> - Jonas Tingeborn
<134889+jojje@users.noreply.github.com> - jhasse-shade
<jacob@shade.inc> - vyv03354
<VYV03354@nifty.ne.jp> - masrlinu
<masrlinu@users.noreply.github.com><5259918+masrlinu@users.noreply.github.com> - vupn0712
<126212736+vupn0712@users.noreply.github.com> - darkdragon-001
<darkdragon-001@users.noreply.github.com> - sys6101
<csvmen@gmail.com> - Nicolas Dessart
<nds@outsight.tech> - Qingwei Li
<332664203@qq.com> - yy
<yhymmt37@gmail.com> - Marc-Philip
<marc-philip.werner@sap.com> - Mikel Olasagasti Uranga
<mikel@olasagasti.info> - Nick Owens
<mischief@offblast.org> - hyusap
<paulayush@gmail.com> - jzunigax2
<125698953+jzunigax2@users.noreply.github.com> - lullius
<lullius@users.noreply.github.com> - StarHack
<StarHack@users.noreply.github.com> - Leon Brocard
<acme@astray.com> - Cohinem
<143964778+Cohinem@users.noreply.github.com> - Jack Kelly
<jack@OpenClimateFix.org> - Prakhar Chhalotre
<chhalotreprakhar00@gmail.com> - Varun Chawla
<34209028+veeceey@users.noreply.github.com> - Jan-Philipp Reรler
<75355263+TabError@users.noreply.github.com> - Shlomi Avihou
<shlomi@zadarastorage.com> - Chris
<238498929+chris081519-crypto@users.noreply.github.com> - Jan-Philipp Reรler
<xodarap@xodarap.de> - Dark Dragon
<darkdragon-001@web.de> - Leon Brocard
<lbrocard@fastly.com> - a1pcm
<a1pcm@users.noreply.github.com> - FTCHD
<144691102+FTCHD@users.noreply.github.com> - Bjoern Franke
<bjo+git@schafweide.org> - hxnd
<callmehxnd@outlook.de> - Adam Kasztenny
<adamkasztenny@gmail.com> - Romฤns Potaลกovs
<justgook@gmail.com> - Brian Bockelman
<bbockelman@morgridge.org> - Bjoern Franke
<bjo@schafweide.org> - razorloves
<razorloves@gmail.com> - Duncan F
<131309315+duncanaf@users.noreply.github.com> - Billy Hughes
<w.g.h.hughes@gmail.com> - Bhagyashreek8
<57988406+Bhagyashreek8@users.noreply.github.com> - Andriy Senyshyn
<135705861+sam-mt@users.noreply.github.com> - Andrew Furman
<7343697+furmandev@users.noreply.github.com> - ZRHan
<56144550+ZRHann@users.noreply.github.com> - Jason
<jasonbabo@gmail.com> - Patrick Farrell
<pfarrell@whamcloud.com> - BizaNator
<17164422+BizaNator@users.noreply.github.com> - lif
<1835304752@qq.com> - jinkeyuu
<44105232+jinkeyuu@users.noreply.github.com> - jinyu.han
<jinyu.han@ucloud.cn> - Claude Opus 4.6
<noreply@anthropic.com> - Andriy Senyshyn
<andriy.senyshyn@kiteworks.com> - Mike GIllan
<mike.gillan@gmail.com> - Xiangzhe
<xiangzhedev@gmail.com> - Suyun
<suyun@aosc.io> - TheBabu
<ariq.haqq@gmail.com> - Brais Couce
<braiscouce@gmail.com> - Mozi
<29089388+pzhlkj6612@users.noreply.github.com> - SyoBoN
<syobon@syobon.net> - Jan Heylen
<heyleke@gmail.com> - tdawe
<90407556+tdawe1@users.noreply.github.com> - Anton Bordwine
<54022438+antonchuvashow@users.noreply.github.com> - mathieulongtin
<617359+mathieulongtin@users.noreply.github.com> - Luke Cyca
<me@lukecyca.com> - dlaumen
<262192488+dlaumen@users.noreply.github.com> - Yakov Till
<37628546+Lyapsus@users.noreply.github.com> - Chris Coughlan
<chris@coughlan.io> - John Volk
<volkjohn@users.noreply.github.com> - ็ไธ่ตซ
<wyihe5220@gmail.com> - Gustavo V. F.
<31892323+Gustavo-V-F@users.noreply.github.com> - Sven Rebhan
<36194019+srebhan@users.noreply.github.com> - Copilot
<223556219+Copilot@users.noreply.github.com> - KTibow
<KTibow@users.noreply.github.com> - kkocdko
<31189892+kkocdko@users.noreply.github.com> - Tim Schumacher
<tim@tschumacher.net> - ferrumclaudepilgrim
<ferrumclaudepilgrim@users.noreply.github.com> - Alvinwylim
<31592545+Alvinwylim@users.noreply.github.com> - Tore Anderson
<tore@fud.no> - Sai Asish Y
<say.apm35@gmail.com> - Lucky945H
<1355363613@qq.com> - William Tange
<github@tan.ge> - TaterLi
<admin@lijingquan.net> - KyokoMiki
<161209740+kyokomiki@users.noreply.github.com> - Iizuki
<36295229+Iizuki@users.noreply.github.com> - tomholford
<16504501+tomholford@users.noreply.github.com><tomholford@users.noreply.github.com> - caltechustc
<caltechustc@outlook.com> - Valerij Fredriksen
<freva@users.noreply.github.com> - Hakan ฤฐSMAฤฐL
<93117749+Hakanbaban53@users.noreply.github.com> - Brian King
<BrianDKing@gmail.com> - Puneet Dixit
<puneetdixit4321@gmail.com> - Yakov Till
<yakov.till@gmail.com> - Janne Beate Bakeng
<436265+jbbakeng@users.noreply.github.com> - IceLocke
<lockeice@gmail.com> - nako-ruru
<nako_ruru@163.com> - bright
<nako_ruru@sina.com> - Filippo
<57143294+FilippoMuschera@users.noreply.github.com> - Gaurav
<amvermagaurav007@gmail.com> - Yuhang Cao
<caoyuhang@fwerkor.com> - Yash Anil
<yashanil98@gmail.com> - yashanil98
<79158725+yashanil98@users.noreply.github.com> - lewoberst
<github@jan-o-sch.net> - max
<max@example.com> - Bryan Stenson
<bryan.stenson@gmail.com> - happysnaker
<73147033+happysnaker@users.noreply.github.com> - Jan Schlien
<rclone-github@jan-o-sch.net> - user77
<abubakarm@gmail.com> - maximilize
<3752128+maximilize@users.noreply.github.com> - dithwick
<46924962+dithwick@users.noreply.github.com> - Sandy Luppino
<s.luppino@opendrives.com> - Sanjays2402
<51058514+Sanjays2402@users.noreply.github.com> - blackflytech
<blackflytech@outlook.com> - Amit Mishra
<amit.mishra.eee21@itbhu.ac.in> - Erol Ozcan
<erol.ozcan@gmail.com> - TowyTowy
<towy@airreps.link> - 0rangeSeaW0lf
<0sw-8m4k2v@waku.li> - sijie-Z
<sijie-zhou@users.noreply.github.com> - Sรธren Lindberg
<deeferentleeg@gmail.com> - Kyue
<Gooh456@users.noreply.github.com> - Giridhar
<80974392+giri256@users.noreply.github.com> - p1
<giridharpavan593@gmail.com> - Zero Services GmbH
<info@zeroservices.eu> - Noah Zalev
<github@nzalev.ca> - Acts1631
<69813585+acts-1631@users.noreply.github.com> - ifloppy
<68799904+ifloppy@users.noreply.github.com> - Dzmitry Nianakhau
<dzmitry.nianakhau@scality.com> - Anupam Mediratta
<mediratta@gmail.com> - Socialpranker
<273312799+Socialpranker@users.noreply.github.com> - phatlc
<phatle.hsd@gmail.com> - Punya Jain
<4511945+punya10@users.noreply.github.com>
okay and that's literally the whole credits roll bestie ๐ญโจ every single one of them showed up, did the thing, and left their name in the history books. iconic behavior only. slay ๐
๐ Contact the rclone project ๐
๐ธ Forum
Forum for questions and general discussion:
๐ผ Business support
For business support or sponsorship enquiries please see:
- <https://rclone.com/>
<sponsorship@rclone.com>
๐ GitHub repository
The project's repository is located at:
There you can file bug reports or contribute with pull requests. yes bestie, your random 3am bug report is welcome here ๐ซถ
๐ฆ Twitter
You can also follow Nick on twitter for rclone announcements:
- @njcw (<https://twitter.com/njcw>)
๐ง Email
Or if all else fails or you want to ask something private or confidential
<info@rclone.com>
Please don't email requests for help to this address - those are better directed to the forum unless you'd like to sign up for business support.
๐ AUTHORS ๐
Nick Craig-Wood. ๐
that's it. that's the author. one (1) legend, no cap. ๐
and that's a wrap on this whole entire manual, bestie ๐ฆ this was User Manual, dated Oct 09, 2026, brought to you as rclone(1). go forth and rclone something gorgeous ๐โจ๐
๐ฆ where this page comes from
- alpine 3.24: rclone-doc 1.75.2-r0 ยท MIT
- arch rolling: rclone 1.75.2-1 ยท MIT
- epel 10: rclone 1.75.2-1.el10_3 ยท 0BSD AND Apache-2.0 AND BSD-2-Clause AND BSD-3-Clause AND ISC AND LGPL-3.0-only AND MIT AND MPL-2.0 AND (Apache-2.0 OR MIT)
- epel 9: rclone 1.75.2-2.el9 ยท 0BSD AND Apache-2.0 AND BSD-2-Clause AND BSD-3-Clause AND ISC AND LGPL-3.0-only AND MIT AND MPL-2.0 AND (Apache-2.0 OR MIT)
- fedora 44: rclone 1.75.2-2.fc44 ยท 0BSD AND Apache-2.0 AND BSD-2-Clause AND BSD-3-Clause AND ISC AND LGPL-3.0-only AND MIT AND MPL-2.0 AND (Apache-2.0 OR MIT)
- nixpkgs unstable: rclone 1.75.2
- ๐ girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms