Unicode characters needlessly escaped when syncing to sftp remote

What is the problem you are having with rclone?

I cannot disable encoding of filenames. I have set encoding = Raw on the remote and I am running the command with –local-encoding Raw. However when syncing, the non-standard character (U+FF0F) still gets converted to ‛/. Note that this is not the standard forward slash. This character is valid on unix filesystems.

Run the command 'rclone version' and share the full output of the command.

rclone --version
rclone v1.71.2
- os/version: Microsoft Windows 10 IoT Enterprise LTSC 2021 21H2 21H2 (64 bit)
- os/kernel: 10.0.19044.6456 (x86_64)
- os/type: windows
- os/arch: amd64
- go/version: go1.25.3
- go/linking: static
- go/tags: cmount

Which cloud storage system are you using?

local (windows) → sftp remote (ubuntu server, storage mounted with ntfs3g)

The command you were trying to run (eg rclone copy /tmp remote:tmp)

rclone sync C:/Users/username/Music odroid:/mnt/storage/MEDIA/MUSIC --local-encoding Raw

Please run 'rclone config redacted' and share the full output. If you get command not found, please make sure to update rclone.

[odroid]
type = sftp
host = XXX
user = XXX
key_file = ~/.ssh/id_rsa
shell_type = unix
md5sum_command = md5sum
sha1sum_command = sha1sum
encoding = Raw

A log from the command that you were trying to run with the -vv flag

rclone sync "C:/Users/fiso/Music/Extra/miso-nicomi records/PLATINUM" "odroid:/mnt/storage/MEDIA/MUSIC/Extra/miso-nicomi records/PLATINUM" --progress --local-encoding Raw -vv
2025/11/05 19:28:52 DEBUG : Setting --local-encoding "Raw" from environment variable RCLONE_LOCAL_ENCODING="Raw"
2025/11/05 19:28:53 DEBUG : rclone: Version "v1.71.2" starting with parameters ["rclone" "sync" "C:/Users/fiso/Music/Extra/miso-nicomi records/PLATINUM" "odroid:/mnt/storage/MEDIA/MUSIC/Extra/miso-nicomi records/PLATINUM" "--progress" "--local-encoding" "Raw" "-vv"]
2025/11/05 19:28:53 DEBUG : Creating backend with remote "C:/Users/fiso/Music/Extra/miso-nicomi records/PLATINUM"
2025/11/05 19:28:53 DEBUG : Using config file from "C:\\Users\\fiso\\AppData\\Roaming\\rclone\\rclone.conf"
2025/11/05 19:28:53 DEBUG : local: detected overridden config - adding "{1pYER}" suffix to name
2025/11/05 19:28:53 DEBUG : fs cache: renaming cache item "C:/Users/fiso/Music/Extra/miso-nicomi records/PLATINUM" to be canonical "local{1pYER}://?/C:/Users/fiso/Music/Extra/miso-nicomi records/PLATINUM"
2025/11/05 19:28:53 DEBUG : Creating backend with remote "odroid:/mnt/storage/MEDIA/MUSIC/Extra/miso-nicomi records/PLATINUM"
2025/11/05 19:28:53 DEBUG : sftp://odroid@192.168.1.25:22//mnt/storage/MEDIA/MUSIC/Extra/miso-nicomi records/PLATINUM: New connection 192.168.1.15:62512->192.168.1.25:22 to "SSH-2.0-OpenSSH_9.6p1 Ubuntu-3ubuntu13.14"
2025/11/05 19:28:55 DEBUG : sftp://odroid@192.168.1.25:22//mnt/storage/MEDIA/MUSIC/Extra/miso-nicomi records/PLATINUM: Shell type "unix" from config
2025/11/05 19:28:55 DEBUG : sftp://odroid@192.168.1.25:22//mnt/storage/MEDIA/MUSIC/Extra/miso-nicomi records/PLATINUM: Using root directory "/mnt/storage/MEDIA/MUSIC/Extra/miso-nicomi records/PLATINUM"
2025/11/05 19:28:55 DEBUG : 01. tomatoism - Dry Out.flac: Size and modification time the same (differ by -316.257ms, within tolerance 1s)
2025/11/05 19:28:55 DEBUG : 01. tomatoism - Dry Out.flac: Unchanged skipping
(other unchanged files)
2025/11/05 19:28:55 DEBUG : miso-nicomi records - PLATINUM.jpg: Unchanged skipping
2025/11/05 19:28:55 DEBUG : sftp://odroid@192.168.1.25:22//mnt/storage/MEDIA/MUSIC/Extra/miso-nicomi records/PLATINUM: Waiting for transfers to finish
2025/11/05 19:28:56 DEBUG : sftp://odroid@192.168.1.25:22//mnt/storage/MEDIA/MUSIC/Extra/miso-nicomi records/PLATINUM: Shell path "/mnt/storage/MEDIA/MUSIC/Extra/miso-nicomi records/PLATINUM/07. Frums - ‛/.flac.d59e2a54.partial"
2025/11/05 19:28:56 DEBUG : sftp://odroid@192.168.1.25:22//mnt/storage/MEDIA/MUSIC/Extra/miso-nicomi records/PLATINUM: Running remote command: md5sum /mnt/storage/MEDIA/MUSIC/Extra/miso-nicomi\ records/PLATINUM/07.\ Frums\ -\ ‛/.flac.d59e2a54.partial
2025/11/05 19:28:56 DEBUG : sftp://odroid@192.168.1.25:22//mnt/storage/MEDIA/MUSIC/Extra/miso-nicomi records/PLATINUM: Remote command result: 5b18f396d8ef6197e6babdc75dae2e42  /mnt/storage/MEDIA/MUSIC/Extra/miso-nicomi records/PLATINUM/07. Frums - ‛/.flac.d59e2a54.partial
2025/11/05 19:28:56 DEBUG : 07. Frums - ‛/.flac.d59e2a54.partial: Parsed hash: 5b18f396d8ef6197e6babdc75dae2e42
2025/11/05 19:28:56 DEBUG : 07. Frums - ‛/.flac: md5 = 5b18f396d8ef6197e6babdc75dae2e42 OK
2025/11/05 19:28:56 DEBUG : 07. Frums - ‛/.flac.d59e2a54.partial: renamed to: 07. Frums - ‛/.flac
2025/11/05 19:28:56 INFO  : 07. Frums - ‛/.flac: Copied (new)
2025/11/05 19:28:56 DEBUG : Waiting for deletions to finish
Transferred:       33.465 MiB / 33.465 MiB, 100%, 18.188 MiB/s, ETA 0s
Checks:                10 / 10, 100%, Listed 21
Transferred:            1 / 1, 100%
Elapsed time:         1.8s
2025/11/05 19:28:56 INFO  :
Transferred:       33.465 MiB / 33.465 MiB, 100%, 18.188 MiB/s, ETA 0s
Checks:                10 / 10, 100%, Listed 21
Transferred:            1 / 1, 100%
Elapsed time:         1.8s

