What is the problem you are having with rclone?
The --local-unicode-normalization=true
added to the rclone
command works fine for file name normalization, whereas the unicode_normalization = true
specified in rclone.conf
does NOT trigger the same effect.
Here is an example, I have a folder listed as follows to transfer to the remote storage:
/Users/z/Downloads/test
└── 니.txt
If I do not specify (actually it does not matter if it is specified) unicode_normalization = true
in rclone.conf
:
- unicode_normalization = true
and run command with flag --local-unicode-normalization=true
:
rclone copy \
-P \
+ --local-unicode-normalization=true \
~/Downloads/test \
s3:data/personal-files/Asset/test
Then the test
dir and all its files gets successfully transferred, because the file 니.txt
with Korean character with NFD
normalization in its name gets correctly normalized with NFC
before transferring.
However, if I specify the unicode_normalization = true
in rclone.conf
:
+ unicode_normalization = true
and run command WITHOUT flag --local-unicode-normalization=true
:
rclone copy \
-P \
- --local-unicode-normalization=true \
~/Downloads/test \
s3:data/personal-files/Asset/test
Then the error occurs, because the remote storage does not handle files with NFD
normalized filename.
Run the command 'rclone version' and share the full output of the command.
rclone v1.67.0
- os/version: darwin 14.5 (64 bit)
- os/kernel: 23.5.0 (x86_64)
- os/type: darwin
- os/arch: amd64
- go/version: go1.22.4
- go/linking: dynamic
- go/tags: none
Which cloud storage system are you using? (eg Google Drive)
S3
The command you were trying to run (eg rclone copy /tmp remote:tmp
)
rclone copy \
-P \
~/Downloads/test \
s3:data/personal-files/Asset/test
Please run 'rclone config redacted' and share the full output. If you get command not found, please make sure to update rclone.
[s3]
type = s3
provider = XXX
access_key_id = XXX
secret_access_key = XXX
endpoint = XXX
acl = bucket-owner-full-control
upload_cutoff = 100Mi
chunk-size = 50Mi
upload_concurrency = 16
list_chunk = 1000000
+ unicode_normalization = true
# the `+` sign above is not in the actual config, used here only for highlighting
A log from the command that you were trying to run with the -vv
flag
The test
dir to transfer to the remote storage:
/Users/z/Downloads/test
└── 니.txt
Running command with unicode_normalization = true
added to the rclone.config
:
rclone copy \
-P -vv \
~/Downloads/test \
s3:data/personal-files/Asset/test
2024/07/22 00:04:46 DEBUG : rclone: Version "v1.67.0" starting with parameters ["rclone" "copy" "-P" "-vv" "/Users/z/Downloads/test" "s3:data/personal-files/Asset/test"]
2024/07/22 00:04:46 DEBUG : Creating backend with remote "/Users/z/Downloads/test"
2024/07/22 00:04:46 DEBUG : Using config file from "/Users/z/.config/rclone/rclone.conf"
2024/07/22 00:04:46 DEBUG : Creating backend with remote "qb:data/personal-files/Asset/test"
2024/07/22 00:04:46 DEBUG : Resolving service "s3" region "us-east-1"
2024/07/22 00:04:52 DEBUG : 니.txt: Need to transfer - File not found at Destination
2024/07/22 00:04:52 DEBUG : S3 bucket data path personal-files/Asset/test: Waiting for checks to finish
2024/07/22 00:04:52 DEBUG : S3 bucket data path personal-files/Asset/test: Waiting for transfers to finish
2024/07/22 00:04:54 ERROR : 니.txt: Failed to copy: object not found
2024/07/22 00:04:54 ERROR : Attempt 1/3 failed with 1 errors and: object not found
2024/07/22 00:04:54 DEBUG : 니.txt: Need to transfer - File not found at Destination
2024/07/22 00:04:54 DEBUG : S3 bucket data path personal-files/Asset/test: Waiting for checks to finish
2024/07/22 00:04:54 DEBUG : S3 bucket data path personal-files/Asset/test: Waiting for transfers to finish
2024/07/22 00:04:54 DEBUG : pacer: low level retry 1/1 (error InternalError: We encountered an internal error, please try again.: cause({"Id":"pydio.grpc.data.index.personal","Code":409,"Detail":"Node path already in use","Status":"Conflict"})
status code: 500, request id: 17E46D43940AD6C0, host id: )
2024/07/22 00:04:54 DEBUG : pacer: Rate limited, increasing sleep to 10ms
2024/07/22 00:04:54 DEBUG : 니.txt: Received error: InternalError: We encountered an internal error, please try again.: cause({"Id":"pydio.grpc.data.index.personal","Code":409,"Detail":"Node path already in use","Status":"Conflict"})
status code: 500, request id: 17E46D43940AD6C0, host id: - low level retry 0/10
2024/07/22 00:04:54 DEBUG : pacer: low level retry 1/1 (error InternalError: We encountered an internal error, please try again.: cause({"Id":"pydio.grpc.data.index.personal","Code":409,"Detail":"Node path already in use","Status":"Conflict"})
status code: 500, request id: 17E46D439ABAA6E6, host id: )
2024/07/22 00:04:54 DEBUG : pacer: Rate limited, increasing sleep to 20ms
2024/07/22 00:04:54 DEBUG : 니.txt: Received error: InternalError: We encountered an internal error, please try again.: cause({"Id":"pydio.grpc.data.index.personal","Code":409,"Detail":"Node path already in use","Status":"Conflict"})
status code: 500, request id: 17E46D439ABAA6E6, host id: - low level retry 1/10
2024/07/22 00:04:54 DEBUG : pacer: low level retry 1/1 (error InternalError: We encountered an internal error, please try again.: cause({"Id":"pydio.grpc.data.index.personal","Code":409,"Detail":"Node path already in use","Status":"Conflict"})
status code: 500, request id: 17E46D43A1C77DBF, host id: )
2024/07/22 00:04:54 DEBUG : pacer: Rate limited, increasing sleep to 40ms
2024/07/22 00:04:54 DEBUG : 니.txt: Received error: InternalError: We encountered an internal error, please try again.: cause({"Id":"pydio.grpc.data.index.personal","Code":409,"Detail":"Node path already in use","Status":"Conflict"})
status code: 500, request id: 17E46D43A1C77DBF, host id: - low level retry 2/10
2024/07/22 00:04:54 DEBUG : pacer: low level retry 1/1 (error InternalError: We encountered an internal error, please try again.: cause({"Id":"pydio.grpc.data.index.personal","Code":409,"Detail":"Node path already in use","Status":"Conflict"})
status code: 500, request id: 17E46D43AB69F13F, host id: )
2024/07/22 00:04:54 DEBUG : pacer: Rate limited, increasing sleep to 80ms
2024/07/22 00:04:54 DEBUG : 니.txt: Received error: InternalError: We encountered an internal error, please try again.: cause({"Id":"pydio.grpc.data.index.personal","Code":409,"Detail":"Node path already in use","Status":"Conflict"})
status code: 500, request id: 17E46D43AB69F13F, host id: - low level retry 3/10
2024/07/22 00:04:55 DEBUG : pacer: low level retry 1/1 (error InternalError: We encountered an internal error, please try again.: cause({"Id":"pydio.grpc.data.index.personal","Code":409,"Detail":"Node path already in use","Status":"Conflict"})
status code: 500, request id: 17E46D43B2E82856, host id: )
2024/07/22 00:04:55 DEBUG : pacer: Rate limited, increasing sleep to 160ms
2024/07/22 00:04:55 DEBUG : 니.txt: Received error: InternalError: We encountered an internal error, please try again.: cause({"Id":"pydio.grpc.data.index.personal","Code":409,"Detail":"Node path already in use","Status":"Conflict"})
status code: 500, request id: 17E46D43B2E82856, host id: - low level retry 4/10
2024/07/22 00:04:55 DEBUG : pacer: low level retry 1/1 (error InternalError: We encountered an internal error, please try again.: cause({"Id":"pydio.grpc.data.index.personal","Code":409,"Detail":"Node path already in use","Status":"Conflict"})
status code: 500, request id: 17E46D43BB2FFC22, host id: )
2024/07/22 00:04:55 DEBUG : pacer: Rate limited, increasing sleep to 320ms
2024/07/22 00:04:55 DEBUG : 니.txt: Received error: InternalError: We encountered an internal error, please try again.: cause({"Id":"pydio.grpc.data.index.personal","Code":409,"Detail":"Node path already in use","Status":"Conflict"})
status code: 500, request id: 17E46D43BB2FFC22, host id: - low level retry 5/10
2024/07/22 00:04:55 DEBUG : pacer: low level retry 1/1 (error InternalError: We encountered an internal error, please try again.: cause({"Id":"pydio.grpc.data.index.personal","Code":409,"Detail":"Node path already in use","Status":"Conflict"})
status code: 500, request id: 17E46D43C44886C1, host id: )
2024/07/22 00:04:55 DEBUG : pacer: Rate limited, increasing sleep to 640ms
2024/07/22 00:04:55 DEBUG : 니.txt: Received error: InternalError: We encountered an internal error, please try again.: cause({"Id":"pydio.grpc.data.index.personal","Code":409,"Detail":"Node path already in use","Status":"Conflict"})
status code: 500, request id: 17E46D43C44886C1, host id: - low level retry 6/10
2024/07/22 00:04:55 DEBUG : pacer: low level retry 1/1 (error InternalError: We encountered an internal error, please try again.: cause({"Id":"pydio.grpc.data.index.personal","Code":409,"Detail":"Node path already in use","Status":"Conflict"})
status code: 500, request id: 17E46D43D7966200, host id: )
2024/07/22 00:04:55 DEBUG : pacer: Rate limited, increasing sleep to 1.28s
2024/07/22 00:04:55 DEBUG : 니.txt: Received error: InternalError: We encountered an internal error, please try again.: cause({"Id":"pydio.grpc.data.index.personal","Code":409,"Detail":"Node path already in use","Status":"Conflict"})
status code: 500, request id: 17E46D43D7966200, host id: - low level retry 7/10
2024/07/22 00:04:56 DEBUG : pacer: low level retry 1/1 (error InternalError: We encountered an internal error, please try again.: cause({"Id":"pydio.grpc.data.index.personal","Code":409,"Detail":"Node path already in use","Status":"Conflict"})
status code: 500, request id: 17E46D43FDD98100, host id: )
2024/07/22 00:04:56 DEBUG : pacer: Rate limited, increasing sleep to 2s
2024/07/22 00:04:56 DEBUG : 니.txt: Received error: InternalError: We encountered an internal error, please try again.: cause({"Id":"pydio.grpc.data.index.personal","Code":409,"Detail":"Node path already in use","Status":"Conflict"})
status code: 500, request id: 17E46D43FDD98100, host id: - low level retry 8/10
2024/07/22 00:04:57 DEBUG : pacer: low level retry 1/1 (error InternalError: We encountered an internal error, please try again.: cause({"Id":"pydio.grpc.data.index.personal","Code":409,"Detail":"Node path already in use","Status":"Conflict"})
status code: 500, request id: 17E46D444E9C0460, host id: )
2024/07/22 00:04:57 DEBUG : 니.txt: Received error: InternalError: We encountered an internal error, please try again.: cause({"Id":"pydio.grpc.data.index.personal","Code":409,"Detail":"Node path already in use","Status":"Conflict"})
status code: 500, request id: 17E46D444E9C0460, host id: - low level retry 9/10
2024/07/22 00:04:57 ERROR : 니.txt: Failed to copy: InternalError: We encountered an internal error, please try again.: cause({"Id":"pydio.grpc.data.index.personal","Code":409,"Detail":"Node path already in use","Status":"Conflict"})
status code: 500, request id: 17E46D444E9C0460, host id:
2024/07/22 00:04:57 ERROR : Attempt 2/3 failed with 1 errors and: InternalError: We encountered an internal error, please try again.: cause({"Id":"pydio.grpc.data.index.personal","Code":409,"Detail":"Node path already in use","Status":"Conflict"})
status code: 500, request id: 17E46D444E9C0460, host id:
This looks like a bug to me.
Theoretically the flag unicode_normalization = true
in config should have the same effect as the flag --local-unicode-normalization=true
in command, let me know if I should open an issue on GitHub.
Thanks.