mirror of
https://github.com/rclone/rclone.git
synced 2026-02-18 10:23:31 +00:00
Compare commits
61 Commits
fix-http-s
...
v1.52-stab
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
729799af7c | ||
|
|
029f817ebc | ||
|
|
073e996cc2 | ||
|
|
fb2a4edd6f | ||
|
|
f949856170 | ||
|
|
c0e9584403 | ||
|
|
ace56b6e0f | ||
|
|
1d45c6eaaa | ||
|
|
e8222bbc95 | ||
|
|
815643264b | ||
|
|
4f8472664f | ||
|
|
3278b297cf | ||
|
|
5c0af62d0a | ||
|
|
6760ab6bb3 | ||
|
|
a9ffa1178c | ||
|
|
687865f760 | ||
|
|
d745bc1baa | ||
|
|
1f279f0419 | ||
|
|
d805e63f7d | ||
|
|
d8144a7e84 | ||
|
|
21f5b1076f | ||
|
|
a8cee91929 | ||
|
|
14edaefaa3 | ||
|
|
946b73c5fe | ||
|
|
07f7854a25 | ||
|
|
dfc7393e9c | ||
|
|
7f50143805 | ||
|
|
37308832b1 | ||
|
|
d5d124c9ee | ||
|
|
8b1f737271 | ||
|
|
ed013228ea | ||
|
|
a9b7974196 | ||
|
|
38453bd8ff | ||
|
|
51ba73afe4 | ||
|
|
b782a15f17 | ||
|
|
1d2edf0789 | ||
|
|
8367261a93 | ||
|
|
31dc78905e | ||
|
|
f9493ff1db | ||
|
|
a5cf531b94 | ||
|
|
04d59fe6bd | ||
|
|
cbc448039d | ||
|
|
7a8ade4949 | ||
|
|
8ab6e2bd1f | ||
|
|
d5c5811a54 | ||
|
|
43d21b7e64 | ||
|
|
0501b12e17 | ||
|
|
723c1dfdc5 | ||
|
|
d6894408b9 | ||
|
|
ac0e831090 | ||
|
|
b93ed77495 | ||
|
|
d0a3c40f9a | ||
|
|
6a9a571d87 | ||
|
|
6b68d1f79a | ||
|
|
088756ff8a | ||
|
|
4c1ffcc36d | ||
|
|
e5bd3f1c26 | ||
|
|
e03b4e2ce9 | ||
|
|
6054476c9c | ||
|
|
6cd8d3c4a0 | ||
|
|
78b0329928 |
2
.github/workflows/build.yml
vendored
2
.github/workflows/build.yml
vendored
@@ -227,7 +227,7 @@ jobs:
|
|||||||
- name: Cross-compile rclone
|
- name: Cross-compile rclone
|
||||||
run: |
|
run: |
|
||||||
docker pull billziss/xgo-cgofuse
|
docker pull billziss/xgo-cgofuse
|
||||||
go get -v github.com/karalabe/xgo
|
GO111MODULE=off go get -v github.com/karalabe/xgo # don't add to go.mod
|
||||||
xgo \
|
xgo \
|
||||||
-image=billziss/xgo-cgofuse \
|
-image=billziss/xgo-cgofuse \
|
||||||
-targets=darwin/386,darwin/amd64,linux/386,linux/amd64,windows/386,windows/amd64 \
|
-targets=darwin/386,darwin/amd64,linux/386,linux/amd64,windows/386,windows/amd64 \
|
||||||
|
|||||||
25
.github/workflows/build_publish_docker_image.yml
vendored
Normal file
25
.github/workflows/build_publish_docker_image.yml
vendored
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
name: Docker beta build
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
name: Build image job
|
||||||
|
steps:
|
||||||
|
- name: Checkout master
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- name: Build and publish image
|
||||||
|
uses: ilteoood/docker_buildx@439099796bfc03dd9cedeb72a0c7cb92be5cc92c
|
||||||
|
with:
|
||||||
|
tag: beta
|
||||||
|
imageName: rclone/rclone
|
||||||
|
platform: linux/amd64,linux/386,linux/arm64,linux/arm/v7
|
||||||
|
publish: true
|
||||||
|
dockerHubUser: ${{ secrets.DOCKER_HUB_USER }}
|
||||||
|
dockerHubPassword: ${{ secrets.DOCKER_HUB_PASSWORD }}
|
||||||
33
.github/workflows/build_publish_release_docker_image.yml
vendored
Normal file
33
.github/workflows/build_publish_release_docker_image.yml
vendored
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
name: Docker release build
|
||||||
|
|
||||||
|
on:
|
||||||
|
release:
|
||||||
|
types: [published]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
name: Build image job
|
||||||
|
steps:
|
||||||
|
- name: Checkout master
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- name: Get actual patch version
|
||||||
|
id: actual_patch_version
|
||||||
|
run: echo ::set-output name=ACTUAL_PATCH_VERSION::$(echo $GITHUB_REF | cut -d / -f 3 | sed 's/v//g')
|
||||||
|
- name: Get actual minor version
|
||||||
|
id: actual_minor_version
|
||||||
|
run: echo ::set-output name=ACTUAL_MINOR_VERSION::$(echo $GITHUB_REF | cut -d / -f 3 | sed 's/v//g' | cut -d "." -f 1,2)
|
||||||
|
- name: Get actual major version
|
||||||
|
id: actual_major_version
|
||||||
|
run: echo ::set-output name=ACTUAL_MAJOR_VERSION::$(echo $GITHUB_REF | cut -d / -f 3 | sed 's/v//g' | cut -d "." -f 1)
|
||||||
|
- name: Build and publish image
|
||||||
|
uses: ilteoood/docker_buildx@439099796bfc03dd9cedeb72a0c7cb92be5cc92c
|
||||||
|
with:
|
||||||
|
tag: latest,${{ steps.actual_patch_version.outputs.ACTUAL_PATCH_VERSION }},${{ steps.actual_minor_version.outputs.ACTUAL_MINOR_VERSION }},${{ steps.actual_major_version.outputs.ACTUAL_MAJOR_VERSION }}
|
||||||
|
imageName: rclone/rclone
|
||||||
|
platform: linux/amd64,linux/386,linux/arm64,linux/arm/v7
|
||||||
|
publish: true
|
||||||
|
dockerHubUser: ${{ secrets.DOCKER_HUB_USER }}
|
||||||
|
dockerHubPassword: ${{ secrets.DOCKER_HUB_PASSWORD }}
|
||||||
@@ -3,7 +3,6 @@ FROM golang AS builder
|
|||||||
COPY . /go/src/github.com/rclone/rclone/
|
COPY . /go/src/github.com/rclone/rclone/
|
||||||
WORKDIR /go/src/github.com/rclone/rclone/
|
WORKDIR /go/src/github.com/rclone/rclone/
|
||||||
|
|
||||||
RUN make quicktest
|
|
||||||
RUN \
|
RUN \
|
||||||
CGO_ENABLED=0 \
|
CGO_ENABLED=0 \
|
||||||
make
|
make
|
||||||
@@ -12,7 +11,8 @@ RUN ./rclone version
|
|||||||
# Begin final image
|
# Begin final image
|
||||||
FROM alpine:latest
|
FROM alpine:latest
|
||||||
|
|
||||||
RUN apk --no-cache add ca-certificates fuse
|
RUN apk --no-cache add ca-certificates fuse tzdata && \
|
||||||
|
echo "user_allow_other" >> /etc/fuse.conf
|
||||||
|
|
||||||
COPY --from=builder /go/src/github.com/rclone/rclone/rclone /usr/local/bin/
|
COPY --from=builder /go/src/github.com/rclone/rclone/rclone /usr/local/bin/
|
||||||
|
|
||||||
|
|||||||
3877
MANUAL.html
generated
3877
MANUAL.html
generated
File diff suppressed because it is too large
Load Diff
246
MANUAL.md
generated
246
MANUAL.md
generated
@@ -1,15 +1,15 @@
|
|||||||
% rclone(1) User Manual
|
% rclone(1) User Manual
|
||||||
% Nick Craig-Wood
|
% Nick Craig-Wood
|
||||||
% May 27, 2020
|
% Aug 07, 2020
|
||||||
|
|
||||||
# Rclone syncs your files to cloud storage
|
# Rclone syncs your files to cloud storage
|
||||||
|
|
||||||
<img width="50%" src="https://rclone.org/img/logo_on_light__horizontal_color.svg" alt="rclone logo" style="float:right; padding: 5px;" >
|
<img width="50%" src="https://rclone.org/img/logo_on_light__horizontal_color.svg" alt="rclone logo" style="float:right; padding: 5px;" >
|
||||||
|
|
||||||
- [About rclone](#about)
|
- [About rclone](#about)
|
||||||
- [What can rclone do for you](#what)
|
- [What can rclone do for you?](#what)
|
||||||
- [What features does rclone have](#features)
|
- [What features does rclone have?](#features)
|
||||||
- [What providers does rclone support](#providers)
|
- [What providers does rclone support?](#providers)
|
||||||
- [Download](https://rclone.org/downloads/)
|
- [Download](https://rclone.org/downloads/)
|
||||||
- [Install](https://rclone.org/install/)
|
- [Install](https://rclone.org/install/)
|
||||||
- [Donate.](https://rclone.org/donate/)
|
- [Donate.](https://rclone.org/donate/)
|
||||||
@@ -24,20 +24,20 @@ services, as well as standard transfer protocols.
|
|||||||
|
|
||||||
Rclone has powerful cloud equivalents to the unix commands rsync, cp,
|
Rclone has powerful cloud equivalents to the unix commands rsync, cp,
|
||||||
mv, mount, ls, ncdu, tree, rm, and cat. Rclone's familiar syntax
|
mv, mount, ls, ncdu, tree, rm, and cat. Rclone's familiar syntax
|
||||||
includes shell pipeline support, and `--dry-run` protection. It can be
|
includes shell pipeline support, and `--dry-run` protection. It is
|
||||||
used at the command line, in scripts or via its [API](/rc).
|
used at the command line, in scripts or via its [API](/rc).
|
||||||
|
|
||||||
Users have called rclone *"The Swiss army knife of cloud storage"* and
|
Users call rclone *"The Swiss army knife of cloud storage"*, and
|
||||||
*"Technology indistinguishable from magic"*.
|
*"Technology indistinguishable from magic"*.
|
||||||
|
|
||||||
Rclone really looks after your data. It preserves timestamps and
|
Rclone really looks after your data. It preserves timestamps and
|
||||||
verifies your data at all times. Transfers over limited bandwidth;
|
verifies checksums at all times. Transfers over limited bandwidth;
|
||||||
intermittent connections, or subject to quota can be restarted, from
|
intermittent connections, or subject to quota can be restarted, from
|
||||||
the last good file transferred. You can
|
the last good file transferred. You can
|
||||||
[check](https://rclone.org/commands/rclone_check/) the integrity of your files. Where
|
[check](https://rclone.org/commands/rclone_check/) the integrity of your files. Where
|
||||||
possible, rclone employs server side transfers to minimise local
|
possible, rclone employs server side transfers to minimise local
|
||||||
bandwidth use and transfers from one provider to another without
|
bandwidth use and transfers from one provider to another without
|
||||||
using your local disk.
|
using local disk.
|
||||||
|
|
||||||
Virtual backends wrap local and cloud file systems to apply
|
Virtual backends wrap local and cloud file systems to apply
|
||||||
[encryption](https://rclone.org/crypt/),
|
[encryption](https://rclone.org/crypt/),
|
||||||
@@ -45,9 +45,9 @@ Virtual backends wrap local and cloud file systems to apply
|
|||||||
[chunking](https://rclone.org/chunker/) and
|
[chunking](https://rclone.org/chunker/) and
|
||||||
[joining](https://rclone.org/union/).
|
[joining](https://rclone.org/union/).
|
||||||
|
|
||||||
Rclone can [mount](https://rclone.org/commands/rclone_mount/) any local, cloud or
|
Rclone [mounts](https://rclone.org/commands/rclone_mount/) any local, cloud or
|
||||||
virtual filesystem as a disk on Windows,
|
virtual filesystem as a disk on Windows,
|
||||||
macOS, linux and FreeBSD, and also serve these over
|
macOS, linux and FreeBSD, and also serves these over
|
||||||
[SFTP](https://rclone.org/commands/rclone_serve_sftp/),
|
[SFTP](https://rclone.org/commands/rclone_serve_sftp/),
|
||||||
[HTTP](https://rclone.org/commands/rclone_serve_http/),
|
[HTTP](https://rclone.org/commands/rclone_serve_http/),
|
||||||
[WebDAV](https://rclone.org/commands/rclone_serve_webdav/),
|
[WebDAV](https://rclone.org/commands/rclone_serve_webdav/),
|
||||||
@@ -61,14 +61,14 @@ Fedora, Brew and Chocolatey repos. include rclone. For the latest
|
|||||||
version [downloading from rclone.org](https://rclone.org/downloads/) is recommended.
|
version [downloading from rclone.org](https://rclone.org/downloads/) is recommended.
|
||||||
|
|
||||||
Rclone is widely used on Linux, Windows and Mac. Third party
|
Rclone is widely used on Linux, Windows and Mac. Third party
|
||||||
developers have built innovative backup, restore, GUI and business
|
developers create innovative backup, restore, GUI and business
|
||||||
process solutions using the rclone command line or API.
|
process solutions using the rclone command line or API.
|
||||||
|
|
||||||
Let rclone do the heavy lifting of communicating with cloud storage.
|
Rclone does the heavy lifting of communicating with cloud storage.
|
||||||
|
|
||||||
## What can rclone do for you {#what}
|
## What can rclone do for you? {#what}
|
||||||
|
|
||||||
Rclone can help you:
|
Rclone helps you:
|
||||||
|
|
||||||
- Backup (and encrypt) files to cloud storage
|
- Backup (and encrypt) files to cloud storage
|
||||||
- Restore (and decrypt) files from cloud storage
|
- Restore (and decrypt) files from cloud storage
|
||||||
@@ -96,7 +96,7 @@ Rclone can help you:
|
|||||||
|
|
||||||
## Supported providers {#providers}
|
## Supported providers {#providers}
|
||||||
|
|
||||||
(There are many other providers, built on standard protocols such as
|
(There are many others, built on standard protocols such as
|
||||||
WebDAV or S3, that work out of the box.)
|
WebDAV or S3, that work out of the box.)
|
||||||
|
|
||||||
|
|
||||||
@@ -330,7 +330,7 @@ kill %1
|
|||||||
|
|
||||||
## Install from source ##
|
## Install from source ##
|
||||||
|
|
||||||
Make sure you have at least [Go](https://golang.org/) 1.7
|
Make sure you have at least [Go](https://golang.org/) 1.10
|
||||||
installed. [Download go](https://golang.org/dl/) if necessary. The
|
installed. [Download go](https://golang.org/dl/) if necessary. The
|
||||||
latest release is recommended. Then
|
latest release is recommended. Then
|
||||||
|
|
||||||
@@ -339,16 +339,23 @@ latest release is recommended. Then
|
|||||||
go build
|
go build
|
||||||
./rclone version
|
./rclone version
|
||||||
|
|
||||||
You can also build and install rclone in the
|
This will leave you a checked out version of rclone you can modify and
|
||||||
[GOPATH](https://github.com/golang/go/wiki/GOPATH) (which defaults to
|
send pull requests with. If you use `make` instead of `go build` then
|
||||||
`~/go`) with:
|
the rclone build will have the correct version information in it.
|
||||||
|
|
||||||
go get -u -v github.com/rclone/rclone
|
You can also build the latest stable rclone with:
|
||||||
|
|
||||||
and this will build the binary in `$GOPATH/bin` (`~/go/bin/rclone` by
|
go get github.com/rclone/rclone
|
||||||
default) after downloading the source to
|
|
||||||
`$GOPATH/src/github.com/rclone/rclone` (`~/go/src/github.com/rclone/rclone`
|
or the latest version (equivalent to the beta) with
|
||||||
by default).
|
|
||||||
|
go get github.com/rclone/rclone@master
|
||||||
|
|
||||||
|
These will build the binary in `$(go env GOPATH)/bin`
|
||||||
|
(`~/go/bin/rclone` by default) after downloading the source to the go
|
||||||
|
module cache. Note - do **not** use the `-u` flag here. This causes go
|
||||||
|
to try to update the depencencies that rclone uses and sometimes these
|
||||||
|
don't work with the current version of rclone.
|
||||||
|
|
||||||
## Installation with Ansible ##
|
## Installation with Ansible ##
|
||||||
|
|
||||||
@@ -3126,11 +3133,24 @@ See the [global flags page](https://rclone.org/flags/) for global options not li
|
|||||||
|
|
||||||
# rclone obscure
|
# rclone obscure
|
||||||
|
|
||||||
Obscure password for use in the rclone.conf
|
Obscure password for use in the rclone config file
|
||||||
|
|
||||||
## Synopsis
|
## Synopsis
|
||||||
|
|
||||||
Obscure password for use in the rclone.conf
|
In the rclone config file, human readable passwords are
|
||||||
|
obscured. Obscuring them is done by encrypting them and writing them
|
||||||
|
out in base64. This is **not** a secure way of encrypting these
|
||||||
|
passwords as rclone can decrypt them - it is to prevent "eyedropping"
|
||||||
|
- namely someone seeing a password in the rclone config file by
|
||||||
|
accident.
|
||||||
|
|
||||||
|
Many equally important things (like access tokens) are not obscured in
|
||||||
|
the config file. However it is very hard to shoulder surf a 64
|
||||||
|
character hex token.
|
||||||
|
|
||||||
|
If you 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]
|
rclone obscure password [flags]
|
||||||
@@ -9670,7 +9690,7 @@ These flags are available for every command.
|
|||||||
--use-json-log Use json log format.
|
--use-json-log Use json log format.
|
||||||
--use-mmap Use mmap allocator (see docs).
|
--use-mmap Use mmap allocator (see docs).
|
||||||
--use-server-modtime Use server modified time instead of object metadata
|
--use-server-modtime Use server modified time instead of object metadata
|
||||||
--user-agent string Set the user-agent to a specified string. The default is rclone/ version (default "rclone/v1.52.0")
|
--user-agent string Set the user-agent to a specified string. The default is rclone/ version (default "rclone/v1.52.3")
|
||||||
-v, --verbose count Print lots more stuff (repeat for more)
|
-v, --verbose count Print lots more stuff (repeat for more)
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -9731,7 +9751,7 @@ and may be set in the config file.
|
|||||||
--cache-db-wait-time Duration How long to wait for the DB to be available - 0 is unlimited (default 1s)
|
--cache-db-wait-time Duration How long to wait for the DB to be available - 0 is unlimited (default 1s)
|
||||||
--cache-info-age Duration How long to cache file structure information (directory listings, file size, times etc). (default 6h0m0s)
|
--cache-info-age Duration How long to cache file structure information (directory listings, file size, times etc). (default 6h0m0s)
|
||||||
--cache-plex-insecure string Skip all certificate verification when connecting to the Plex server
|
--cache-plex-insecure string Skip all certificate verification when connecting to the Plex server
|
||||||
--cache-plex-password string The password of the Plex user
|
--cache-plex-password string The password of the Plex user (obscured)
|
||||||
--cache-plex-url string The URL of the Plex server
|
--cache-plex-url string The URL of the Plex server
|
||||||
--cache-plex-username string The username of the Plex user
|
--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. (default 10)
|
--cache-read-retries int How many times to retry a read from a cache storage. (default 10)
|
||||||
@@ -9751,8 +9771,8 @@ and may be set in the config file.
|
|||||||
-L, --copy-links Follow symlinks and copy the pointed to item.
|
-L, --copy-links Follow symlinks and copy the pointed to item.
|
||||||
--crypt-directory-name-encryption Option to either encrypt directory names or leave them intact. (default true)
|
--crypt-directory-name-encryption Option to either encrypt directory names or leave them intact. (default true)
|
||||||
--crypt-filename-encryption string How to encrypt the filenames. (default "standard")
|
--crypt-filename-encryption string How to encrypt the filenames. (default "standard")
|
||||||
--crypt-password string Password or pass phrase for encryption.
|
--crypt-password string Password or pass phrase for encryption. (obscured)
|
||||||
--crypt-password2 string Password or pass phrase for salt. Optional but recommended.
|
--crypt-password2 string Password or pass phrase for salt. Optional but recommended. (obscured)
|
||||||
--crypt-remote string Remote to encrypt/decrypt.
|
--crypt-remote string Remote to encrypt/decrypt.
|
||||||
--crypt-show-mapping For all files listed show how the names encrypt.
|
--crypt-show-mapping For all files listed show how the names encrypt.
|
||||||
--drive-acknowledge-abuse Set to allow files which return cannotDownloadAbusiveFile to be downloaded.
|
--drive-acknowledge-abuse Set to allow files which return cannotDownloadAbusiveFile to be downloaded.
|
||||||
@@ -9803,7 +9823,7 @@ and may be set in the config file.
|
|||||||
--ftp-encoding MultiEncoder This sets the encoding for the backend. (default Slash,Del,Ctl,RightSpace,Dot)
|
--ftp-encoding MultiEncoder This sets the encoding for the backend. (default Slash,Del,Ctl,RightSpace,Dot)
|
||||||
--ftp-host string FTP host to connect to
|
--ftp-host string FTP host to connect to
|
||||||
--ftp-no-check-certificate Do not verify the TLS certificate of the server
|
--ftp-no-check-certificate Do not verify the TLS certificate of the server
|
||||||
--ftp-pass string FTP password
|
--ftp-pass string FTP password (obscured)
|
||||||
--ftp-port string FTP port, leave blank to use default (21)
|
--ftp-port string FTP port, leave blank to use default (21)
|
||||||
--ftp-tls Use FTP over TLS (Implicit)
|
--ftp-tls Use FTP over TLS (Implicit)
|
||||||
--ftp-user string FTP username, leave blank for current username, $USER
|
--ftp-user string FTP username, leave blank for current username, $USER
|
||||||
@@ -9840,7 +9860,7 @@ and may be set in the config file.
|
|||||||
--koofr-encoding MultiEncoder This sets the encoding for the backend. (default Slash,BackSlash,Del,Ctl,InvalidUtf8,Dot)
|
--koofr-encoding MultiEncoder This sets the encoding for the backend. (default Slash,BackSlash,Del,Ctl,InvalidUtf8,Dot)
|
||||||
--koofr-endpoint string The Koofr API endpoint to use (default "https://app.koofr.net")
|
--koofr-endpoint string The Koofr API endpoint to use (default "https://app.koofr.net")
|
||||||
--koofr-mountid string Mount ID of the mount to use. If omitted, the primary mount is used.
|
--koofr-mountid string Mount ID of the mount to use. If omitted, the primary mount is used.
|
||||||
--koofr-password string Your Koofr password for rclone (generate one at https://app.koofr.net/app/admin/preferences/password)
|
--koofr-password string Your Koofr password for rclone (generate one at https://app.koofr.net/app/admin/preferences/password) (obscured)
|
||||||
--koofr-setmtime Does the backend support setting modification time. Set this to false if you use a mount ID that points to a Dropbox or Amazon Drive backend. (default true)
|
--koofr-setmtime Does the backend support setting modification time. Set this to false if you use a mount ID that points to a Dropbox or Amazon Drive backend. (default true)
|
||||||
--koofr-user string Your Koofr user name
|
--koofr-user string Your Koofr user name
|
||||||
-l, --links Translate symlinks to/from regular files with a '.rclonelink' extension
|
-l, --links Translate symlinks to/from regular files with a '.rclonelink' extension
|
||||||
@@ -9853,7 +9873,7 @@ and may be set in the config file.
|
|||||||
--local-nounc string Disable UNC (long path names) conversion on Windows
|
--local-nounc string Disable UNC (long path names) conversion on Windows
|
||||||
--mailru-check-hash What should copy do if file checksum is mismatched or invalid (default true)
|
--mailru-check-hash What should copy do if file checksum is mismatched or invalid (default true)
|
||||||
--mailru-encoding MultiEncoder This sets the encoding for the backend. (default Slash,LtGt,DoubleQuote,Colon,Question,Asterisk,Pipe,BackSlash,Del,Ctl,InvalidUtf8,Dot)
|
--mailru-encoding MultiEncoder This sets the encoding for the backend. (default Slash,LtGt,DoubleQuote,Colon,Question,Asterisk,Pipe,BackSlash,Del,Ctl,InvalidUtf8,Dot)
|
||||||
--mailru-pass string Password
|
--mailru-pass string Password (obscured)
|
||||||
--mailru-speedup-enable Skip full upload if there is another file with same data hash. (default true)
|
--mailru-speedup-enable Skip full upload if there is another file with same data hash. (default true)
|
||||||
--mailru-speedup-file-patterns string Comma separated list of file name patterns eligible for speedup (put by hash). (default "*.mkv,*.avi,*.mp4,*.mp3,*.zip,*.gz,*.rar,*.pdf")
|
--mailru-speedup-file-patterns string Comma separated list of file name patterns eligible for speedup (put by hash). (default "*.mkv,*.avi,*.mp4,*.mp3,*.zip,*.gz,*.rar,*.pdf")
|
||||||
--mailru-speedup-max-disk SizeSuffix This option allows you to disable speedup (put by hash) for large files (default 3G)
|
--mailru-speedup-max-disk SizeSuffix This option allows you to disable speedup (put by hash) for large files (default 3G)
|
||||||
@@ -9862,7 +9882,7 @@ and may be set in the config file.
|
|||||||
--mega-debug Output more debug from Mega.
|
--mega-debug Output more debug from Mega.
|
||||||
--mega-encoding MultiEncoder This sets the encoding for the backend. (default Slash,InvalidUtf8,Dot)
|
--mega-encoding MultiEncoder This sets the encoding for the backend. (default Slash,InvalidUtf8,Dot)
|
||||||
--mega-hard-delete Delete files permanently rather than putting them into the trash.
|
--mega-hard-delete Delete files permanently rather than putting them into the trash.
|
||||||
--mega-pass string Password.
|
--mega-pass string Password. (obscured)
|
||||||
--mega-user string User name
|
--mega-user string User name
|
||||||
-x, --one-file-system Don't cross filesystem boundaries (unix/macOS only).
|
-x, --one-file-system Don't cross filesystem boundaries (unix/macOS only).
|
||||||
--onedrive-chunk-size SizeSuffix Chunk size to upload files with - must be multiple of 320k (327,680 bytes). (default 10M)
|
--onedrive-chunk-size SizeSuffix Chunk size to upload files with - must be multiple of 320k (327,680 bytes). (default 10M)
|
||||||
@@ -9875,11 +9895,12 @@ and may be set in the config file.
|
|||||||
--onedrive-server-side-across-configs Allow server side operations (eg copy) to work across different onedrive configs.
|
--onedrive-server-side-across-configs Allow server side operations (eg copy) to work across different onedrive configs.
|
||||||
--opendrive-chunk-size SizeSuffix Files will be uploaded in chunks this size. (default 10M)
|
--opendrive-chunk-size SizeSuffix Files will be uploaded in chunks this size. (default 10M)
|
||||||
--opendrive-encoding MultiEncoder This sets the encoding for the backend. (default Slash,LtGt,DoubleQuote,Colon,Question,Asterisk,Pipe,BackSlash,LeftSpace,LeftCrLfHtVt,RightSpace,RightCrLfHtVt,InvalidUtf8,Dot)
|
--opendrive-encoding MultiEncoder This sets the encoding for the backend. (default Slash,LtGt,DoubleQuote,Colon,Question,Asterisk,Pipe,BackSlash,LeftSpace,LeftCrLfHtVt,RightSpace,RightCrLfHtVt,InvalidUtf8,Dot)
|
||||||
--opendrive-password string Password.
|
--opendrive-password string Password. (obscured)
|
||||||
--opendrive-username string Username
|
--opendrive-username string Username
|
||||||
--pcloud-client-id string Pcloud App Client Id
|
--pcloud-client-id string Pcloud App Client Id
|
||||||
--pcloud-client-secret string Pcloud App Client Secret
|
--pcloud-client-secret string Pcloud App Client Secret
|
||||||
--pcloud-encoding MultiEncoder This sets the encoding for the backend. (default Slash,BackSlash,Del,Ctl,InvalidUtf8,Dot)
|
--pcloud-encoding MultiEncoder This sets the encoding for the backend. (default Slash,BackSlash,Del,Ctl,InvalidUtf8,Dot)
|
||||||
|
--pcloud-hostname string Hostname to connect to. (default "api.pcloud.com")
|
||||||
--pcloud-root-folder-id string Fill in for rclone to use a non root folder as its starting point. (default "d0")
|
--pcloud-root-folder-id string Fill in for rclone to use a non root folder as its starting point. (default "d0")
|
||||||
--premiumizeme-encoding MultiEncoder This sets the encoding for the backend. (default Slash,DoubleQuote,BackSlash,Del,Ctl,InvalidUtf8,Dot)
|
--premiumizeme-encoding MultiEncoder This sets the encoding for the backend. (default Slash,DoubleQuote,BackSlash,Del,Ctl,InvalidUtf8,Dot)
|
||||||
--putio-encoding MultiEncoder This sets the encoding for the backend. (default Slash,BackSlash,Del,Ctl,InvalidUtf8,Dot)
|
--putio-encoding MultiEncoder This sets the encoding for the backend. (default Slash,BackSlash,Del,Ctl,InvalidUtf8,Dot)
|
||||||
@@ -9926,19 +9947,19 @@ and may be set in the config file.
|
|||||||
--seafile-create-library Should rclone create a library if it doesn't exist
|
--seafile-create-library Should rclone create a library if it doesn't exist
|
||||||
--seafile-encoding MultiEncoder This sets the encoding for the backend. (default Slash,DoubleQuote,BackSlash,Ctl,InvalidUtf8)
|
--seafile-encoding MultiEncoder This sets the encoding for the backend. (default Slash,DoubleQuote,BackSlash,Ctl,InvalidUtf8)
|
||||||
--seafile-library string Name of the library. Leave blank to access all non-encrypted libraries.
|
--seafile-library string Name of the library. Leave blank to access all non-encrypted libraries.
|
||||||
--seafile-library-key string Library password (for encrypted libraries only). Leave blank if you pass it through the command line.
|
--seafile-library-key string Library password (for encrypted libraries only). Leave blank if you pass it through the command line. (obscured)
|
||||||
--seafile-pass string Password
|
--seafile-pass string Password (obscured)
|
||||||
--seafile-url string URL of seafile host to connect to
|
--seafile-url string URL of seafile host to connect to
|
||||||
--seafile-user string User name (usually email address)
|
--seafile-user string User name (usually email address)
|
||||||
--sftp-ask-password Allow asking for SFTP password when needed.
|
--sftp-ask-password Allow asking for SFTP password when needed.
|
||||||
--sftp-disable-hashcheck Disable the execution of SSH commands to determine if remote file hashing is available.
|
--sftp-disable-hashcheck Disable the execution of SSH commands to determine if remote file hashing is available.
|
||||||
--sftp-host string SSH host to connect to
|
--sftp-host string SSH host to connect to
|
||||||
--sftp-key-file string Path to PEM-encoded private key file, leave blank or set key-use-agent to use ssh-agent.
|
--sftp-key-file string Path to PEM-encoded private key file, leave blank or set key-use-agent to use ssh-agent.
|
||||||
--sftp-key-file-pass string The passphrase to decrypt the PEM-encoded private key file.
|
--sftp-key-file-pass string The passphrase to decrypt the PEM-encoded private key file. (obscured)
|
||||||
--sftp-key-pem string Raw PEM-encoded private key, If specified, will override key_file parameter.
|
--sftp-key-pem string Raw PEM-encoded private key, If specified, will override key_file parameter.
|
||||||
--sftp-key-use-agent When set forces the usage of the ssh-agent.
|
--sftp-key-use-agent When set forces the usage of the ssh-agent.
|
||||||
--sftp-md5sum-command string The command used to read md5 hashes. Leave blank for autodetect.
|
--sftp-md5sum-command string The command used to read md5 hashes. Leave blank for autodetect.
|
||||||
--sftp-pass string SSH password, leave blank to use ssh-agent.
|
--sftp-pass string SSH password, leave blank to use ssh-agent. (obscured)
|
||||||
--sftp-path-override string Override path used by SSH connection.
|
--sftp-path-override string Override path used by SSH connection.
|
||||||
--sftp-port string SSH port, leave blank to use default (22)
|
--sftp-port string SSH port, leave blank to use default (22)
|
||||||
--sftp-set-modtime Set the modified time on the remote if set. (default true)
|
--sftp-set-modtime Set the modified time on the remote if set. (default true)
|
||||||
@@ -9996,7 +10017,7 @@ and may be set in the config file.
|
|||||||
--union-upstreams string List of space separated upstreams.
|
--union-upstreams string List of space separated upstreams.
|
||||||
--webdav-bearer-token string Bearer token instead of user/pass (eg a Macaroon)
|
--webdav-bearer-token string Bearer token instead of user/pass (eg a Macaroon)
|
||||||
--webdav-bearer-token-command string Command to run to get a bearer token
|
--webdav-bearer-token-command string Command to run to get a bearer token
|
||||||
--webdav-pass string Password.
|
--webdav-pass string Password. (obscured)
|
||||||
--webdav-url string URL of http host to connect to
|
--webdav-url string URL of http host to connect to
|
||||||
--webdav-user string User name
|
--webdav-user string User name
|
||||||
--webdav-vendor string Name of the Webdav site/service/software you are using
|
--webdav-vendor string Name of the Webdav site/service/software you are using
|
||||||
@@ -13622,6 +13643,8 @@ The username of the Plex user
|
|||||||
|
|
||||||
The password of the Plex user
|
The password of the Plex user
|
||||||
|
|
||||||
|
**NB** Input to this must be obscured - see [rclone obscure](https://rclone.org/commands/rclone_obscure/).
|
||||||
|
|
||||||
- Config: plex_password
|
- Config: plex_password
|
||||||
- Env Var: RCLONE_CACHE_PLEX_PASSWORD
|
- Env Var: RCLONE_CACHE_PLEX_PASSWORD
|
||||||
- Type: string
|
- Type: string
|
||||||
@@ -14880,6 +14903,8 @@ NB If filename_encryption is "off" then this option will do nothing.
|
|||||||
|
|
||||||
Password or pass phrase for encryption.
|
Password or pass phrase for encryption.
|
||||||
|
|
||||||
|
**NB** Input to this must be obscured - see [rclone obscure](https://rclone.org/commands/rclone_obscure/).
|
||||||
|
|
||||||
- Config: password
|
- Config: password
|
||||||
- Env Var: RCLONE_CRYPT_PASSWORD
|
- Env Var: RCLONE_CRYPT_PASSWORD
|
||||||
- Type: string
|
- Type: string
|
||||||
@@ -14890,6 +14915,8 @@ Password or pass phrase for encryption.
|
|||||||
Password or pass phrase for salt. Optional but recommended.
|
Password or pass phrase for salt. Optional but recommended.
|
||||||
Should be different to the previous password.
|
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
|
- Config: password2
|
||||||
- Env Var: RCLONE_CRYPT_PASSWORD2
|
- Env Var: RCLONE_CRYPT_PASSWORD2
|
||||||
- Type: string
|
- Type: string
|
||||||
@@ -15318,6 +15345,10 @@ FTP is the File Transfer Protocol. FTP support is provided using the
|
|||||||
[github.com/jlaffaye/ftp](https://godoc.org/github.com/jlaffaye/ftp)
|
[github.com/jlaffaye/ftp](https://godoc.org/github.com/jlaffaye/ftp)
|
||||||
package.
|
package.
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
Here is an example of making an FTP configuration. First run
|
Here is an example of making an FTP configuration. First run
|
||||||
|
|
||||||
rclone config
|
rclone config
|
||||||
@@ -15480,6 +15511,8 @@ FTP port, leave blank to use default (21)
|
|||||||
|
|
||||||
FTP password
|
FTP password
|
||||||
|
|
||||||
|
**NB** Input to this must be obscured - see [rclone obscure](https://rclone.org/commands/rclone_obscure/).
|
||||||
|
|
||||||
- Config: pass
|
- Config: pass
|
||||||
- Env Var: RCLONE_FTP_PASS
|
- Env Var: RCLONE_FTP_PASS
|
||||||
- Type: string
|
- Type: string
|
||||||
@@ -16426,7 +16459,7 @@ For shortcuts pointing to folders:
|
|||||||
- When deleting with `rclone rmdir` or `rclone purge` the shortcut is deleted not the linked folder.
|
- When deleting with `rclone rmdir` or `rclone purge` the shortcut is deleted not the linked folder.
|
||||||
- **NB** When deleting with `rclone remove` or `rclone mount` the contents of the linked folder will be deleted.
|
- **NB** When deleting with `rclone remove` or `rclone mount` the contents of the linked folder will be deleted.
|
||||||
|
|
||||||
It isn't currently possible to create shortcuts with rclone.
|
The [rclone backend](https://rclone.org/commands/rclone_backend/) command can be used to create shortcuts.
|
||||||
|
|
||||||
Shortcuts can be completely ignored with the `--drive-skip-shortcuts` flag
|
Shortcuts can be completely ignored with the `--drive-skip-shortcuts` flag
|
||||||
or the corresponding `skip_shortcuts` configuration setting.
|
or the corresponding `skip_shortcuts` configuration setting.
|
||||||
@@ -16603,9 +16636,6 @@ Leave blank normally.
|
|||||||
Fill in to access "Computers" folders (see docs), or for rclone to use
|
Fill in to access "Computers" folders (see docs), or for rclone to use
|
||||||
a non root folder as its starting point.
|
a non root folder as its starting point.
|
||||||
|
|
||||||
Note that if this is blank, the first time rclone runs it will fill it
|
|
||||||
in with the ID of the root folder.
|
|
||||||
|
|
||||||
|
|
||||||
- Config: root_folder_id
|
- Config: root_folder_id
|
||||||
- Env Var: RCLONE_DRIVE_ROOT_FOLDER_ID
|
- Env Var: RCLONE_DRIVE_ROOT_FOLDER_ID
|
||||||
@@ -17208,6 +17238,13 @@ the remote configuration, it's not such a big deal).
|
|||||||
|
|
||||||
(Thanks to @balazer on github for these instructions.)
|
(Thanks to @balazer on github for these instructions.)
|
||||||
|
|
||||||
|
Sometimes, creation of an OAuth consent in Google API Console fails due to an error message
|
||||||
|
“The request failed because changes to one of the field of the resource is not supported”.
|
||||||
|
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 Enable the Drive API button to receive the Client ID and Secret.
|
||||||
|
Note that it will automatically create a new project in the API Console.
|
||||||
|
|
||||||
Google Photos
|
Google Photos
|
||||||
-------------------------------------------------
|
-------------------------------------------------
|
||||||
|
|
||||||
@@ -18312,6 +18349,8 @@ Your Koofr user name
|
|||||||
|
|
||||||
Your Koofr password for rclone (generate one at https://app.koofr.net/app/admin/preferences/password)
|
Your Koofr password for rclone (generate one at https://app.koofr.net/app/admin/preferences/password)
|
||||||
|
|
||||||
|
**NB** Input to this must be obscured - see [rclone obscure](https://rclone.org/commands/rclone_obscure/).
|
||||||
|
|
||||||
- Config: password
|
- Config: password
|
||||||
- Env Var: RCLONE_KOOFR_PASSWORD
|
- Env Var: RCLONE_KOOFR_PASSWORD
|
||||||
- Type: string
|
- Type: string
|
||||||
@@ -18544,6 +18583,8 @@ User name (usually email)
|
|||||||
|
|
||||||
Password
|
Password
|
||||||
|
|
||||||
|
**NB** Input to this must be obscured - see [rclone obscure](https://rclone.org/commands/rclone_obscure/).
|
||||||
|
|
||||||
- Config: pass
|
- Config: pass
|
||||||
- Env Var: RCLONE_MAILRU_PASS
|
- Env Var: RCLONE_MAILRU_PASS
|
||||||
- Type: string
|
- Type: string
|
||||||
@@ -18842,6 +18883,8 @@ User name
|
|||||||
|
|
||||||
Password.
|
Password.
|
||||||
|
|
||||||
|
**NB** Input to this must be obscured - see [rclone obscure](https://rclone.org/commands/rclone_obscure/).
|
||||||
|
|
||||||
- Config: pass
|
- Config: pass
|
||||||
- Env Var: RCLONE_MEGA_PASS
|
- Env Var: RCLONE_MEGA_PASS
|
||||||
- Type: string
|
- Type: string
|
||||||
@@ -19419,7 +19462,7 @@ requests.
|
|||||||
If you are having problems with them (E.g., seeing a lot of throttling), you can get your own
|
If you are having problems with them (E.g., seeing a lot of throttling), you can get your own
|
||||||
Client ID and Key by following the steps below:
|
Client ID and Key by following the steps below:
|
||||||
|
|
||||||
1. Open https://portal.azure.com/#blade/Microsoft_AAD_RegisteredApps/ApplicationsListBlade, then click `New registration`.
|
1. Open https://portal.azure.com/#blade/Microsoft_AAD_RegisteredApps/ApplicationsListBlade and then click `New registration`.
|
||||||
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` Enter `http://localhost:53682/` and click Register. Copy and keep the `Application (client) ID` under the app name for later use.
|
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` Enter `http://localhost:53682/` and click Register. Copy and keep the `Application (client) ID` under the app name for later use.
|
||||||
3. Under `manage` select `Certificates & secrets`, click `New client secret`. Copy and keep that secret for later use.
|
3. Under `manage` select `Certificates & secrets`, click `New client secret`. Copy and keep that secret for later use.
|
||||||
4. Under `manage` select `API permissions`, click `Add a permission` and select `Microsoft Graph` then select `delegated permissions`.
|
4. Under `manage` select `API permissions`, click `Add a permission` and select `Microsoft Graph` then select `delegated permissions`.
|
||||||
@@ -19818,6 +19861,8 @@ Username
|
|||||||
|
|
||||||
Password.
|
Password.
|
||||||
|
|
||||||
|
**NB** Input to this must be obscured - see [rclone obscure](https://rclone.org/commands/rclone_obscure/).
|
||||||
|
|
||||||
- Config: password
|
- Config: password
|
||||||
- Env Var: RCLONE_OPENDRIVE_PASSWORD
|
- Env Var: RCLONE_OPENDRIVE_PASSWORD
|
||||||
- Type: string
|
- Type: string
|
||||||
@@ -20837,6 +20882,17 @@ Fill in for rclone to use a non root folder as its starting point.
|
|||||||
- Type: string
|
- Type: string
|
||||||
- Default: "d0"
|
- Default: "d0"
|
||||||
|
|
||||||
|
#### --pcloud-hostname
|
||||||
|
|
||||||
|
Hostname to connect to.
|
||||||
|
|
||||||
|
This is normally set when rclone initially does the oauth connection.
|
||||||
|
|
||||||
|
- Config: hostname
|
||||||
|
- Env Var: RCLONE_PCLOUD_HOSTNAME
|
||||||
|
- Type: string
|
||||||
|
- Default: "api.pcloud.com"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
premiumize.me
|
premiumize.me
|
||||||
@@ -21394,6 +21450,8 @@ User name (usually email address)
|
|||||||
|
|
||||||
Password
|
Password
|
||||||
|
|
||||||
|
**NB** Input to this must be obscured - see [rclone obscure](https://rclone.org/commands/rclone_obscure/).
|
||||||
|
|
||||||
- Config: pass
|
- Config: pass
|
||||||
- Env Var: RCLONE_SEAFILE_PASS
|
- Env Var: RCLONE_SEAFILE_PASS
|
||||||
- Type: string
|
- Type: string
|
||||||
@@ -21421,6 +21479,8 @@ Name of the library. Leave blank to access all non-encrypted libraries.
|
|||||||
|
|
||||||
Library password (for encrypted libraries only). Leave blank if you pass it through the command line.
|
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/).
|
||||||
|
|
||||||
- Config: library_key
|
- Config: library_key
|
||||||
- Env Var: RCLONE_SEAFILE_LIBRARY_KEY
|
- Env Var: RCLONE_SEAFILE_LIBRARY_KEY
|
||||||
- Type: string
|
- Type: string
|
||||||
@@ -21650,6 +21710,8 @@ SSH port, leave blank to use default (22)
|
|||||||
|
|
||||||
SSH password, leave blank to use ssh-agent.
|
SSH password, leave blank to use ssh-agent.
|
||||||
|
|
||||||
|
**NB** Input to this must be obscured - see [rclone obscure](https://rclone.org/commands/rclone_obscure/).
|
||||||
|
|
||||||
- Config: pass
|
- Config: pass
|
||||||
- Env Var: RCLONE_SFTP_PASS
|
- Env Var: RCLONE_SFTP_PASS
|
||||||
- Type: string
|
- Type: string
|
||||||
@@ -21680,6 +21742,8 @@ The passphrase to decrypt the PEM-encoded private key file.
|
|||||||
Only PEM encrypted key files (old OpenSSH format) are supported. Encrypted keys
|
Only PEM encrypted key files (old OpenSSH format) are supported. Encrypted keys
|
||||||
in the new OpenSSH format can't be used.
|
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/).
|
||||||
|
|
||||||
- Config: key_file_pass
|
- Config: key_file_pass
|
||||||
- Env Var: RCLONE_SFTP_KEY_FILE_PASS
|
- Env Var: RCLONE_SFTP_KEY_FILE_PASS
|
||||||
- Type: string
|
- Type: string
|
||||||
@@ -22778,6 +22842,8 @@ User name
|
|||||||
|
|
||||||
Password.
|
Password.
|
||||||
|
|
||||||
|
**NB** Input to this must be obscured - see [rclone obscure](https://rclone.org/commands/rclone_obscure/).
|
||||||
|
|
||||||
- Config: pass
|
- Config: pass
|
||||||
- Env Var: RCLONE_WEBDAV_PASS
|
- Env Var: RCLONE_WEBDAV_PASS
|
||||||
- Type: string
|
- Type: string
|
||||||
@@ -23596,6 +23662,96 @@ Options:
|
|||||||
|
|
||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## 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 (eg en-dash) in MANUAL.* and man page (Nick Craig-Wood)
|
||||||
|
* Update install.md to reflect minimum Go version (Evan Harris)
|
||||||
|
* Update install from source instructions (Nick Craig-Wood)
|
||||||
|
* make_manual: Support SOURCE_DATE_EPOCH (Morten Linderud)
|
||||||
|
* log: Fix --use-json-log going to stderr not --log-file on 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_id as 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 WSAECONNREFUSED and 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-impersonate with cached root_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/df for 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 SetSparse on Windows 7 which fixes downloads of files > 250MB (Nick Craig-Wood)
|
||||||
|
* build
|
||||||
|
* Update go.mod to go1.14 to enable -mod=vendor build (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_other in /etc/fuse.conf in the Docker image (Nick Craig-Wood)
|
||||||
|
* Fix xgo build after go1.14 go.mod update (Nick Craig-Wood)
|
||||||
|
* docs
|
||||||
|
* Add link to source and modified time to footer of every page (Nick Craig-Wood)
|
||||||
|
* Remove manually set dates and use git dates instead (Nick Craig-Wood)
|
||||||
|
* Minor tense, punctuation, brevity and positivity changes for the home page (edwardxml)
|
||||||
|
* Remove leading slash in page reference in footer when present (Nick Craig-Wood)
|
||||||
|
* Note commands which need obscured input in the docs (Nick Craig-Wood)
|
||||||
|
* obscure: Write more help as we are referencing it elsewhere (Nick Craig-Wood)
|
||||||
|
* VFS
|
||||||
|
* Fix OS vs Unix path confusion - fixes ChangeNotify on Windows (Nick Craig-Wood)
|
||||||
|
* Drive
|
||||||
|
* Fix missing items when listing using --fast-list / ListR (Nick Craig-Wood)
|
||||||
|
* Putio
|
||||||
|
* Fix panic on Object.Open (Cenk Alti)
|
||||||
|
* S3
|
||||||
|
* Fix upload of single files into buckets without create permission (Nick Craig-Wood)
|
||||||
|
* Fix --header-upload (Nick Craig-Wood)
|
||||||
|
* Tardigrade
|
||||||
|
* Fix listing bug by upgrading to v1.0.7
|
||||||
|
* Set UserAgent to rclone (Caleb Case)
|
||||||
|
|
||||||
## v1.52.0 - 2020-05-27
|
## v1.52.0 - 2020-05-27
|
||||||
|
|
||||||
Special thanks to Martin Michlmayr for proof reading and correcting
|
Special thanks to Martin Michlmayr for proof reading and correcting
|
||||||
|
|||||||
4550
MANUAL.txt
generated
4550
MANUAL.txt
generated
File diff suppressed because it is too large
Load Diff
6
Makefile
6
Makefile
@@ -105,16 +105,16 @@ tidy:
|
|||||||
doc: rclone.1 MANUAL.html MANUAL.txt rcdocs commanddocs
|
doc: rclone.1 MANUAL.html MANUAL.txt rcdocs commanddocs
|
||||||
|
|
||||||
rclone.1: MANUAL.md
|
rclone.1: MANUAL.md
|
||||||
pandoc -s --from markdown --to man MANUAL.md -o rclone.1
|
pandoc -s --from markdown-smart --to man MANUAL.md -o rclone.1
|
||||||
|
|
||||||
MANUAL.md: bin/make_manual.py docs/content/*.md commanddocs backenddocs
|
MANUAL.md: bin/make_manual.py docs/content/*.md commanddocs backenddocs
|
||||||
./bin/make_manual.py
|
./bin/make_manual.py
|
||||||
|
|
||||||
MANUAL.html: MANUAL.md
|
MANUAL.html: MANUAL.md
|
||||||
pandoc -s --from markdown --to html MANUAL.md -o MANUAL.html
|
pandoc -s --from markdown-smart --to html MANUAL.md -o MANUAL.html
|
||||||
|
|
||||||
MANUAL.txt: MANUAL.md
|
MANUAL.txt: MANUAL.md
|
||||||
pandoc -s --from markdown --to plain MANUAL.md -o MANUAL.txt
|
pandoc -s --from markdown-smart --to plain MANUAL.md -o MANUAL.txt
|
||||||
|
|
||||||
commanddocs: rclone
|
commanddocs: rclone
|
||||||
XDG_CACHE_HOME="" XDG_CONFIG_HOME="" HOME="\$$HOME" USER="\$$USER" rclone gendocs docs/content/
|
XDG_CACHE_HOME="" XDG_CONFIG_HOME="" HOME="\$$HOME" USER="\$$USER" rclone gendocs docs/content/
|
||||||
|
|||||||
3
backend/cache/cache_internal_test.go
vendored
3
backend/cache/cache_internal_test.go
vendored
@@ -33,6 +33,7 @@ import (
|
|||||||
"github.com/rclone/rclone/fs/object"
|
"github.com/rclone/rclone/fs/object"
|
||||||
"github.com/rclone/rclone/fs/rc"
|
"github.com/rclone/rclone/fs/rc"
|
||||||
"github.com/rclone/rclone/fstest"
|
"github.com/rclone/rclone/fstest"
|
||||||
|
"github.com/rclone/rclone/fstest/testy"
|
||||||
"github.com/rclone/rclone/lib/random"
|
"github.com/rclone/rclone/lib/random"
|
||||||
"github.com/rclone/rclone/vfs"
|
"github.com/rclone/rclone/vfs"
|
||||||
"github.com/rclone/rclone/vfs/vfsflags"
|
"github.com/rclone/rclone/vfs/vfsflags"
|
||||||
@@ -299,6 +300,7 @@ func TestInternalRemoteWrittenFileFoundInMount(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestInternalCachedWrittenContentMatches(t *testing.T) {
|
func TestInternalCachedWrittenContentMatches(t *testing.T) {
|
||||||
|
testy.SkipUnreliable(t)
|
||||||
id := fmt.Sprintf("ticwcm%v", time.Now().Unix())
|
id := fmt.Sprintf("ticwcm%v", time.Now().Unix())
|
||||||
rootFs, boltDb := runInstance.newCacheFs(t, remoteName, id, false, true, nil, nil)
|
rootFs, boltDb := runInstance.newCacheFs(t, remoteName, id, false, true, nil, nil)
|
||||||
defer runInstance.cleanupFs(t, rootFs, boltDb)
|
defer runInstance.cleanupFs(t, rootFs, boltDb)
|
||||||
@@ -342,6 +344,7 @@ func TestInternalDoubleWrittenContentMatches(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestInternalCachedUpdatedContentMatches(t *testing.T) {
|
func TestInternalCachedUpdatedContentMatches(t *testing.T) {
|
||||||
|
testy.SkipUnreliable(t)
|
||||||
id := fmt.Sprintf("ticucm%v", time.Now().Unix())
|
id := fmt.Sprintf("ticucm%v", time.Now().Unix())
|
||||||
rootFs, boltDb := runInstance.newCacheFs(t, remoteName, id, false, true, nil, nil)
|
rootFs, boltDb := runInstance.newCacheFs(t, remoteName, id, false, true, nil, nil)
|
||||||
defer runInstance.cleanupFs(t, rootFs, boltDb)
|
defer runInstance.cleanupFs(t, rootFs, boltDb)
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ import (
|
|||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
|
"sync/atomic"
|
||||||
"text/template"
|
"text/template"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -56,6 +57,7 @@ const (
|
|||||||
rcloneEncryptedClientSecret = "eX8GpZTVx3vxMWVkuuBdDWmAUE6rGhTwVrvG9GhllYccSdj2-mvHVg"
|
rcloneEncryptedClientSecret = "eX8GpZTVx3vxMWVkuuBdDWmAUE6rGhTwVrvG9GhllYccSdj2-mvHVg"
|
||||||
driveFolderType = "application/vnd.google-apps.folder"
|
driveFolderType = "application/vnd.google-apps.folder"
|
||||||
shortcutMimeType = "application/vnd.google-apps.shortcut"
|
shortcutMimeType = "application/vnd.google-apps.shortcut"
|
||||||
|
shortcutMimeTypeDangling = "application/vnd.google-apps.shortcut.dangling" // synthetic mime type for internal use
|
||||||
timeFormatIn = time.RFC3339
|
timeFormatIn = time.RFC3339
|
||||||
timeFormatOut = "2006-01-02T15:04:05.000000000Z07:00"
|
timeFormatOut = "2006-01-02T15:04:05.000000000Z07:00"
|
||||||
defaultMinSleep = fs.Duration(100 * time.Millisecond)
|
defaultMinSleep = fs.Duration(100 * time.Millisecond)
|
||||||
@@ -68,6 +70,8 @@ const (
|
|||||||
minChunkSize = 256 * fs.KibiByte
|
minChunkSize = 256 * fs.KibiByte
|
||||||
defaultChunkSize = 8 * fs.MebiByte
|
defaultChunkSize = 8 * fs.MebiByte
|
||||||
partialFields = "id,name,size,md5Checksum,trashed,modifiedTime,createdTime,mimeType,parents,webViewLink,shortcutDetails"
|
partialFields = "id,name,size,md5Checksum,trashed,modifiedTime,createdTime,mimeType,parents,webViewLink,shortcutDetails"
|
||||||
|
listRGrouping = 50 // number of IDs to search at once when using ListR
|
||||||
|
listRInputBuffer = 1000 // size of input buffer when using ListR
|
||||||
)
|
)
|
||||||
|
|
||||||
// Globals
|
// Globals
|
||||||
@@ -220,9 +224,6 @@ Leave blank normally.
|
|||||||
|
|
||||||
Fill in to access "Computers" folders (see docs), or for rclone to use
|
Fill in to access "Computers" folders (see docs), or for rclone to use
|
||||||
a non root folder as its starting point.
|
a non root folder as its starting point.
|
||||||
|
|
||||||
Note that if this is blank, the first time rclone runs it will fill it
|
|
||||||
in with the ID of the root folder.
|
|
||||||
`,
|
`,
|
||||||
}, {
|
}, {
|
||||||
Name: "service_account_file",
|
Name: "service_account_file",
|
||||||
@@ -348,7 +349,7 @@ date is used.`,
|
|||||||
}, {
|
}, {
|
||||||
Name: "impersonate",
|
Name: "impersonate",
|
||||||
Default: "",
|
Default: "",
|
||||||
Help: "Impersonate this user when using a service account.",
|
Help: `Impersonate this user when using a service account.`,
|
||||||
Advanced: true,
|
Advanced: true,
|
||||||
}, {
|
}, {
|
||||||
Name: "alternate_export",
|
Name: "alternate_export",
|
||||||
@@ -558,6 +559,9 @@ type Fs struct {
|
|||||||
isTeamDrive bool // true if this is a team drive
|
isTeamDrive bool // true if this is a team drive
|
||||||
fileFields googleapi.Field // fields to fetch file info with
|
fileFields googleapi.Field // fields to fetch file info with
|
||||||
m configmap.Mapper
|
m configmap.Mapper
|
||||||
|
grouping int32 // number of IDs to search at once in ListR - read with atomic
|
||||||
|
listRmu *sync.Mutex // protects listRempties
|
||||||
|
listRempties map[string]struct{} // IDs of supposedly empty directories which triggered grouping disable
|
||||||
}
|
}
|
||||||
|
|
||||||
type baseObject struct {
|
type baseObject struct {
|
||||||
@@ -1079,11 +1083,14 @@ func NewFs(name, path string, m configmap.Mapper) (fs.Fs, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
f := &Fs{
|
f := &Fs{
|
||||||
name: name,
|
name: name,
|
||||||
root: root,
|
root: root,
|
||||||
opt: *opt,
|
opt: *opt,
|
||||||
pacer: newPacer(opt),
|
pacer: newPacer(opt),
|
||||||
m: m,
|
m: m,
|
||||||
|
grouping: listRGrouping,
|
||||||
|
listRmu: new(sync.Mutex),
|
||||||
|
listRempties: make(map[string]struct{}),
|
||||||
}
|
}
|
||||||
f.isTeamDrive = opt.TeamDriveID != ""
|
f.isTeamDrive = opt.TeamDriveID != ""
|
||||||
f.fileFields = f.getFileFields()
|
f.fileFields = f.getFileFields()
|
||||||
@@ -1109,14 +1116,15 @@ func NewFs(name, path string, m configmap.Mapper) (fs.Fs, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// set root folder for a team drive or query the user root folder
|
// Set the root folder ID
|
||||||
if opt.RootFolderID != "" {
|
if opt.RootFolderID != "" {
|
||||||
// override root folder if set or cached in the config
|
// use root_folder ID if set
|
||||||
f.rootFolderID = opt.RootFolderID
|
f.rootFolderID = opt.RootFolderID
|
||||||
} else if f.isTeamDrive {
|
} else if f.isTeamDrive {
|
||||||
|
// otherwise use team_drive if set
|
||||||
f.rootFolderID = f.opt.TeamDriveID
|
f.rootFolderID = f.opt.TeamDriveID
|
||||||
} else {
|
} else {
|
||||||
// Look up the root ID and cache it in the config
|
// otherwise look up the actual root ID
|
||||||
rootID, err := f.getRootID()
|
rootID, err := f.getRootID()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if gerr, ok := errors.Cause(err).(*googleapi.Error); ok && gerr.Code == 404 {
|
if gerr, ok := errors.Cause(err).(*googleapi.Error); ok && gerr.Code == 404 {
|
||||||
@@ -1128,7 +1136,7 @@ func NewFs(name, path string, m configmap.Mapper) (fs.Fs, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
f.rootFolderID = rootID
|
f.rootFolderID = rootID
|
||||||
m.Set("root_folder_id", rootID)
|
fs.Debugf(f, "root_folder_id = %q - save this in the config to speed up startup", rootID)
|
||||||
}
|
}
|
||||||
|
|
||||||
f.dirCache = dircache.New(root, f.rootFolderID, f)
|
f.dirCache = dircache.New(root, f.rootFolderID, f)
|
||||||
@@ -1330,6 +1338,10 @@ func (f *Fs) newObjectWithExportInfo(
|
|||||||
// and not from a listing. This is unlikely.
|
// and not from a listing. This is unlikely.
|
||||||
fs.Debugf(remote, "Ignoring shortcut as skip shortcuts is set")
|
fs.Debugf(remote, "Ignoring shortcut as skip shortcuts is set")
|
||||||
return nil, fs.ErrorObjectNotFound
|
return nil, fs.ErrorObjectNotFound
|
||||||
|
case info.MimeType == shortcutMimeTypeDangling:
|
||||||
|
// Pretend a dangling shortcut is a regular object
|
||||||
|
// It will error if used, but appear in listings so it can be deleted
|
||||||
|
return f.newRegularObject(remote, info), nil
|
||||||
case info.Md5Checksum != "" || info.Size > 0:
|
case info.Md5Checksum != "" || info.Size > 0:
|
||||||
// If item has MD5 sum or a length it is a file stored on drive
|
// If item has MD5 sum or a length it is a file stored on drive
|
||||||
return f.newRegularObject(remote, info), nil
|
return f.newRegularObject(remote, info), nil
|
||||||
@@ -1402,6 +1414,7 @@ func (f *Fs) CreateDir(ctx context.Context, pathID, leaf string) (newID string,
|
|||||||
leaf = f.opt.Enc.FromStandardName(leaf)
|
leaf = f.opt.Enc.FromStandardName(leaf)
|
||||||
// fmt.Println("Making", path)
|
// fmt.Println("Making", path)
|
||||||
// Define the metadata for the directory we are going to create.
|
// Define the metadata for the directory we are going to create.
|
||||||
|
pathID = actualID(pathID)
|
||||||
createInfo := &drive.File{
|
createInfo := &drive.File{
|
||||||
Name: leaf,
|
Name: leaf,
|
||||||
Description: leaf,
|
Description: leaf,
|
||||||
@@ -1634,15 +1647,17 @@ func (s listRSlices) Less(i, j int) bool {
|
|||||||
// In each cycle it will read up to grouping entries from the in channel without blocking.
|
// In each cycle it will read up to grouping entries from the in channel without blocking.
|
||||||
// If an error occurs it will be send to the out channel and then return. Once the in channel is closed,
|
// If an error occurs it will be send to the out channel and then return. Once the in channel is closed,
|
||||||
// nil is send to the out channel and the function returns.
|
// nil is send to the out channel and the function returns.
|
||||||
func (f *Fs) listRRunner(ctx context.Context, wg *sync.WaitGroup, in <-chan listREntry, out chan<- error, cb func(fs.DirEntry) error, grouping int) {
|
func (f *Fs) listRRunner(ctx context.Context, wg *sync.WaitGroup, in chan listREntry, out chan<- error, cb func(fs.DirEntry) error) {
|
||||||
var dirs []string
|
var dirs []string
|
||||||
var paths []string
|
var paths []string
|
||||||
|
var grouping int32
|
||||||
|
|
||||||
for dir := range in {
|
for dir := range in {
|
||||||
dirs = append(dirs[:0], dir.id)
|
dirs = append(dirs[:0], dir.id)
|
||||||
paths = append(paths[:0], dir.path)
|
paths = append(paths[:0], dir.path)
|
||||||
|
grouping = atomic.LoadInt32(&f.grouping)
|
||||||
waitloop:
|
waitloop:
|
||||||
for i := 1; i < grouping; i++ {
|
for i := int32(1); i < grouping; i++ {
|
||||||
select {
|
select {
|
||||||
case d, ok := <-in:
|
case d, ok := <-in:
|
||||||
if !ok {
|
if !ok {
|
||||||
@@ -1655,6 +1670,7 @@ func (f *Fs) listRRunner(ctx context.Context, wg *sync.WaitGroup, in <-chan list
|
|||||||
}
|
}
|
||||||
listRSlices{dirs, paths}.Sort()
|
listRSlices{dirs, paths}.Sort()
|
||||||
var iErr error
|
var iErr error
|
||||||
|
foundItems := false
|
||||||
_, err := f.list(ctx, dirs, "", false, false, false, func(item *drive.File) bool {
|
_, err := f.list(ctx, dirs, "", false, false, false, func(item *drive.File) bool {
|
||||||
// shared with me items have no parents when at the root
|
// shared with me items have no parents when at the root
|
||||||
if f.opt.SharedWithMe && len(item.Parents) == 0 && len(paths) == 1 && paths[0] == "" {
|
if f.opt.SharedWithMe && len(item.Parents) == 0 && len(paths) == 1 && paths[0] == "" {
|
||||||
@@ -1662,6 +1678,7 @@ func (f *Fs) listRRunner(ctx context.Context, wg *sync.WaitGroup, in <-chan list
|
|||||||
}
|
}
|
||||||
for _, parent := range item.Parents {
|
for _, parent := range item.Parents {
|
||||||
var i int
|
var i int
|
||||||
|
foundItems = true
|
||||||
earlyExit := false
|
earlyExit := false
|
||||||
// If only one item in paths then no need to search for the ID
|
// If only one item in paths then no need to search for the ID
|
||||||
// assuming google drive is doing its job properly.
|
// assuming google drive is doing its job properly.
|
||||||
@@ -1702,6 +1719,53 @@ func (f *Fs) listRRunner(ctx context.Context, wg *sync.WaitGroup, in <-chan list
|
|||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
})
|
})
|
||||||
|
// Found no items in more than one directory. Retry these as
|
||||||
|
// individual directories This is to work around a bug in google
|
||||||
|
// drive where (A in parents) or (B in parents) returns nothing
|
||||||
|
// sometimes. See #3114, #4289 and
|
||||||
|
// https://issuetracker.google.com/issues/149522397
|
||||||
|
if len(dirs) > 1 && !foundItems {
|
||||||
|
if atomic.SwapInt32(&f.grouping, 1) != 1 {
|
||||||
|
fs.Debugf(f, "Disabling ListR to work around bug in drive as multi listing (%d) returned no entries", len(dirs))
|
||||||
|
}
|
||||||
|
var recycled = make([]listREntry, len(dirs))
|
||||||
|
f.listRmu.Lock()
|
||||||
|
for i := range dirs {
|
||||||
|
recycled[i] = listREntry{id: dirs[i], path: paths[i]}
|
||||||
|
// Make a note of these dirs - if they all turn
|
||||||
|
// out to be empty then we can re-enable grouping
|
||||||
|
f.listRempties[dirs[i]] = struct{}{}
|
||||||
|
}
|
||||||
|
f.listRmu.Unlock()
|
||||||
|
// recycle these in the background so we don't deadlock
|
||||||
|
// the listR runners if they all get here
|
||||||
|
wg.Add(len(recycled))
|
||||||
|
go func() {
|
||||||
|
for _, entry := range recycled {
|
||||||
|
in <- entry
|
||||||
|
}
|
||||||
|
fs.Debugf(f, "Recycled %d entries", len(recycled))
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
// If using a grouping of 1 and dir was empty then check to see if it
|
||||||
|
// is part of the group that caused grouping to be disabled.
|
||||||
|
if grouping == 1 && len(dirs) == 1 && !foundItems {
|
||||||
|
f.listRmu.Lock()
|
||||||
|
if _, found := f.listRempties[dirs[0]]; found {
|
||||||
|
// Remove the ID
|
||||||
|
delete(f.listRempties, dirs[0])
|
||||||
|
// If no empties left => all the directories that
|
||||||
|
// triggered the grouping being set to 1 were actually
|
||||||
|
// empty so must have made a mistake
|
||||||
|
if len(f.listRempties) == 0 {
|
||||||
|
if atomic.SwapInt32(&f.grouping, listRGrouping) != listRGrouping {
|
||||||
|
fs.Debugf(f, "Re-enabling ListR as previous detection was in error")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f.listRmu.Unlock()
|
||||||
|
}
|
||||||
|
|
||||||
for range dirs {
|
for range dirs {
|
||||||
wg.Done()
|
wg.Done()
|
||||||
}
|
}
|
||||||
@@ -1736,11 +1800,6 @@ func (f *Fs) listRRunner(ctx context.Context, wg *sync.WaitGroup, in <-chan list
|
|||||||
// Don't implement this unless you have a more efficient way
|
// Don't implement this unless you have a more efficient way
|
||||||
// of listing recursively that doing a directory traversal.
|
// of listing recursively that doing a directory traversal.
|
||||||
func (f *Fs) ListR(ctx context.Context, dir string, callback fs.ListRCallback) (err error) {
|
func (f *Fs) ListR(ctx context.Context, dir string, callback fs.ListRCallback) (err error) {
|
||||||
const (
|
|
||||||
grouping = 50
|
|
||||||
inputBuffer = 1000
|
|
||||||
)
|
|
||||||
|
|
||||||
err = f.dirCache.FindRoot(ctx, false)
|
err = f.dirCache.FindRoot(ctx, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -1753,7 +1812,7 @@ func (f *Fs) ListR(ctx context.Context, dir string, callback fs.ListRCallback) (
|
|||||||
|
|
||||||
mu := sync.Mutex{} // protects in and overflow
|
mu := sync.Mutex{} // protects in and overflow
|
||||||
wg := sync.WaitGroup{}
|
wg := sync.WaitGroup{}
|
||||||
in := make(chan listREntry, inputBuffer)
|
in := make(chan listREntry, listRInputBuffer)
|
||||||
out := make(chan error, fs.Config.Checkers)
|
out := make(chan error, fs.Config.Checkers)
|
||||||
list := walk.NewListRHelper(callback)
|
list := walk.NewListRHelper(callback)
|
||||||
overflow := []listREntry{}
|
overflow := []listREntry{}
|
||||||
@@ -1766,6 +1825,9 @@ func (f *Fs) ListR(ctx context.Context, dir string, callback fs.ListRCallback) (
|
|||||||
job := listREntry{actualID(d.ID()), d.Remote()}
|
job := listREntry{actualID(d.ID()), d.Remote()}
|
||||||
select {
|
select {
|
||||||
case in <- job:
|
case in <- job:
|
||||||
|
// Adding the wg after we've entered the item is
|
||||||
|
// safe here because we know when the callback
|
||||||
|
// is called we are holding a waitgroup.
|
||||||
wg.Add(1)
|
wg.Add(1)
|
||||||
default:
|
default:
|
||||||
overflow = append(overflow, job)
|
overflow = append(overflow, job)
|
||||||
@@ -1779,7 +1841,7 @@ func (f *Fs) ListR(ctx context.Context, dir string, callback fs.ListRCallback) (
|
|||||||
in <- listREntry{directoryID, dir}
|
in <- listREntry{directoryID, dir}
|
||||||
|
|
||||||
for i := 0; i < fs.Config.Checkers; i++ {
|
for i := 0; i < fs.Config.Checkers; i++ {
|
||||||
go f.listRRunner(ctx, &wg, in, out, cb, grouping)
|
go f.listRRunner(ctx, &wg, in, out, cb)
|
||||||
}
|
}
|
||||||
go func() {
|
go func() {
|
||||||
// wait until the all directories are processed
|
// wait until the all directories are processed
|
||||||
@@ -1789,8 +1851,8 @@ func (f *Fs) ListR(ctx context.Context, dir string, callback fs.ListRCallback) (
|
|||||||
mu.Lock()
|
mu.Lock()
|
||||||
l := len(overflow)
|
l := len(overflow)
|
||||||
// only fill half of the channel to prevent entries being put into overflow again
|
// only fill half of the channel to prevent entries being put into overflow again
|
||||||
if l > inputBuffer/2 {
|
if l > listRInputBuffer/2 {
|
||||||
l = inputBuffer / 2
|
l = listRInputBuffer / 2
|
||||||
}
|
}
|
||||||
wg.Add(l)
|
wg.Add(l)
|
||||||
for _, d := range overflow[:l] {
|
for _, d := range overflow[:l] {
|
||||||
@@ -1912,11 +1974,18 @@ func (f *Fs) resolveShortcut(item *drive.File) (newItem *drive.File, err error)
|
|||||||
}
|
}
|
||||||
newItem, err = f.getFile(item.ShortcutDetails.TargetId, f.fileFields)
|
newItem, err = f.getFile(item.ShortcutDetails.TargetId, f.fileFields)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
if gerr, ok := errors.Cause(err).(*googleapi.Error); ok && gerr.Code == 404 {
|
||||||
|
// 404 means dangling shortcut, so just return the shortcut with the mime type mangled
|
||||||
|
fs.Logf(nil, "Dangling shortcut %q detected", item.Name)
|
||||||
|
item.MimeType = shortcutMimeTypeDangling
|
||||||
|
return item, nil
|
||||||
|
}
|
||||||
return nil, errors.Wrap(err, "failed to resolve shortcut")
|
return nil, errors.Wrap(err, "failed to resolve shortcut")
|
||||||
}
|
}
|
||||||
// make sure we use the Name and Parents from the original item
|
// make sure we use the Name, Parents and Trashed from the original item
|
||||||
newItem.Name = item.Name
|
newItem.Name = item.Name
|
||||||
newItem.Parents = item.Parents
|
newItem.Parents = item.Parents
|
||||||
|
newItem.Trashed = item.Trashed
|
||||||
// the new ID is a composite ID
|
// the new ID is a composite ID
|
||||||
newItem.Id = joinID(newItem.Id, item.Id)
|
newItem.Id = joinID(newItem.Id, item.Id)
|
||||||
return newItem, nil
|
return newItem, nil
|
||||||
@@ -3219,6 +3288,9 @@ func (o *baseObject) open(ctx context.Context, url string, options ...fs.OpenOpt
|
|||||||
|
|
||||||
// Open an object for read
|
// Open an object for read
|
||||||
func (o *Object) Open(ctx context.Context, options ...fs.OpenOption) (in io.ReadCloser, err error) {
|
func (o *Object) Open(ctx context.Context, options ...fs.OpenOption) (in io.ReadCloser, err error) {
|
||||||
|
if o.mimeType == shortcutMimeTypeDangling {
|
||||||
|
return nil, errors.New("can't read dangling shortcut")
|
||||||
|
}
|
||||||
if o.v2Download {
|
if o.v2Download {
|
||||||
var v2File *drive_v2.File
|
var v2File *drive_v2.File
|
||||||
err = o.fs.pacer.Call(func() (bool, error) {
|
err = o.fs.pacer.Call(func() (bool, error) {
|
||||||
|
|||||||
@@ -1121,9 +1121,10 @@ func (f *Fs) Move(ctx context.Context, src fs.Object, remote string) (fs.Object,
|
|||||||
id, dstDriveID, _ := parseNormalizedID(directoryID)
|
id, dstDriveID, _ := parseNormalizedID(directoryID)
|
||||||
_, srcObjDriveID, _ := parseNormalizedID(srcObj.id)
|
_, srcObjDriveID, _ := parseNormalizedID(srcObj.id)
|
||||||
|
|
||||||
if dstDriveID != srcObjDriveID {
|
if f.canonicalDriveID(dstDriveID) != srcObj.fs.canonicalDriveID(srcObjDriveID) {
|
||||||
// https://docs.microsoft.com/en-us/graph/api/driveitem-move?view=graph-rest-1.0
|
// https://docs.microsoft.com/en-us/graph/api/driveitem-move?view=graph-rest-1.0
|
||||||
// "Items cannot be moved between Drives using this request."
|
// "Items cannot be moved between Drives using this request."
|
||||||
|
fs.Debugf(f, "Can't move files between drives (%q != %q)", dstDriveID, srcObjDriveID)
|
||||||
return nil, fs.ErrorCantMove
|
return nil, fs.ErrorCantMove
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1219,9 +1220,10 @@ func (f *Fs) DirMove(ctx context.Context, src fs.Fs, srcRemote, dstRemote string
|
|||||||
}
|
}
|
||||||
_, srcDriveID, _ := parseNormalizedID(srcID)
|
_, srcDriveID, _ := parseNormalizedID(srcID)
|
||||||
|
|
||||||
if dstDriveID != srcDriveID {
|
if f.canonicalDriveID(dstDriveID) != srcFs.canonicalDriveID(srcDriveID) {
|
||||||
// https://docs.microsoft.com/en-us/graph/api/driveitem-move?view=graph-rest-1.0
|
// https://docs.microsoft.com/en-us/graph/api/driveitem-move?view=graph-rest-1.0
|
||||||
// "Items cannot be moved between Drives using this request."
|
// "Items cannot be moved between Drives using this request."
|
||||||
|
fs.Debugf(f, "Can't move directories between drives (%q != %q)", dstDriveID, srcDriveID)
|
||||||
return fs.ErrorCantDirMove
|
return fs.ErrorCantDirMove
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1869,6 +1871,17 @@ func parseNormalizedID(ID string) (string, string, string) {
|
|||||||
return ID, "", ""
|
return ID, "", ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Returns the canonical form of the driveID
|
||||||
|
func (f *Fs) canonicalDriveID(driveID string) (canonicalDriveID string) {
|
||||||
|
if driveID == "" {
|
||||||
|
canonicalDriveID = f.opt.DriveID
|
||||||
|
} else {
|
||||||
|
canonicalDriveID = driveID
|
||||||
|
}
|
||||||
|
canonicalDriveID = strings.ToLower(canonicalDriveID)
|
||||||
|
return canonicalDriveID
|
||||||
|
}
|
||||||
|
|
||||||
// getRelativePathInsideBase checks if `target` is inside `base`. If so, it
|
// getRelativePathInsideBase checks if `target` is inside `base`. If so, it
|
||||||
// returns a relative path for `target` based on `base` and a boolean `true`.
|
// returns a relative path for `target` based on `base` and a boolean `true`.
|
||||||
// Otherwise returns "", false.
|
// Otherwise returns "", false.
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ const (
|
|||||||
minSleep = 10 * time.Millisecond
|
minSleep = 10 * time.Millisecond
|
||||||
maxSleep = 2 * time.Second
|
maxSleep = 2 * time.Second
|
||||||
decayConstant = 2 // bigger for slower decay, exponential
|
decayConstant = 2 // bigger for slower decay, exponential
|
||||||
rootURL = "https://api.pcloud.com"
|
defaultHostname = "api.pcloud.com"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Globals
|
// Globals
|
||||||
@@ -51,8 +51,8 @@ var (
|
|||||||
oauthConfig = &oauth2.Config{
|
oauthConfig = &oauth2.Config{
|
||||||
Scopes: nil,
|
Scopes: nil,
|
||||||
Endpoint: oauth2.Endpoint{
|
Endpoint: oauth2.Endpoint{
|
||||||
AuthURL: "https://my.pcloud.com/oauth2/authorize",
|
AuthURL: "https://my.pcloud.com/oauth2/authorize",
|
||||||
TokenURL: "https://api.pcloud.com/oauth2_token",
|
// TokenURL: "https://api.pcloud.com/oauth2_token", set by updateTokenURL
|
||||||
},
|
},
|
||||||
ClientID: rcloneClientID,
|
ClientID: rcloneClientID,
|
||||||
ClientSecret: obscure.MustReveal(rcloneEncryptedClientSecret),
|
ClientSecret: obscure.MustReveal(rcloneEncryptedClientSecret),
|
||||||
@@ -60,17 +60,45 @@ var (
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Update the TokenURL with the actual hostname
|
||||||
|
func updateTokenURL(oauthConfig *oauth2.Config, hostname string) {
|
||||||
|
oauthConfig.Endpoint.TokenURL = "https://" + hostname + "/oauth2_token"
|
||||||
|
}
|
||||||
|
|
||||||
// Register with Fs
|
// Register with Fs
|
||||||
func init() {
|
func init() {
|
||||||
|
updateTokenURL(oauthConfig, defaultHostname)
|
||||||
fs.Register(&fs.RegInfo{
|
fs.Register(&fs.RegInfo{
|
||||||
Name: "pcloud",
|
Name: "pcloud",
|
||||||
Description: "Pcloud",
|
Description: "Pcloud",
|
||||||
NewFs: NewFs,
|
NewFs: NewFs,
|
||||||
Config: func(name string, m configmap.Mapper) {
|
Config: func(name string, m configmap.Mapper) {
|
||||||
|
optc := new(Options)
|
||||||
|
err := configstruct.Set(m, optc)
|
||||||
|
if err != nil {
|
||||||
|
fs.Errorf(nil, "Failed to read config: %v", err)
|
||||||
|
}
|
||||||
|
updateTokenURL(oauthConfig, optc.Hostname)
|
||||||
|
checkAuth := func(oauthConfig *oauth2.Config, auth *oauthutil.AuthResult) error {
|
||||||
|
if auth == nil || auth.Form == nil {
|
||||||
|
return errors.New("form not found in response")
|
||||||
|
}
|
||||||
|
hostname := auth.Form.Get("hostname")
|
||||||
|
if hostname == "" {
|
||||||
|
hostname = defaultHostname
|
||||||
|
}
|
||||||
|
// Save the hostname in the config
|
||||||
|
m.Set("hostname", hostname)
|
||||||
|
// Update the token URL
|
||||||
|
updateTokenURL(oauthConfig, hostname)
|
||||||
|
fs.Debugf(nil, "pcloud: got hostname %q", hostname)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
opt := oauthutil.Options{
|
opt := oauthutil.Options{
|
||||||
|
CheckAuth: checkAuth,
|
||||||
StateBlankOK: true, // pCloud seems to drop the state parameter now - see #4210
|
StateBlankOK: true, // pCloud seems to drop the state parameter now - see #4210
|
||||||
}
|
}
|
||||||
err := oauthutil.Config("pcloud", name, m, oauthConfig, &opt)
|
err = oauthutil.Config("pcloud", name, m, oauthConfig, &opt)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("Failed to configure token: %v", err)
|
log.Fatalf("Failed to configure token: %v", err)
|
||||||
}
|
}
|
||||||
@@ -96,6 +124,13 @@ func init() {
|
|||||||
Help: "Fill in for rclone to use a non root folder as its starting point.",
|
Help: "Fill in for rclone to use a non root folder as its starting point.",
|
||||||
Default: "d0",
|
Default: "d0",
|
||||||
Advanced: true,
|
Advanced: true,
|
||||||
|
}, {
|
||||||
|
Name: "hostname",
|
||||||
|
Help: `Hostname to connect to.
|
||||||
|
|
||||||
|
This is normally set when rclone initially does the oauth connection.`,
|
||||||
|
Default: defaultHostname,
|
||||||
|
Advanced: true,
|
||||||
}},
|
}},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -104,6 +139,7 @@ func init() {
|
|||||||
type Options struct {
|
type Options struct {
|
||||||
Enc encoder.MultiEncoder `config:"encoding"`
|
Enc encoder.MultiEncoder `config:"encoding"`
|
||||||
RootFolderID string `config:"root_folder_id"`
|
RootFolderID string `config:"root_folder_id"`
|
||||||
|
Hostname string `config:"hostname"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fs represents a remote pcloud
|
// Fs represents a remote pcloud
|
||||||
@@ -253,12 +289,13 @@ func NewFs(name, root string, m configmap.Mapper) (fs.Fs, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrap(err, "failed to configure Pcloud")
|
return nil, errors.Wrap(err, "failed to configure Pcloud")
|
||||||
}
|
}
|
||||||
|
updateTokenURL(oauthConfig, opt.Hostname)
|
||||||
|
|
||||||
f := &Fs{
|
f := &Fs{
|
||||||
name: name,
|
name: name,
|
||||||
root: root,
|
root: root,
|
||||||
opt: *opt,
|
opt: *opt,
|
||||||
srv: rest.NewClient(oAuthClient).SetRoot(rootURL),
|
srv: rest.NewClient(oAuthClient).SetRoot("https://" + opt.Hostname),
|
||||||
pacer: fs.NewPacer(pacer.NewDefault(pacer.MinSleep(minSleep), pacer.MaxSleep(maxSleep), pacer.DecayConstant(decayConstant))),
|
pacer: fs.NewPacer(pacer.NewDefault(pacer.MinSleep(minSleep), pacer.MaxSleep(maxSleep), pacer.DecayConstant(decayConstant))),
|
||||||
}
|
}
|
||||||
f.features = (&fs.Features{
|
f.features = (&fs.Features{
|
||||||
|
|||||||
@@ -248,7 +248,10 @@ func (o *Object) Open(ctx context.Context, options ...fs.OpenOption) (in io.Read
|
|||||||
_ = resp.Body.Close()
|
_ = resp.Body.Close()
|
||||||
return nil, fserrors.NoRetryError(err)
|
return nil, fserrors.NoRetryError(err)
|
||||||
}
|
}
|
||||||
return resp.Body, err
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return resp.Body, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update the already existing object
|
// Update the already existing object
|
||||||
|
|||||||
@@ -59,6 +59,7 @@ import (
|
|||||||
"github.com/rclone/rclone/lib/pool"
|
"github.com/rclone/rclone/lib/pool"
|
||||||
"github.com/rclone/rclone/lib/readers"
|
"github.com/rclone/rclone/lib/readers"
|
||||||
"github.com/rclone/rclone/lib/rest"
|
"github.com/rclone/rclone/lib/rest"
|
||||||
|
"github.com/rclone/rclone/lib/structs"
|
||||||
"golang.org/x/sync/errgroup"
|
"golang.org/x/sync/errgroup"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -1126,9 +1127,6 @@ func s3Connection(opt *Options) (*s3.S3, *session.Session, error) {
|
|||||||
return nil, nil, errors.New("secret_access_key not found")
|
return nil, nil, errors.New("secret_access_key not found")
|
||||||
}
|
}
|
||||||
|
|
||||||
if opt.Region == "" && opt.Endpoint == "" {
|
|
||||||
opt.Endpoint = "https://s3.amazonaws.com/"
|
|
||||||
}
|
|
||||||
if opt.Region == "" {
|
if opt.Region == "" {
|
||||||
opt.Region = "us-east-1"
|
opt.Region = "us-east-1"
|
||||||
}
|
}
|
||||||
@@ -2033,11 +2031,17 @@ func (o *Object) readMetaData(ctx context.Context) (err error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
if awsErr, ok := err.(awserr.RequestFailure); ok {
|
if awsErr, ok := err.(awserr.RequestFailure); ok {
|
||||||
if awsErr.StatusCode() == http.StatusNotFound {
|
if awsErr.StatusCode() == http.StatusNotFound {
|
||||||
|
// NotFound indicates bucket was OK
|
||||||
|
// NoSuchBucket would be returned if bucket was bad
|
||||||
|
if awsErr.Code() == "NotFound" {
|
||||||
|
o.fs.cache.MarkOK(bucket)
|
||||||
|
}
|
||||||
return fs.ErrorObjectNotFound
|
return fs.ErrorObjectNotFound
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
o.fs.cache.MarkOK(bucket)
|
||||||
var size int64
|
var size int64
|
||||||
// Ignore missing Content-Length assuming it is 0
|
// Ignore missing Content-Length assuming it is 0
|
||||||
// Some versions of ceph do this due their apache proxies
|
// Some versions of ceph do this due their apache proxies
|
||||||
@@ -2198,19 +2202,12 @@ func (o *Object) uploadMultipart(ctx context.Context, req *s3.PutObjectInput, si
|
|||||||
|
|
||||||
memPool := f.getMemoryPool(int64(partSize))
|
memPool := f.getMemoryPool(int64(partSize))
|
||||||
|
|
||||||
|
var mReq s3.CreateMultipartUploadInput
|
||||||
|
structs.SetFrom(&mReq, req)
|
||||||
var cout *s3.CreateMultipartUploadOutput
|
var cout *s3.CreateMultipartUploadOutput
|
||||||
err = f.pacer.Call(func() (bool, error) {
|
err = f.pacer.Call(func() (bool, error) {
|
||||||
var err error
|
var err error
|
||||||
cout, err = f.c.CreateMultipartUploadWithContext(ctx, &s3.CreateMultipartUploadInput{
|
cout, err = f.c.CreateMultipartUploadWithContext(ctx, &mReq)
|
||||||
Bucket: req.Bucket,
|
|
||||||
ACL: req.ACL,
|
|
||||||
Key: req.Key,
|
|
||||||
ContentType: req.ContentType,
|
|
||||||
Metadata: req.Metadata,
|
|
||||||
ServerSideEncryption: req.ServerSideEncryption,
|
|
||||||
SSEKMSKeyId: req.SSEKMSKeyId,
|
|
||||||
StorageClass: req.StorageClass,
|
|
||||||
})
|
|
||||||
return f.shouldRetry(err)
|
return f.shouldRetry(err)
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -2423,6 +2420,35 @@ func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, op
|
|||||||
if o.fs.opt.StorageClass != "" {
|
if o.fs.opt.StorageClass != "" {
|
||||||
req.StorageClass = &o.fs.opt.StorageClass
|
req.StorageClass = &o.fs.opt.StorageClass
|
||||||
}
|
}
|
||||||
|
// Apply upload options
|
||||||
|
for _, option := range options {
|
||||||
|
key, value := option.Header()
|
||||||
|
lowerKey := strings.ToLower(key)
|
||||||
|
switch lowerKey {
|
||||||
|
case "":
|
||||||
|
// ignore
|
||||||
|
case "cache-control":
|
||||||
|
req.CacheControl = aws.String(value)
|
||||||
|
case "content-disposition":
|
||||||
|
req.ContentDisposition = aws.String(value)
|
||||||
|
case "content-encoding":
|
||||||
|
req.ContentEncoding = aws.String(value)
|
||||||
|
case "content-language":
|
||||||
|
req.ContentLanguage = aws.String(value)
|
||||||
|
case "content-type":
|
||||||
|
req.ContentType = aws.String(value)
|
||||||
|
case "x-amz-tagging":
|
||||||
|
req.Tagging = aws.String(value)
|
||||||
|
default:
|
||||||
|
const amzMetaPrefix = "x-amz-meta-"
|
||||||
|
if strings.HasPrefix(lowerKey, amzMetaPrefix) {
|
||||||
|
metaKey := lowerKey[len(amzMetaPrefix):]
|
||||||
|
req.Metadata[metaKey] = aws.String(value)
|
||||||
|
} else {
|
||||||
|
fs.Errorf(o, "Don't know how to set key %q on upload", key)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if multipart {
|
if multipart {
|
||||||
err = o.uploadMultipart(ctx, &req, size, in)
|
err = o.uploadMultipart(ctx, &req, size, in)
|
||||||
@@ -2463,18 +2489,6 @@ func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, op
|
|||||||
httpReq.Header = headers
|
httpReq.Header = headers
|
||||||
httpReq.ContentLength = size
|
httpReq.ContentLength = size
|
||||||
|
|
||||||
for _, option := range options {
|
|
||||||
switch option.(type) {
|
|
||||||
case *fs.HTTPOption:
|
|
||||||
key, value := option.Header()
|
|
||||||
httpReq.Header.Add(key, value)
|
|
||||||
default:
|
|
||||||
if option.Mandatory() {
|
|
||||||
fs.Logf(o, "Unsupported mandatory option: %v", option)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
err = o.fs.pacer.CallNoRetry(func() (bool, error) {
|
err = o.fs.pacer.CallNoRetry(func() (bool, error) {
|
||||||
resp, err := o.fs.srv.Do(httpReq)
|
resp, err := o.fs.srv.Do(httpReq)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -395,8 +395,8 @@ func NewFs(name, root string, m configmap.Mapper) (fs.Fs, error) {
|
|||||||
|
|
||||||
keyFile := env.ShellExpand(opt.KeyFile)
|
keyFile := env.ShellExpand(opt.KeyFile)
|
||||||
//keyPem := env.ShellExpand(opt.KeyPem)
|
//keyPem := env.ShellExpand(opt.KeyPem)
|
||||||
// Add ssh agent-auth if no password or file specified
|
// Add ssh agent-auth if no password or file or key PEM specified
|
||||||
if (opt.Pass == "" && keyFile == "" && !opt.AskPassword) || opt.KeyUseAgent {
|
if (opt.Pass == "" && keyFile == "" && !opt.AskPassword && opt.KeyPem == "") || opt.KeyUseAgent {
|
||||||
sshAgentClient, _, err := sshagent.New()
|
sshAgentClient, _, err := sshagent.New()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrap(err, "couldn't connect to ssh-agent")
|
return nil, errors.Wrap(err, "couldn't connect to ssh-agent")
|
||||||
|
|||||||
@@ -1124,6 +1124,9 @@ func (o *Object) removeSegments(except string) error {
|
|||||||
// remove the segments container if empty, ignore errors
|
// remove the segments container if empty, ignore errors
|
||||||
err = o.fs.pacer.Call(func() (bool, error) {
|
err = o.fs.pacer.Call(func() (bool, error) {
|
||||||
err = o.fs.c.ContainerDelete(segmentsContainer)
|
err = o.fs.c.ContainerDelete(segmentsContainer)
|
||||||
|
if err == swift.ContainerNotFound || err == swift.ContainerNotEmpty {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
return shouldRetry(err)
|
return shouldRetry(err)
|
||||||
})
|
})
|
||||||
if err == nil {
|
if err == nil {
|
||||||
|
|||||||
@@ -269,7 +269,9 @@ func (f *Fs) connect(ctx context.Context) (project *uplink.Project, err error) {
|
|||||||
fs.Debugf(f, "connecting...")
|
fs.Debugf(f, "connecting...")
|
||||||
defer fs.Debugf(f, "connected: %+v", err)
|
defer fs.Debugf(f, "connected: %+v", err)
|
||||||
|
|
||||||
cfg := uplink.Config{}
|
cfg := uplink.Config{
|
||||||
|
UserAgent: "rclone",
|
||||||
|
}
|
||||||
|
|
||||||
project, err = cfg.OpenProject(ctx, f.access)
|
project, err = cfg.OpenProject(ctx, f.access)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -226,6 +226,6 @@ func (t *Time) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
|
|||||||
// </d:response>
|
// </d:response>
|
||||||
// </d:multistatus>
|
// </d:multistatus>
|
||||||
type Quota struct {
|
type Quota struct {
|
||||||
Available int64 `xml:"DAV: response>propstat>prop>quota-available-bytes"`
|
Available string `xml:"DAV: response>propstat>prop>quota-available-bytes"`
|
||||||
Used int64 `xml:"DAV: response>propstat>prop>quota-used-bytes"`
|
Used string `xml:"DAV: response>propstat>prop>quota-used-bytes"`
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ import (
|
|||||||
"net/url"
|
"net/url"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"path"
|
"path"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -975,10 +976,7 @@ func (f *Fs) About(ctx context.Context) (*fs.Usage, error) {
|
|||||||
</D:prop>
|
</D:prop>
|
||||||
</D:propfind>
|
</D:propfind>
|
||||||
`))
|
`))
|
||||||
var q = api.Quota{
|
var q api.Quota
|
||||||
Available: -1,
|
|
||||||
Used: -1,
|
|
||||||
}
|
|
||||||
var resp *http.Response
|
var resp *http.Response
|
||||||
var err error
|
var err error
|
||||||
err = f.pacer.Call(func() (bool, error) {
|
err = f.pacer.Call(func() (bool, error) {
|
||||||
@@ -989,14 +987,14 @@ func (f *Fs) About(ctx context.Context) (*fs.Usage, error) {
|
|||||||
return nil, errors.Wrap(err, "about call failed")
|
return nil, errors.Wrap(err, "about call failed")
|
||||||
}
|
}
|
||||||
usage := &fs.Usage{}
|
usage := &fs.Usage{}
|
||||||
if q.Used >= 0 {
|
if i, err := strconv.ParseInt(q.Used, 10, 64); err == nil && i >= 0 {
|
||||||
usage.Used = fs.NewUsageValue(q.Used)
|
usage.Used = fs.NewUsageValue(i)
|
||||||
}
|
}
|
||||||
if q.Available >= 0 {
|
if i, err := strconv.ParseInt(q.Available, 10, 64); err == nil && i >= 0 {
|
||||||
usage.Free = fs.NewUsageValue(q.Available)
|
usage.Free = fs.NewUsageValue(i)
|
||||||
}
|
}
|
||||||
if q.Available >= 0 && q.Used >= 0 {
|
if usage.Used != nil && usage.Free != nil {
|
||||||
usage.Total = fs.NewUsageValue(q.Available + q.Used)
|
usage.Total = fs.NewUsageValue(*usage.Used + *usage.Free)
|
||||||
}
|
}
|
||||||
return usage, nil
|
return usage, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ conversion into man pages etc.
|
|||||||
|
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
|
import time
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
docpath = "docs/content"
|
docpath = "docs/content"
|
||||||
@@ -156,17 +157,19 @@ def read_commands(docpath):
|
|||||||
if command != "rclone.md":
|
if command != "rclone.md":
|
||||||
docs.append(read_command(command))
|
docs.append(read_command(command))
|
||||||
return "\n".join(docs)
|
return "\n".join(docs)
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
check_docs(docpath)
|
check_docs(docpath)
|
||||||
command_docs = read_commands(docpath).replace("\\", "\\\\") # escape \ so we can use command_docs in re.sub
|
command_docs = read_commands(docpath).replace("\\", "\\\\") # escape \ so we can use command_docs in re.sub
|
||||||
|
build_date = datetime.utcfromtimestamp(
|
||||||
|
int(os.environ.get('SOURCE_DATE_EPOCH', time.time())))
|
||||||
with open(outfile, "w") as out:
|
with open(outfile, "w") as out:
|
||||||
out.write("""\
|
out.write("""\
|
||||||
%% rclone(1) User Manual
|
%% rclone(1) User Manual
|
||||||
%% Nick Craig-Wood
|
%% Nick Craig-Wood
|
||||||
%% %s
|
%% %s
|
||||||
|
|
||||||
""" % datetime.now().strftime("%b %d, %Y"))
|
""" % build_date.strftime("%b %d, %Y"))
|
||||||
for doc in docs:
|
for doc in docs:
|
||||||
contents = read_doc(doc)
|
contents = read_doc(doc)
|
||||||
# Substitute the commands into doc.md
|
# Substitute the commands into doc.md
|
||||||
|
|||||||
@@ -486,6 +486,9 @@ func AddBackendFlags() {
|
|||||||
help = help[:nl]
|
help = help[:nl]
|
||||||
}
|
}
|
||||||
help = strings.TrimSpace(help)
|
help = strings.TrimSpace(help)
|
||||||
|
if opt.IsPassword {
|
||||||
|
help += " (obscured)"
|
||||||
|
}
|
||||||
flag := pflag.CommandLine.VarPF(opt, name, opt.ShortOpt, help)
|
flag := pflag.CommandLine.VarPF(opt, name, opt.ShortOpt, help)
|
||||||
if _, isBool := opt.Default.(bool); isBool {
|
if _, isBool := opt.Default.(bool); isBool {
|
||||||
flag.NoOptDefVal = "true"
|
flag.NoOptDefVal = "true"
|
||||||
|
|||||||
@@ -11,9 +11,11 @@ package cmount
|
|||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/rclone/rclone/fstest/testy"
|
||||||
"github.com/rclone/rclone/vfs/vfstest"
|
"github.com/rclone/rclone/vfs/vfstest"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestMount(t *testing.T) {
|
func TestMount(t *testing.T) {
|
||||||
|
testy.SkipUnreliable(t)
|
||||||
vfstest.RunTests(t, false, mount)
|
vfstest.RunTests(t, false, mount)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,7 +33,6 @@ type frontmatter struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var frontmatterTemplate = template.Must(template.New("frontmatter").Parse(`---
|
var frontmatterTemplate = template.Must(template.New("frontmatter").Parse(`---
|
||||||
date: {{ .Date }}
|
|
||||||
title: "{{ .Title }}"
|
title: "{{ .Title }}"
|
||||||
description: "{{ .Description }}"
|
description: "{{ .Description }}"
|
||||||
slug: {{ .Slug }}
|
slug: {{ .Slug }}
|
||||||
@@ -70,8 +69,7 @@ rclone.org website.`,
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
flagsHelp := strings.Replace(buf.String(), "YYYY-MM-DD", now, -1)
|
err = ioutil.WriteFile(filepath.Join(root, "flags.md"), buf.Bytes(), 0777)
|
||||||
err = ioutil.WriteFile(filepath.Join(root, "flags.md"), []byte(flagsHelp), 0777)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -245,7 +245,6 @@ Use "rclone help backends" for a list of supported services.
|
|||||||
var docFlagsTemplate = `---
|
var docFlagsTemplate = `---
|
||||||
title: "Global Flags"
|
title: "Global Flags"
|
||||||
description: "Rclone Global Flags"
|
description: "Rclone Global Flags"
|
||||||
date: "YYYY-MM-DD"
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# Global Flags
|
# Global Flags
|
||||||
@@ -325,6 +324,9 @@ func showBackend(name string) {
|
|||||||
}
|
}
|
||||||
fmt.Printf("#### --%s%s\n\n", opt.FlagName(backend.Prefix), shortOpt)
|
fmt.Printf("#### --%s%s\n\n", opt.FlagName(backend.Prefix), shortOpt)
|
||||||
fmt.Printf("%s\n\n", opt.Help)
|
fmt.Printf("%s\n\n", opt.Help)
|
||||||
|
if opt.IsPassword {
|
||||||
|
fmt.Printf("**NB** Input to this must be obscured - see [rclone obscure](/commands/rclone_obscure/).\n\n")
|
||||||
|
}
|
||||||
fmt.Printf("- Config: %s\n", opt.Name)
|
fmt.Printf("- Config: %s\n", opt.Name)
|
||||||
fmt.Printf("- Env Var: %s\n", opt.EnvVarName(backend.Prefix))
|
fmt.Printf("- Env Var: %s\n", opt.EnvVarName(backend.Prefix))
|
||||||
fmt.Printf("- Type: %s\n", opt.Type())
|
fmt.Printf("- Type: %s\n", opt.Type())
|
||||||
|
|||||||
@@ -5,9 +5,11 @@ package mount2
|
|||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/rclone/rclone/fstest/testy"
|
||||||
"github.com/rclone/rclone/vfs/vfstest"
|
"github.com/rclone/rclone/vfs/vfstest"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestMount(t *testing.T) {
|
func TestMount(t *testing.T) {
|
||||||
|
testy.SkipUnreliable(t)
|
||||||
vfstest.RunTests(t, false, mount)
|
vfstest.RunTests(t, false, mount)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -78,7 +78,9 @@ func TestRc(t *testing.T) {
|
|||||||
|
|
||||||
// mount
|
// mount
|
||||||
_, err = mount.Fn(ctx, in)
|
_, err = mount.Fn(ctx, in)
|
||||||
require.NoError(t, err)
|
if err != nil {
|
||||||
|
t.Skipf("Mount failed - skipping test: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
// check file.txt is there now
|
// check file.txt is there now
|
||||||
fi, err := os.Stat(filePath)
|
fi, err := os.Stat(filePath)
|
||||||
|
|||||||
@@ -14,7 +14,21 @@ func init() {
|
|||||||
|
|
||||||
var commandDefinition = &cobra.Command{
|
var commandDefinition = &cobra.Command{
|
||||||
Use: "obscure password",
|
Use: "obscure password",
|
||||||
Short: `Obscure password for use in the rclone.conf`,
|
Short: `Obscure password for use in the rclone config file`,
|
||||||
|
Long: `In the rclone config file, human readable passwords are
|
||||||
|
obscured. Obscuring them is done by encrypting them and writing them
|
||||||
|
out in base64. This is **not** a secure way of encrypting these
|
||||||
|
passwords as rclone can decrypt them - it is to prevent "eyedropping"
|
||||||
|
- namely someone seeing a password in the rclone config file by
|
||||||
|
accident.
|
||||||
|
|
||||||
|
Many equally important things (like access tokens) are not obscured in
|
||||||
|
the config file. However it is very hard to shoulder surf a 64
|
||||||
|
character hex token.
|
||||||
|
|
||||||
|
If you want to encrypt the config file then please use config file
|
||||||
|
encryption - see [rclone config](/commands/rclone_config/) for more
|
||||||
|
info.`,
|
||||||
Run: func(command *cobra.Command, args []string) {
|
Run: func(command *cobra.Command, args []string) {
|
||||||
cmd.CheckArgs(1, 1, command, args)
|
cmd.CheckArgs(1, 1, command, args)
|
||||||
cmd.Run(false, false, command, func() error {
|
cmd.Run(false, false, command, func() error {
|
||||||
|
|||||||
@@ -77,10 +77,12 @@ func (cds *contentDirectoryService) cdsObjectToUpnpavObject(cdsObject object, fi
|
|||||||
}
|
}
|
||||||
|
|
||||||
if fileInfo.IsDir() {
|
if fileInfo.IsDir() {
|
||||||
|
defaultChildCount := 1
|
||||||
obj.Class = "object.container.storageFolder"
|
obj.Class = "object.container.storageFolder"
|
||||||
obj.Title = fileInfo.Name()
|
obj.Title = fileInfo.Name()
|
||||||
return upnpav.Container{
|
return upnpav.Container{
|
||||||
Object: obj,
|
Object: obj,
|
||||||
|
ChildCount: &defaultChildCount,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ import (
|
|||||||
"github.com/rclone/rclone/cmd/serve/httplib/serve"
|
"github.com/rclone/rclone/cmd/serve/httplib/serve"
|
||||||
"github.com/rclone/rclone/fs"
|
"github.com/rclone/rclone/fs"
|
||||||
"github.com/rclone/rclone/fs/accounting"
|
"github.com/rclone/rclone/fs/accounting"
|
||||||
|
"github.com/rclone/rclone/fs/config/flags"
|
||||||
"github.com/rclone/rclone/fs/fserrors"
|
"github.com/rclone/rclone/fs/fserrors"
|
||||||
"github.com/rclone/rclone/fs/operations"
|
"github.com/rclone/rclone/fs/operations"
|
||||||
"github.com/rclone/rclone/fs/walk"
|
"github.com/rclone/rclone/fs/walk"
|
||||||
@@ -33,9 +34,10 @@ var (
|
|||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
httpflags.AddFlags(Command.Flags())
|
httpflags.AddFlags(Command.Flags())
|
||||||
Command.Flags().BoolVar(&stdio, "stdio", false, "run an HTTP2 server on stdin/stdout")
|
flagSet := Command.Flags()
|
||||||
Command.Flags().BoolVar(&appendOnly, "append-only", false, "disallow deletion of repository data")
|
flags.BoolVarP(flagSet, &stdio, "stdio", "", false, "run an HTTP2 server on stdin/stdout")
|
||||||
Command.Flags().BoolVar(&privateRepos, "private-repos", false, "users can only access their private repo")
|
flags.BoolVarP(flagSet, &appendOnly, "append-only", "", false, "disallow deletion of repository data")
|
||||||
|
flags.BoolVarP(flagSet, &privateRepos, "private-repos", "", false, "users can only access their private repo")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Command definition for cobra
|
// Command definition for cobra
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import (
|
|||||||
"github.com/rclone/rclone/cmd/serve/proxy"
|
"github.com/rclone/rclone/cmd/serve/proxy"
|
||||||
"github.com/rclone/rclone/cmd/serve/proxy/proxyflags"
|
"github.com/rclone/rclone/cmd/serve/proxy/proxyflags"
|
||||||
"github.com/rclone/rclone/fs"
|
"github.com/rclone/rclone/fs"
|
||||||
|
"github.com/rclone/rclone/fs/config/flags"
|
||||||
"github.com/rclone/rclone/fs/hash"
|
"github.com/rclone/rclone/fs/hash"
|
||||||
"github.com/rclone/rclone/lib/errors"
|
"github.com/rclone/rclone/lib/errors"
|
||||||
"github.com/rclone/rclone/vfs"
|
"github.com/rclone/rclone/vfs"
|
||||||
@@ -30,11 +31,12 @@ var (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
httpflags.AddFlags(Command.Flags())
|
flagSet := Command.Flags()
|
||||||
vfsflags.AddFlags(Command.Flags())
|
httpflags.AddFlags(flagSet)
|
||||||
proxyflags.AddFlags(Command.Flags())
|
vfsflags.AddFlags(flagSet)
|
||||||
Command.Flags().StringVar(&hashName, "etag-hash", "", "Which hash to use for the ETag, or auto or blank for off")
|
proxyflags.AddFlags(flagSet)
|
||||||
Command.Flags().BoolVar(&disableGETDir, "disable-dir-list", false, "Disable HTML directory list on GET request for a directory")
|
flags.StringVarP(flagSet, &hashName, "etag-hash", "", "", "Which hash to use for the ETag, or auto or blank for off")
|
||||||
|
flags.BoolVarP(flagSet, &disableGETDir, "disable-dir-list", "", false, "Disable HTML directory list on GET request for a directory")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Command definition for cobra
|
// Command definition for cobra
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
"~$",
|
"~$",
|
||||||
"^\\."
|
"^\\."
|
||||||
],
|
],
|
||||||
|
"enableGitInfo": true,
|
||||||
"markup": {
|
"markup": {
|
||||||
"goldmark": {
|
"goldmark": {
|
||||||
"extensions": {
|
"extensions": {
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
title: "Rclone"
|
title: "Rclone"
|
||||||
description: "Rclone syncs your files to cloud storage: Google Drive, S3, Swift, Dropbox, Google Cloud Storage, Azure, Box and many more."
|
description: "Rclone syncs your files to cloud storage: Google Drive, S3, Swift, Dropbox, Google Cloud Storage, Azure, Box and many more."
|
||||||
type: page
|
type: page
|
||||||
date: "2020-05-16"
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# Rclone syncs your files to cloud storage
|
# Rclone syncs your files to cloud storage
|
||||||
@@ -10,9 +9,9 @@ date: "2020-05-16"
|
|||||||
{{< img width="50%" src="/img/logo_on_light__horizontal_color.svg" alt="rclone logo" style="float:right; padding: 5px;" >}}
|
{{< img width="50%" src="/img/logo_on_light__horizontal_color.svg" alt="rclone logo" style="float:right; padding: 5px;" >}}
|
||||||
|
|
||||||
- [About rclone](#about)
|
- [About rclone](#about)
|
||||||
- [What can rclone do for you](#what)
|
- [What can rclone do for you?](#what)
|
||||||
- [What features does rclone have](#features)
|
- [What features does rclone have?](#features)
|
||||||
- [What providers does rclone support](#providers)
|
- [What providers does rclone support?](#providers)
|
||||||
- [Download](/downloads/)
|
- [Download](/downloads/)
|
||||||
- [Install](/install/)
|
- [Install](/install/)
|
||||||
{{< rem MAINPAGELINK >}}
|
{{< rem MAINPAGELINK >}}
|
||||||
@@ -27,20 +26,20 @@ services, as well as standard transfer protocols.
|
|||||||
|
|
||||||
Rclone has powerful cloud equivalents to the unix commands rsync, cp,
|
Rclone has powerful cloud equivalents to the unix commands rsync, cp,
|
||||||
mv, mount, ls, ncdu, tree, rm, and cat. Rclone's familiar syntax
|
mv, mount, ls, ncdu, tree, rm, and cat. Rclone's familiar syntax
|
||||||
includes shell pipeline support, and `--dry-run` protection. It can be
|
includes shell pipeline support, and `--dry-run` protection. It is
|
||||||
used at the command line, in scripts or via its [API](/rc).
|
used at the command line, in scripts or via its [API](/rc).
|
||||||
|
|
||||||
Users have called rclone *"The Swiss army knife of cloud storage"* and
|
Users call rclone *"The Swiss army knife of cloud storage"*, and
|
||||||
*"Technology indistinguishable from magic"*.
|
*"Technology indistinguishable from magic"*.
|
||||||
|
|
||||||
Rclone really looks after your data. It preserves timestamps and
|
Rclone really looks after your data. It preserves timestamps and
|
||||||
verifies your data at all times. Transfers over limited bandwidth;
|
verifies checksums at all times. Transfers over limited bandwidth;
|
||||||
intermittent connections, or subject to quota can be restarted, from
|
intermittent connections, or subject to quota can be restarted, from
|
||||||
the last good file transferred. You can
|
the last good file transferred. You can
|
||||||
[check](/commands/rclone_check/) the integrity of your files. Where
|
[check](/commands/rclone_check/) the integrity of your files. Where
|
||||||
possible, rclone employs server side transfers to minimise local
|
possible, rclone employs server side transfers to minimise local
|
||||||
bandwidth use and transfers from one provider to another without
|
bandwidth use and transfers from one provider to another without
|
||||||
using your local disk.
|
using local disk.
|
||||||
|
|
||||||
Virtual backends wrap local and cloud file systems to apply
|
Virtual backends wrap local and cloud file systems to apply
|
||||||
[encryption](/crypt/),
|
[encryption](/crypt/),
|
||||||
@@ -48,9 +47,9 @@ Virtual backends wrap local and cloud file systems to apply
|
|||||||
[chunking](/chunker/) and
|
[chunking](/chunker/) and
|
||||||
[joining](/union/).
|
[joining](/union/).
|
||||||
|
|
||||||
Rclone can [mount](/commands/rclone_mount/) any local, cloud or
|
Rclone [mounts](/commands/rclone_mount/) any local, cloud or
|
||||||
virtual filesystem as a disk on Windows,
|
virtual filesystem as a disk on Windows,
|
||||||
macOS, linux and FreeBSD, and also serve these over
|
macOS, linux and FreeBSD, and also serves these over
|
||||||
[SFTP](/commands/rclone_serve_sftp/),
|
[SFTP](/commands/rclone_serve_sftp/),
|
||||||
[HTTP](/commands/rclone_serve_http/),
|
[HTTP](/commands/rclone_serve_http/),
|
||||||
[WebDAV](/commands/rclone_serve_webdav/),
|
[WebDAV](/commands/rclone_serve_webdav/),
|
||||||
@@ -64,14 +63,14 @@ Fedora, Brew and Chocolatey repos. include rclone. For the latest
|
|||||||
version [downloading from rclone.org](/downloads/) is recommended.
|
version [downloading from rclone.org](/downloads/) is recommended.
|
||||||
|
|
||||||
Rclone is widely used on Linux, Windows and Mac. Third party
|
Rclone is widely used on Linux, Windows and Mac. Third party
|
||||||
developers have built innovative backup, restore, GUI and business
|
developers create innovative backup, restore, GUI and business
|
||||||
process solutions using the rclone command line or API.
|
process solutions using the rclone command line or API.
|
||||||
|
|
||||||
Let rclone do the heavy lifting of communicating with cloud storage.
|
Rclone does the heavy lifting of communicating with cloud storage.
|
||||||
|
|
||||||
## What can rclone do for you {#what}
|
## What can rclone do for you? {#what}
|
||||||
|
|
||||||
Rclone can help you:
|
Rclone helps you:
|
||||||
|
|
||||||
- Backup (and encrypt) files to cloud storage
|
- Backup (and encrypt) files to cloud storage
|
||||||
- Restore (and decrypt) files from cloud storage
|
- Restore (and decrypt) files from cloud storage
|
||||||
@@ -99,7 +98,7 @@ Rclone can help you:
|
|||||||
|
|
||||||
## Supported providers {#providers}
|
## Supported providers {#providers}
|
||||||
|
|
||||||
(There are many other providers, built on standard protocols such as
|
(There are many others, built on standard protocols such as
|
||||||
WebDAV or S3, that work out of the box.)
|
WebDAV or S3, that work out of the box.)
|
||||||
|
|
||||||
{{< provider_list >}}
|
{{< provider_list >}}
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: "Alias"
|
title: "Alias"
|
||||||
description: "Remote Aliases"
|
description: "Remote Aliases"
|
||||||
date: "2018-01-30"
|
|
||||||
---
|
---
|
||||||
|
|
||||||
{{< icon "fa fa-link" >}} Alias
|
{{< icon "fa fa-link" >}} Alias
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: "Amazon Drive"
|
title: "Amazon Drive"
|
||||||
description: "Rclone docs for Amazon Drive"
|
description: "Rclone docs for Amazon Drive"
|
||||||
date: "2017-06-10"
|
|
||||||
---
|
---
|
||||||
|
|
||||||
{{< icon "fab fa-amazon" >}} Amazon Drive
|
{{< icon "fab fa-amazon" >}} Amazon Drive
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: "Authors"
|
title: "Authors"
|
||||||
description: "Rclone Authors and Contributors"
|
description: "Rclone Authors and Contributors"
|
||||||
date: "2016-11-02"
|
|
||||||
---
|
---
|
||||||
|
|
||||||
Authors
|
Authors
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: "Microsoft Azure Blob Storage"
|
title: "Microsoft Azure Blob Storage"
|
||||||
description: "Rclone docs for Microsoft Azure Blob Storage"
|
description: "Rclone docs for Microsoft Azure Blob Storage"
|
||||||
date: "2017-07-30"
|
|
||||||
---
|
---
|
||||||
|
|
||||||
{{< icon "fab fa-windows" >}} Microsoft Azure Blob Storage
|
{{< icon "fab fa-windows" >}} Microsoft Azure Blob Storage
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: "B2"
|
title: "B2"
|
||||||
description: "Backblaze B2"
|
description: "Backblaze B2"
|
||||||
date: "2016-10-25"
|
|
||||||
---
|
---
|
||||||
|
|
||||||
{{< icon "fa fa-fire" >}} Backblaze B2
|
{{< icon "fa fa-fire" >}} Backblaze B2
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: "Box"
|
title: "Box"
|
||||||
description: "Rclone docs for Box"
|
description: "Rclone docs for Box"
|
||||||
date: "2015-10-14"
|
|
||||||
---
|
---
|
||||||
|
|
||||||
{{< icon "fa fa-archive" >}} Box
|
{{< icon "fa fa-archive" >}} Box
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: "Bugs"
|
title: "Bugs"
|
||||||
description: "Rclone Bugs and Limitations"
|
description: "Rclone Bugs and Limitations"
|
||||||
date: "2019-08-04"
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# Bugs and Limitations
|
# Bugs and Limitations
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: "Cache"
|
title: "Cache"
|
||||||
description: "Rclone docs for cache remote"
|
description: "Rclone docs for cache remote"
|
||||||
date: "2017-09-03"
|
|
||||||
---
|
---
|
||||||
|
|
||||||
{{< icon "fa fa-archive" >}} Cache (BETA)
|
{{< icon "fa fa-archive" >}} Cache (BETA)
|
||||||
@@ -344,6 +343,8 @@ The username of the Plex user
|
|||||||
|
|
||||||
The password of the Plex user
|
The password of the Plex user
|
||||||
|
|
||||||
|
**NB** Input to this must be obscured - see [rclone obscure](/commands/rclone_obscure/).
|
||||||
|
|
||||||
- Config: plex_password
|
- Config: plex_password
|
||||||
- Env Var: RCLONE_CACHE_PLEX_PASSWORD
|
- Env Var: RCLONE_CACHE_PLEX_PASSWORD
|
||||||
- Type: string
|
- Type: string
|
||||||
|
|||||||
@@ -1,11 +1,100 @@
|
|||||||
---
|
---
|
||||||
title: "Documentation"
|
title: "Documentation"
|
||||||
description: "Rclone Changelog"
|
description: "Rclone Changelog"
|
||||||
date: "2020-05-27"
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## 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 (eg en-dash) in MANUAL.* and man page (Nick Craig-Wood)
|
||||||
|
* Update install.md to reflect minimum Go version (Evan Harris)
|
||||||
|
* Update install from source instructions (Nick Craig-Wood)
|
||||||
|
* make_manual: Support SOURCE_DATE_EPOCH (Morten Linderud)
|
||||||
|
* log: Fix --use-json-log going to stderr not --log-file on 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_id as 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 WSAECONNREFUSED and 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-impersonate with cached root_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/df for 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 SetSparse on Windows 7 which fixes downloads of files > 250MB (Nick Craig-Wood)
|
||||||
|
* build
|
||||||
|
* Update go.mod to go1.14 to enable -mod=vendor build (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_other in /etc/fuse.conf in the Docker image (Nick Craig-Wood)
|
||||||
|
* Fix xgo build after go1.14 go.mod update (Nick Craig-Wood)
|
||||||
|
* docs
|
||||||
|
* Add link to source and modified time to footer of every page (Nick Craig-Wood)
|
||||||
|
* Remove manually set dates and use git dates instead (Nick Craig-Wood)
|
||||||
|
* Minor tense, punctuation, brevity and positivity changes for the home page (edwardxml)
|
||||||
|
* Remove leading slash in page reference in footer when present (Nick Craig-Wood)
|
||||||
|
* Note commands which need obscured input in the docs (Nick Craig-Wood)
|
||||||
|
* obscure: Write more help as we are referencing it elsewhere (Nick Craig-Wood)
|
||||||
|
* VFS
|
||||||
|
* Fix OS vs Unix path confusion - fixes ChangeNotify on Windows (Nick Craig-Wood)
|
||||||
|
* Drive
|
||||||
|
* Fix missing items when listing using --fast-list / ListR (Nick Craig-Wood)
|
||||||
|
* Putio
|
||||||
|
* Fix panic on Object.Open (Cenk Alti)
|
||||||
|
* S3
|
||||||
|
* Fix upload of single files into buckets without create permission (Nick Craig-Wood)
|
||||||
|
* Fix --header-upload (Nick Craig-Wood)
|
||||||
|
* Tardigrade
|
||||||
|
* Fix listing bug by upgrading to v1.0.7
|
||||||
|
* Set UserAgent to rclone (Caleb Case)
|
||||||
|
|
||||||
## v1.52.0 - 2020-05-27
|
## v1.52.0 - 2020-05-27
|
||||||
|
|
||||||
Special thanks to Martin Michlmayr for proof reading and correcting
|
Special thanks to Martin Michlmayr for proof reading and correcting
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: "Chunker"
|
title: "Chunker"
|
||||||
description: "Split-chunking overlay remote"
|
description: "Split-chunking overlay remote"
|
||||||
date: "2019-08-30"
|
|
||||||
---
|
---
|
||||||
|
|
||||||
{{< icon "fa fa-cut" >}}Chunker (BETA)
|
{{< icon "fa fa-cut" >}}Chunker (BETA)
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone"
|
title: "rclone"
|
||||||
description: "Show help for rclone commands, flags and backends."
|
description: "Show help for rclone commands, flags and backends."
|
||||||
slug: rclone
|
slug: rclone
|
||||||
@@ -66,7 +65,7 @@ See the [global flags page](/flags/) for global options not listed here.
|
|||||||
* [rclone move](/commands/rclone_move/) - Move files from source to dest.
|
* [rclone move](/commands/rclone_move/) - Move files from source to dest.
|
||||||
* [rclone moveto](/commands/rclone_moveto/) - Move file or directory from source to dest.
|
* [rclone moveto](/commands/rclone_moveto/) - Move file or directory from source to dest.
|
||||||
* [rclone ncdu](/commands/rclone_ncdu/) - Explore a remote with a text based user interface.
|
* [rclone ncdu](/commands/rclone_ncdu/) - Explore a remote with a text based user interface.
|
||||||
* [rclone obscure](/commands/rclone_obscure/) - Obscure password for use in the rclone.conf
|
* [rclone obscure](/commands/rclone_obscure/) - Obscure password for use in the rclone config file
|
||||||
* [rclone purge](/commands/rclone_purge/) - Remove the path and all of its contents.
|
* [rclone purge](/commands/rclone_purge/) - Remove the path and all of its contents.
|
||||||
* [rclone rc](/commands/rclone_rc/) - Run a command against a running rclone.
|
* [rclone rc](/commands/rclone_rc/) - Run a command against a running rclone.
|
||||||
* [rclone rcat](/commands/rclone_rcat/) - Copies standard input to file on remote.
|
* [rclone rcat](/commands/rclone_rcat/) - Copies standard input to file on remote.
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone about"
|
title: "rclone about"
|
||||||
description: "Get quota information from the remote."
|
description: "Get quota information from the remote."
|
||||||
slug: rclone_about
|
slug: rclone_about
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone authorize"
|
title: "rclone authorize"
|
||||||
description: "Remote authorization."
|
description: "Remote authorization."
|
||||||
slug: rclone_authorize
|
slug: rclone_authorize
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone backend"
|
title: "rclone backend"
|
||||||
description: "Run a backend specific command."
|
description: "Run a backend specific command."
|
||||||
slug: rclone_backend
|
slug: rclone_backend
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone cat"
|
title: "rclone cat"
|
||||||
description: "Concatenates any files and sends them to stdout."
|
description: "Concatenates any files and sends them to stdout."
|
||||||
slug: rclone_cat
|
slug: rclone_cat
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone check"
|
title: "rclone check"
|
||||||
description: "Checks the files in the source and destination match."
|
description: "Checks the files in the source and destination match."
|
||||||
slug: rclone_check
|
slug: rclone_check
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone cleanup"
|
title: "rclone cleanup"
|
||||||
description: "Clean up the remote if possible"
|
description: "Clean up the remote if possible"
|
||||||
slug: rclone_cleanup
|
slug: rclone_cleanup
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone config"
|
title: "rclone config"
|
||||||
description: "Enter an interactive configuration session."
|
description: "Enter an interactive configuration session."
|
||||||
slug: rclone_config
|
slug: rclone_config
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone config create"
|
title: "rclone config create"
|
||||||
description: "Create a new remote with name, type and options."
|
description: "Create a new remote with name, type and options."
|
||||||
slug: rclone_config_create
|
slug: rclone_config_create
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone config delete"
|
title: "rclone config delete"
|
||||||
description: "Delete an existing remote `name`."
|
description: "Delete an existing remote `name`."
|
||||||
slug: rclone_config_delete
|
slug: rclone_config_delete
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone config disconnect"
|
title: "rclone config disconnect"
|
||||||
description: "Disconnects user from remote"
|
description: "Disconnects user from remote"
|
||||||
slug: rclone_config_disconnect
|
slug: rclone_config_disconnect
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone config dump"
|
title: "rclone config dump"
|
||||||
description: "Dump the config file as JSON."
|
description: "Dump the config file as JSON."
|
||||||
slug: rclone_config_dump
|
slug: rclone_config_dump
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone config edit"
|
title: "rclone config edit"
|
||||||
description: "Enter an interactive configuration session."
|
description: "Enter an interactive configuration session."
|
||||||
slug: rclone_config_edit
|
slug: rclone_config_edit
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone config file"
|
title: "rclone config file"
|
||||||
description: "Show path of configuration file in use."
|
description: "Show path of configuration file in use."
|
||||||
slug: rclone_config_file
|
slug: rclone_config_file
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone config password"
|
title: "rclone config password"
|
||||||
description: "Update password in an existing remote."
|
description: "Update password in an existing remote."
|
||||||
slug: rclone_config_password
|
slug: rclone_config_password
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone config providers"
|
title: "rclone config providers"
|
||||||
description: "List in JSON format all the providers and options."
|
description: "List in JSON format all the providers and options."
|
||||||
slug: rclone_config_providers
|
slug: rclone_config_providers
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone config reconnect"
|
title: "rclone config reconnect"
|
||||||
description: "Re-authenticates user with remote."
|
description: "Re-authenticates user with remote."
|
||||||
slug: rclone_config_reconnect
|
slug: rclone_config_reconnect
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone config show"
|
title: "rclone config show"
|
||||||
description: "Print (decrypted) config file, or the config for a single remote."
|
description: "Print (decrypted) config file, or the config for a single remote."
|
||||||
slug: rclone_config_show
|
slug: rclone_config_show
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone config update"
|
title: "rclone config update"
|
||||||
description: "Update options in an existing remote."
|
description: "Update options in an existing remote."
|
||||||
slug: rclone_config_update
|
slug: rclone_config_update
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone config userinfo"
|
title: "rclone config userinfo"
|
||||||
description: "Prints info about logged in user of remote."
|
description: "Prints info about logged in user of remote."
|
||||||
slug: rclone_config_userinfo
|
slug: rclone_config_userinfo
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone copy"
|
title: "rclone copy"
|
||||||
description: "Copy files from source to dest, skipping already copied"
|
description: "Copy files from source to dest, skipping already copied"
|
||||||
slug: rclone_copy
|
slug: rclone_copy
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone copyto"
|
title: "rclone copyto"
|
||||||
description: "Copy files from source to dest, skipping already copied"
|
description: "Copy files from source to dest, skipping already copied"
|
||||||
slug: rclone_copyto
|
slug: rclone_copyto
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone copyurl"
|
title: "rclone copyurl"
|
||||||
description: "Copy url content to dest."
|
description: "Copy url content to dest."
|
||||||
slug: rclone_copyurl
|
slug: rclone_copyurl
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone cryptcheck"
|
title: "rclone cryptcheck"
|
||||||
description: "Cryptcheck checks the integrity of a crypted remote."
|
description: "Cryptcheck checks the integrity of a crypted remote."
|
||||||
slug: rclone_cryptcheck
|
slug: rclone_cryptcheck
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone cryptdecode"
|
title: "rclone cryptdecode"
|
||||||
description: "Cryptdecode returns unencrypted file names."
|
description: "Cryptdecode returns unencrypted file names."
|
||||||
slug: rclone_cryptdecode
|
slug: rclone_cryptdecode
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone dedupe"
|
title: "rclone dedupe"
|
||||||
description: "Interactively find duplicate files and delete/rename them."
|
description: "Interactively find duplicate files and delete/rename them."
|
||||||
slug: rclone_dedupe
|
slug: rclone_dedupe
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone delete"
|
title: "rclone delete"
|
||||||
description: "Remove the contents of path."
|
description: "Remove the contents of path."
|
||||||
slug: rclone_delete
|
slug: rclone_delete
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone deletefile"
|
title: "rclone deletefile"
|
||||||
description: "Remove a single file from remote."
|
description: "Remove a single file from remote."
|
||||||
slug: rclone_deletefile
|
slug: rclone_deletefile
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone genautocomplete"
|
title: "rclone genautocomplete"
|
||||||
description: "Output completion script for a given shell."
|
description: "Output completion script for a given shell."
|
||||||
slug: rclone_genautocomplete
|
slug: rclone_genautocomplete
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone genautocomplete bash"
|
title: "rclone genautocomplete bash"
|
||||||
description: "Output bash completion script for rclone."
|
description: "Output bash completion script for rclone."
|
||||||
slug: rclone_genautocomplete_bash
|
slug: rclone_genautocomplete_bash
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone genautocomplete fish"
|
title: "rclone genautocomplete fish"
|
||||||
description: "Output fish completion script for rclone."
|
description: "Output fish completion script for rclone."
|
||||||
slug: rclone_genautocomplete_fish
|
slug: rclone_genautocomplete_fish
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone genautocomplete zsh"
|
title: "rclone genautocomplete zsh"
|
||||||
description: "Output zsh completion script for rclone."
|
description: "Output zsh completion script for rclone."
|
||||||
slug: rclone_genautocomplete_zsh
|
slug: rclone_genautocomplete_zsh
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone gendocs"
|
title: "rclone gendocs"
|
||||||
description: "Output markdown docs for rclone to the directory supplied."
|
description: "Output markdown docs for rclone to the directory supplied."
|
||||||
slug: rclone_gendocs
|
slug: rclone_gendocs
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone hashsum"
|
title: "rclone hashsum"
|
||||||
description: "Produces a hashsum file for all the objects in the path."
|
description: "Produces a hashsum file for all the objects in the path."
|
||||||
slug: rclone_hashsum
|
slug: rclone_hashsum
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone link"
|
title: "rclone link"
|
||||||
description: "Generate public link to file/folder."
|
description: "Generate public link to file/folder."
|
||||||
slug: rclone_link
|
slug: rclone_link
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone listremotes"
|
title: "rclone listremotes"
|
||||||
description: "List all the remotes in the config file."
|
description: "List all the remotes in the config file."
|
||||||
slug: rclone_listremotes
|
slug: rclone_listremotes
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone ls"
|
title: "rclone ls"
|
||||||
description: "List the objects in the path with size and path."
|
description: "List the objects in the path with size and path."
|
||||||
slug: rclone_ls
|
slug: rclone_ls
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone lsd"
|
title: "rclone lsd"
|
||||||
description: "List all directories/containers/buckets in the path."
|
description: "List all directories/containers/buckets in the path."
|
||||||
slug: rclone_lsd
|
slug: rclone_lsd
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone lsf"
|
title: "rclone lsf"
|
||||||
description: "List directories and objects in remote:path formatted for parsing"
|
description: "List directories and objects in remote:path formatted for parsing"
|
||||||
slug: rclone_lsf
|
slug: rclone_lsf
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone lsjson"
|
title: "rclone lsjson"
|
||||||
description: "List directories and objects in the path in JSON format."
|
description: "List directories and objects in the path in JSON format."
|
||||||
slug: rclone_lsjson
|
slug: rclone_lsjson
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone lsl"
|
title: "rclone lsl"
|
||||||
description: "List the objects in path with modification time, size and path."
|
description: "List the objects in path with modification time, size and path."
|
||||||
slug: rclone_lsl
|
slug: rclone_lsl
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone md5sum"
|
title: "rclone md5sum"
|
||||||
description: "Produces an md5sum file for all the objects in the path."
|
description: "Produces an md5sum file for all the objects in the path."
|
||||||
slug: rclone_md5sum
|
slug: rclone_md5sum
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone mkdir"
|
title: "rclone mkdir"
|
||||||
description: "Make the path if it doesn't already exist."
|
description: "Make the path if it doesn't already exist."
|
||||||
slug: rclone_mkdir
|
slug: rclone_mkdir
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone mount"
|
title: "rclone mount"
|
||||||
description: "Mount the remote as file system on a mountpoint."
|
description: "Mount the remote as file system on a mountpoint."
|
||||||
slug: rclone_mount
|
slug: rclone_mount
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone move"
|
title: "rclone move"
|
||||||
description: "Move files from source to dest."
|
description: "Move files from source to dest."
|
||||||
slug: rclone_move
|
slug: rclone_move
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone moveto"
|
title: "rclone moveto"
|
||||||
description: "Move file or directory from source to dest."
|
description: "Move file or directory from source to dest."
|
||||||
slug: rclone_moveto
|
slug: rclone_moveto
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone ncdu"
|
title: "rclone ncdu"
|
||||||
description: "Explore a remote with a text based user interface."
|
description: "Explore a remote with a text based user interface."
|
||||||
slug: rclone_ncdu
|
slug: rclone_ncdu
|
||||||
|
|||||||
@@ -1,18 +1,30 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone obscure"
|
title: "rclone obscure"
|
||||||
description: "Obscure password for use in the rclone.conf"
|
description: "Obscure password for use in the rclone config file"
|
||||||
slug: rclone_obscure
|
slug: rclone_obscure
|
||||||
url: /commands/rclone_obscure/
|
url: /commands/rclone_obscure/
|
||||||
# autogenerated - DO NOT EDIT, instead edit the source code in cmd/obscure/ and as part of making a release run "make commanddocs"
|
# autogenerated - DO NOT EDIT, instead edit the source code in cmd/obscure/ and as part of making a release run "make commanddocs"
|
||||||
---
|
---
|
||||||
# rclone obscure
|
# rclone obscure
|
||||||
|
|
||||||
Obscure password for use in the rclone.conf
|
Obscure password for use in the rclone config file
|
||||||
|
|
||||||
## Synopsis
|
## Synopsis
|
||||||
|
|
||||||
Obscure password for use in the rclone.conf
|
In the rclone config file, human readable passwords are
|
||||||
|
obscured. Obscuring them is done by encrypting them and writing them
|
||||||
|
out in base64. This is **not** a secure way of encrypting these
|
||||||
|
passwords as rclone can decrypt them - it is to prevent "eyedropping"
|
||||||
|
- namely someone seeing a password in the rclone config file by
|
||||||
|
accident.
|
||||||
|
|
||||||
|
Many equally important things (like access tokens) are not obscured in
|
||||||
|
the config file. However it is very hard to shoulder surf a 64
|
||||||
|
character hex token.
|
||||||
|
|
||||||
|
If you want to encrypt the config file then please use config file
|
||||||
|
encryption - see [rclone config](/commands/rclone_config/) for more
|
||||||
|
info.
|
||||||
|
|
||||||
```
|
```
|
||||||
rclone obscure password [flags]
|
rclone obscure password [flags]
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone purge"
|
title: "rclone purge"
|
||||||
description: "Remove the path and all of its contents."
|
description: "Remove the path and all of its contents."
|
||||||
slug: rclone_purge
|
slug: rclone_purge
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone rc"
|
title: "rclone rc"
|
||||||
description: "Run a command against a running rclone."
|
description: "Run a command against a running rclone."
|
||||||
slug: rclone_rc
|
slug: rclone_rc
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone rcat"
|
title: "rclone rcat"
|
||||||
description: "Copies standard input to file on remote."
|
description: "Copies standard input to file on remote."
|
||||||
slug: rclone_rcat
|
slug: rclone_rcat
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone rcd"
|
title: "rclone rcd"
|
||||||
description: "Run rclone listening to remote control commands only."
|
description: "Run rclone listening to remote control commands only."
|
||||||
slug: rclone_rcd
|
slug: rclone_rcd
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone rmdir"
|
title: "rclone rmdir"
|
||||||
description: "Remove the path if empty."
|
description: "Remove the path if empty."
|
||||||
slug: rclone_rmdir
|
slug: rclone_rmdir
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone rmdirs"
|
title: "rclone rmdirs"
|
||||||
description: "Remove empty directories under the path."
|
description: "Remove empty directories under the path."
|
||||||
slug: rclone_rmdirs
|
slug: rclone_rmdirs
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone serve"
|
title: "rclone serve"
|
||||||
description: "Serve a remote over a protocol."
|
description: "Serve a remote over a protocol."
|
||||||
slug: rclone_serve
|
slug: rclone_serve
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone serve dlna"
|
title: "rclone serve dlna"
|
||||||
description: "Serve remote:path over DLNA"
|
description: "Serve remote:path over DLNA"
|
||||||
slug: rclone_serve_dlna
|
slug: rclone_serve_dlna
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
---
|
---
|
||||||
date: 2020-05-27T16:09:49+01:00
|
|
||||||
title: "rclone serve ftp"
|
title: "rclone serve ftp"
|
||||||
description: "Serve remote:path over FTP."
|
description: "Serve remote:path over FTP."
|
||||||
slug: rclone_serve_ftp
|
slug: rclone_serve_ftp
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user