2025/11/05 19:28:56 DEBUG : 12 go routines active
2025/11/05 19:28:56 DEBUG : sftp://odroid@192.168.1.25:22//mnt/storage/MEDIA/MUSIC/Extra/miso-nicomi records/PLATINUM: Closing 1 unused connections

sorry, not sure what is?

The docs say:

>You can disable the encoding completely with --backend-encoding Raw or set encoding = Raw in the config file.

Most backends have an encoding option

well, the critical work is Most

$ rclone help flags encoding | grep local
      --local-encoding Encoding                             The encoding for the backend (default Slash,Dot)

$ rclone help flags encoding | grep sftp
$

the SFTP backend does not support encoding

Either way, this would only matter when going in the reverse direction, no?

I’m trying to sync from local to sftp remote. Despite –local-encoding Raw filenames are still encoded.

i could be wrong that:

  • the encoding applies to the dest, not the source.
  • your debug log, seems to prove that point.

so, if you know different, please let me know?

I also think encoding is for the remote. Still, it doesn’t explain my issue where a non-standard character gets needlessly escaped. I now believe that it has nothing to do with the encoding setting. The point is that I don’t want any encoding or escaping to happen at all, just 1:1 filenames.

well, afiak, / is not valid for filenames on unix, so rclone has two options

  • encode/escape the slash
  • not encode the slash which would lead to an ERROR as the file cannot be copied.

But it’s not the standard forward slash. It’s (U+FF0F), which is allowed on unix. I can create a file on the server with that name just fine.

Apologies if I didn’t make that clear enough in the first post.

oh ok,
so the source file contains (U+FF0F), thus rclone should copy the filename as is?

Yes, that’s exactly what I want

rclone copy d:\zork seedapp_sftp_int:zork -vv --inplace 
DEBUG : rclone: Version "v1.71.0" starting with parameters ["d:\\data\\rclone\\rclone.exe" "copy" "d:\\zork" "seedapp_sftp_int:zork" "-vv" "--inplace"]
DEBUG : Creating backend with remote "d:\\zork"
DEBUG : Using config file from "d:\\data\\rclone\\rclone.conf"
DEBUG : fs cache: renaming cache item "d:\\zork" to be canonical "//?/d:/zork"
DEBUG : Creating backend with remote "seedapp_sftp_int:zork"
DEBUG : sftp://asdffdsa@redacted:22/zork: Shell type "unix" from config
DEBUG : sftp://asdffdsa@redacted:22/zork: Relative path resolved to "/home/asdffdsa/zork"
DEBUG : sftp://asdffdsa@redacted:22/zork: Using root directory "/home/asdffdsa/zork"
DEBUG : file/.ext: Need to transfer - File not found at Destination
DEBUG : sftp://asdffdsa@redacted:22/zork: Waiting for checks to finish
DEBUG : sftp://asdffdsa@redacted:22/zork: Waiting for transfers to finish
DEBUG : sftp://asdffdsa@redacted:22/zork: Shell path "/home/asdffdsa/zork/file/.ext"
DEBUG : sftp://asdffdsa@redacted:22/zork: Running remote command: md5sum /home/asdffdsa/zork/file/.ext
DEBUG : sftp://asdffdsa@redacted:22/zork: Remote command result: c81e728d9d4c2f636f067f89cc14862c  /home/asdffdsa/zork/file/.ext
DEBUG : file/.ext: Parsed hash: c81e728d9d4c2f636f067f89cc14862c
DEBUG : file/.ext: md5 = c81e728d9d4c2f636f067f89cc14862c OK
INFO  : file/.ext: Copied (new)
INFO  : 

rclone ls d:\zork 
        1 file/.ext

rclone ls seedapp_sftp_int:zork 
        1 file/.ext

Okay, I see. So removing –local-encoding Raw fixes this issue for this specific character (U+FF0F). But the reason why I have enabled in the first place, is because rclone fails to transfer some of my other files with other non-standard characters such as (U+FF1A). Again, that’s not the standard colon.

rclone ls test
        0 file:.ext
        0 file/.ext

without –local-encoding Raw:

rclone copy test odroid:/mnt/storage/RANDOM/test -vv --inplace
2025/11/05 21:21:15 DEBUG : rclone: Version "v1.71.2" starting with parameters ["rclone" "copy" "test" "odroid:/mnt/storage/RANDOM/test" "-vv" "--inplace"]
2025/11/05 21:21:15 DEBUG : Creating backend with remote "test"
2025/11/05 21:21:15 DEBUG : Using config file from "C:\\Users\\fiso\\AppData\\Roaming\\rclone\\rclone.conf"
2025/11/05 21:21:15 DEBUG : fs cache: renaming cache item "test" to be canonical "//?/C:/Users/fiso/Desktop/folder/test"
2025/11/05 21:21:15 DEBUG : Creating backend with remote "odroid:/mnt/storage/RANDOM/test"
2025/11/05 21:21:16 DEBUG : sftp://odroid@192.168.1.25:22//mnt/storage/RANDOM/test: New connection 192.168.1.15:51993->192.168.1.25:22 to "SSH-2.0-OpenSSH_9.6p1 Ubuntu-3ubuntu13.14"
2025/11/05 21:21:16 DEBUG : sftp://odroid@192.168.1.25:22//mnt/storage/RANDOM/test: Shell type "unix" from config
2025/11/05 21:21:16 DEBUG : sftp://odroid@192.168.1.25:22//mnt/storage/RANDOM/test: Using root directory "/mnt/storage/RANDOM/test"
2025/11/05 21:21:16 DEBUG : file:.ext: Need to transfer - File not found at Destination
2025/11/05 21:21:16 DEBUG : file/.ext: Need to transfer - File not found at Destination
2025/11/05 21:21:16 DEBUG : sftp://odroid@192.168.1.25:22//mnt/storage/RANDOM/test: Waiting for checks to finish
2025/11/05 21:21:16 DEBUG : sftp://odroid@192.168.1.25:22//mnt/storage/RANDOM/test: Waiting for transfers to finish
2025/11/05 21:21:16 ERROR : file:.ext: Failed to copy: Update Create failed: sftp: "Bad message" (SSH_FX_BAD_MESSAGE)
2025/11/05 21:21:16 DEBUG : sftp://odroid@192.168.1.25:22//mnt/storage/RANDOM/test: New connection 192.168.1.15:51999->192.168.1.25:22 to "SSH-2.0-OpenSSH_9.6p1 Ubuntu-3ubuntu13.14"
2025/11/05 21:21:16 DEBUG : sftp://odroid@192.168.1.25:22//mnt/storage/RANDOM/test: Shell path "/mnt/storage/RANDOM/test/file/.ext"
2025/11/05 21:21:16 DEBUG : sftp://odroid@192.168.1.25:22//mnt/storage/RANDOM/test: Running remote command: md5sum /mnt/storage/RANDOM/test/file/.ext
2025/11/05 21:21:16 DEBUG : sftp://odroid@192.168.1.25:22//mnt/storage/RANDOM/test: Remote command result: d41d8cd98f00b204e9800998ecf8427e  /mnt/storage/RANDOM/test/file/.ext
2025/11/05 21:21:16 DEBUG : file/.ext: Parsed hash: d41d8cd98f00b204e9800998ecf8427e
2025/11/05 21:21:16 DEBUG : file/.ext: md5 = d41d8cd98f00b204e9800998ecf8427e OK
2025/11/05 21:21:16 INFO  : file/.ext: Copied (new)
2025/11/05 21:21:16 ERROR : Attempt 1/3 failed with 1 errors and: Update Create failed: sftp: "Bad message" (SSH_FX_BAD_MESSAGE)
2025/11/05 21:21:16 DEBUG : file:.ext: Need to transfer - File not found at Destination
2025/11/05 21:21:16 DEBUG : sftp://odroid@192.168.1.25:22//mnt/storage/RANDOM/test: Waiting for checks to finish
2025/11/05 21:21:16 DEBUG : file/.ext: Size and modification time the same (differ by -559.4183ms, within tolerance 1s)
2025/11/05 21:21:16 DEBUG : file/.ext: Unchanged skipping
2025/11/05 21:21:16 DEBUG : sftp://odroid@192.168.1.25:22//mnt/storage/RANDOM/test: Waiting for transfers to finish
2025/11/05 21:21:16 ERROR : file:.ext: Failed to copy: Update Create failed: sftp: "Bad message" (SSH_FX_BAD_MESSAGE)
2025/11/05 21:21:16 ERROR : Attempt 2/3 failed with 1 errors and: Update Create failed: sftp: "Bad message" (SSH_FX_BAD_MESSAGE)
2025/11/05 21:21:16 DEBUG : file:.ext: Need to transfer - File not found at Destination
2025/11/05 21:21:16 DEBUG : sftp://odroid@192.168.1.25:22//mnt/storage/RANDOM/test: Waiting for checks to finish
2025/11/05 21:21:16 DEBUG : file/.ext: Size and modification time the same (differ by -559.4183ms, within tolerance 1s)
2025/11/05 21:21:16 DEBUG : file/.ext: Unchanged skipping
2025/11/05 21:21:16 DEBUG : sftp://odroid@192.168.1.25:22//mnt/storage/RANDOM/test: Waiting for transfers to finish
2025/11/05 21:21:16 ERROR : file:.ext: Failed to copy: Update Create failed: sftp: "Bad message" (SSH_FX_BAD_MESSAGE)
2025/11/05 21:21:16 ERROR : Attempt 3/3 failed with 1 errors and: Update Create failed: sftp: "Bad message" (SSH_FX_BAD_MESSAGE)
rclone ls odroid:/mnt/storage/RANDOM/test
        0 file/.ext

(file:.ext fails to transfer).

And with that flag, it is as before, i.e. file:.ext transfers fine, but gets escaped.

rclone copy d:\zork seedapp_sftp_int:zork -vv --inplace --retries=1 
DEBUG : rclone: Version "v1.71.2" starting with parameters ["d:\\data\\rclone\\rclone" "copy" "d:\\zork" "seedapp_sftp_int:zork" "-vv" "--inplace" "--retries=1"]
DEBUG : Creating backend with remote "d:\\zork"
DEBUG : Using config file from "d:\\data\\rclone\\rclone.conf"
DEBUG : fs cache: renaming cache item "d:\\zork" to be canonical "//?/d:/zork"
DEBUG : Creating backend with remote "seedapp_sftp_int:zork"
DEBUG : sftp://asdffdsa@redacted:22/zork: New connection 192.168.0.235:64058->redacted:22 to "SSH-2.0-OpenSSH_8.4p1 Debian-5+deb11u3"
DEBUG : sftp://asdffdsa@redacted:22/zork: Shell type "unix" from config
DEBUG : sftp://asdffdsa@redacted:22/zork: Relative path resolved to "/home/asdffdsa/zork"
DEBUG : sftp://asdffdsa@redacted:22/zork: Using root directory "/home/asdffdsa/zork"
DEBUG : file:.ext: Need to transfer - File not found at Destination
DEBUG : file/.ext: Need to transfer - File not found at Destination
DEBUG : sftp://asdffdsa@redacted:22/zork: Waiting for checks to finish
DEBUG : sftp://asdffdsa@redacted:22/zork: Waiting for transfers to finish
DEBUG : sftp://asdffdsa@redacted:22/zork: Shell path "/home/asdffdsa/zork/file:.ext"
DEBUG : sftp://asdffdsa@redacted:22/zork: Running remote command: md5sum /home/asdffdsa/zork/file:.ext
DEBUG : sftp://asdffdsa@redacted:22/zork: Remote command result: d41d8cd98f00b204e9800998ecf8427e  /home/asdffdsa/zork/file:.ext
DEBUG : file:.ext: Parsed hash: d41d8cd98f00b204e9800998ecf8427e
DEBUG : file:.ext: md5 = d41d8cd98f00b204e9800998ecf8427e OK
INFO  : file:.ext: Copied (new)
DEBUG : sftp://asdffdsa@redacted:22/zork: New connection 192.168.0.235:64059->redacted:22 to "SSH-2.0-OpenSSH_8.4p1 Debian-5+deb11u3"
DEBUG : sftp://asdffdsa@redacted:22/zork: Shell path "/home/asdffdsa/zork/file/.ext"
DEBUG : sftp://asdffdsa@redacted:22/zork: Running remote command: md5sum /home/asdffdsa/zork/file/.ext
DEBUG : sftp://asdffdsa@redacted:22/zork: Remote command result: d41d8cd98f00b204e9800998ecf8427e  /home/asdffdsa/zork/file/.ext
DEBUG : file/.ext: Parsed hash: d41d8cd98f00b204e9800998ecf8427e
DEBUG : file/.ext: md5 = d41d8cd98f00b204e9800998ecf8427e OK
INFO  : file/.ext: Copied (new)
INFO  : 
Transferred:   	          0 B / 0 B, -, 0 B/s, ETA -
Checks:                 0 / 0, -, Listed 2
Transferred:            2 / 2, 100%
Elapsed time:         2.2s

rclone ls d:\zork 
        0 file:.ext
        0 file/.ext

rclone ls seedapp_sftp_int:zork 
        0 file:.ext
        0 file/.ext

Well, that’s odd.

This exact command does NOT work for me. Same output as above.

Note that scp works fine:

scp -r test odroid:/mnt/storage/RANDOM/
file/.ext                                                                                                                                                                                                                                                                               
file:.ext

rclone ls odroid:/mnt/storage/RANDOM/test
        0 file/.ext
        0 file:.ext   

When I copy to the home dir instead of of the external ntfs drive, it works.

Here’s my fstab file for reference:

UUID=60FEC729FEC6F676  /mnt/storage  ntfs-3g  defaults,uid=1000,gid=1001,fmask=0002,dmask=0002,nofail,windows_names  0  0

But as I already said, scp works fine. Also copying in the sftp interactive session works:

> $ sftp odroid
Connected to odroid.
sftp> cd /mnt/storage/RANDOM/
sftp> put -r "C:\Users\fiso\Desktop\folder\test"
Uploading C:/Users/fiso/Desktop/folder/test/ to /mnt/storage/RANDOM/test
Entering C:/Users/fiso/Desktop/folder/test/
file/.ext                                                                                                                                                                                                                                                                               
file:.ext                                                                                                                                                                                                                                                                              
sftp> ls test
test/file/.ext  test/file:.ext

But copying with sftp or scp works! rclone is the only one giving me such problems.

The first solution in your linked thread proposes to sanitize the filenames in order to make ntfs-3g accept them. But this should not be needed, because

  1. None of these characters are disallowed on windows or on linux. In fact, I am syncing from a windows machine, which accepts these characters.
  2. I also know that this is not a bug in the ntfs-3g driver, because I can copy those files to that drive with scp or sftp without a problem.

The last solution proposes disabling windows-only filenames on the ntfs mount altogether, but this will cause problems later on. And I repeat, this should not be needed. This issue is only present with rclone.

I have also tried it with rclone serve webdav on the remote and syncing the test folder there. This also gives me an error:

2025/11/06 15:02:40 DEBUG : rclone: Version "v1.71.2" starting with parameters ["rclone" "sync" "test" "rclone-webdav:RANDOM/test" "--progress" "--retries" "1" "--inplace" "-vv"]
2025/11/06 15:02:40 DEBUG : Creating backend with remote "rclone-webdav:RANDOM/test"
2025/11/06 15:02:40 DEBUG : file:.ext: Need to transfer - File not found at Destination
2025/11/06 15:02:40 DEBUG : file:.ext: Update will use the normal upload strategy (no chunks)
2025/11/06 15:02:41 ERROR : file:.ext: Failed to copy: unchunked simple update failed: Method Not Allowed: 405 Method Not Allowed

I think this might be a bug. Should I open a new issue in “Suspected Bugs“ to make it more clear?

On windows, create a directory with the following contents:

> $ rclone tree test\
/
├── file/.ext
└── file:.ext

Note that both (U+FF0F) and (U+FF1A) are not the standard forward slash and column, so they’re allowed on all windows and linux filesystems.

Nevertheless, some rclone commands such as ls, sync, and others will sometimes needlessly convert or escape these characters on windows:

> $ rclone ls test\
        0 file:.ext
        0 file/.ext

Here, turned into the standard colon when listing.

Also, when syncing this local directory to a linux remote with ntfs-3g storage, it will needlessly convert into the standard column when transferring the file. The sync might succeed or fail, depending on if windows-only filenames are enabled for that mount. Here, file file:.ext is synced as file:.ext to the remote:

> $ rclone sync test odroid:storage/RANDOM/test --retries 1 -vv
2025/11/06 15:56:04 DEBUG : rclone: Version "v1.71.2" starting with parameters ["rclone" "sync" "test" "odroid:storage/RANDOM/test" "--retries" "1" "-vv"]
2025/11/06 15:56:04 DEBUG : Creating backend with remote "test"
2025/11/06 15:56:04 DEBUG : Using config file from "C:\\Users\\fiso\\AppData\\Roaming\\rclone\\rclone.conf"
2025/11/06 15:56:04 DEBUG : fs cache: renaming cache item "test" to be canonical "//?/C:/Users/fiso/Desktop/folder/test"
2025/11/06 15:56:04 DEBUG : Creating backend with remote "odroid:storage/RANDOM/test"
2025/11/06 15:56:04 DEBUG : sftp://odroid@192.168.1.25:22/storage/RANDOM/test: New connection 192.168.1.15:51745->192.168.1.25:22 to "SSH-2.0-OpenSSH_9.6p1 Ubuntu-3ubuntu13.14"
2025/11/06 15:56:04 DEBUG : sftp://odroid@192.168.1.25:22/storage/RANDOM/test: Shell type "unix" from config
2025/11/06 15:56:04 DEBUG : sftp://odroid@192.168.1.25:22/storage/RANDOM/test: Relative path resolved to "/mnt/storage/RANDOM/test"
2025/11/06 15:56:04 DEBUG : sftp://odroid@192.168.1.25:22/storage/RANDOM/test: Using root directory "/mnt/storage/RANDOM/test"
2025/11/06 15:56:04 DEBUG : file:.ext: Need to transfer - File not found at Destination
2025/11/06 15:56:04 DEBUG : file/.ext: Need to transfer - File not found at Destination
2025/11/06 15:56:04 DEBUG : sftp://odroid@192.168.1.25:22/storage/RANDOM/test: Waiting for checks to finish
2025/11/06 15:56:04 DEBUG : sftp://odroid@192.168.1.25:22/storage/RANDOM/test: Waiting for transfers to finish
2025/11/06 15:56:04 DEBUG : sftp://odroid@192.168.1.25:22/storage/RANDOM/test: Shell path "/mnt/storage/RANDOM/test/file:.ext.3f1cf1d1.partial"
2025/11/06 15:56:04 DEBUG : sftp://odroid@192.168.1.25:22/storage/RANDOM/test: Running remote command: md5sum /mnt/storage/RANDOM/test/file:.ext.3f1cf1d1.partial
2025/11/06 15:56:04 DEBUG : sftp://odroid@192.168.1.25:22/storage/RANDOM/test: Remote command result: d41d8cd98f00b204e9800998ecf8427e  /mnt/storage/RANDOM/test/file:.ext.3f1cf1d1.partial
2025/11/06 15:56:04 DEBUG : file:.ext.3f1cf1d1.partial: Parsed hash: d41d8cd98f00b204e9800998ecf8427e
2025/11/06 15:56:04 DEBUG : file:.ext: md5 = d41d8cd98f00b204e9800998ecf8427e OK
2025/11/06 15:56:04 DEBUG : sftp://odroid@192.168.1.25:22/storage/RANDOM/test: New connection 192.168.1.15:51748->192.168.1.25:22 to "SSH-2.0-OpenSSH_9.6p1 Ubuntu-3ubuntu13.14"
2025/11/06 15:56:04 DEBUG : file:.ext.3f1cf1d1.partial: renamed to: file:.ext
2025/11/06 15:56:04 INFO  : file:.ext: Copied (new)
2025/11/06 15:56:04 DEBUG : sftp://odroid@192.168.1.25:22/storage/RANDOM/test: Shell path "/mnt/storage/RANDOM/test/file/.ext.5374dda2.partial"
2025/11/06 15:56:04 DEBUG : sftp://odroid@192.168.1.25:22/storage/RANDOM/test: Running remote command: md5sum /mnt/storage/RANDOM/test/file/.ext.5374dda2.partial
2025/11/06 15:56:04 DEBUG : sftp://odroid@192.168.1.25:22/storage/RANDOM/test: Remote command result: d41d8cd98f00b204e9800998ecf8427e  /mnt/storage/RANDOM/test/file/.ext.5374dda2.partial
2025/11/06 15:56:04 DEBUG : file/.ext.5374dda2.partial: Parsed hash: d41d8cd98f00b204e9800998ecf8427e
2025/11/06 15:56:04 DEBUG : file/.ext: md5 = d41d8cd98f00b204e9800998ecf8427e OK
2025/11/06 15:56:04 DEBUG : file/.ext.5374dda2.partial: renamed to: file/.ext
2025/11/06 15:56:04 INFO  : file/.ext: Copied (new)
2025/11/06 15:56:04 DEBUG : Waiting for deletions to finish
2025/11/06 15:56:04 INFO  :
Transferred:              0 B / 0 B, -, 0 B/s, ETA -
Checks:                 0 / 0, -, Listed 2
Transferred:            2 / 2, 100%
Elapsed time:         0.4s
> $ ssh odroid ls storage/RANDOM/test
file:.ext
file/.ext

I have also tried running the same command with –local-encoding None, which resulted in the following listing:

> $ rclone ls test --local-encoding None
        0 file‛/.ext
        0 file:.ext

And sync created the same filenames as well:

> $ rclone sync test odroid:storage/RANDOM/test --retries 1 -vv --local-encoding None
..same output..

> $ ssh odroid ls storage/RANDOM/test
file‛/.ext
file:.ext

So now was unnecessarily escaped to become ‛/.

P.S.: These are not the only non-standard characters like this that result in this problem.