What is the problem you are having with rclone?
rclone bisync
currently evaluates --max-delete
before --track-renames
is executed. This leads to false aborts when entire directories are renamed, even though no actual deletions will occur.
Steps to reproduce:
Given both /path1
and /path2
contain this tree (previously synced via --resync
):
/path1
├── folder1
│ ├── file1
│ ├── file2
│ ├── file3
│ ├── file4
│ ├── file5
│ ├── file6
│ ├── file7
│ ├── file8
│ └── file9
└── folder2
└── file10
Then, rename folder1 locally:
mv /path1/folder1 /path1/folder1_renamed
Now run:
rclone bisync /path1 /path2 --track-renames --max-delete 20
Expected:
folder1
on /path2
is renamed to folder1_renamed
, preserving all contents.
Actual:
Safety abort: too many deletes (>20%, 9 of 10) on Path1 "/path1/". Run with --force if desired.
If I retry with --force, the run completes successfully — no deletions occur, only renames. But using --force defeats the safety purpose of --max-delete.
In this post ncw explains that:
But the --max-delete
check is done before this rename resolution. So it assumes that all unmatched destination files (e.g., folder1/*
) will be deleted, triggering a false-positive safety abort.
Suggestion:
The --max-delete
logic should be applied after --track-renames
processing — i.e., only count actual unmatched entries in dstFiles
that would be deleted.
Run the command 'rclone version' and share the full output of the command.
rclone version
rclone v1.70.3
- os/version: debian 12.11 (64 bit)
- os/kernel: 6.1.31-sun50iw9 (aarch64)
- os/type: linux
- os/arch: arm64 (ARMv8 compatible)
- go/version: go1.24.4
- go/linking: static
- go/tags: none
Which cloud storage system are you using? (eg Google Drive)
None, test run local
The command you were trying to run (eg rclone copy /tmp remote:tmp
)
rclone bisync /path1 /path2 --track-renames --max-delete 20
The rclone config contents with secrets removed.
rclone config
Current remotes:
Name Type
==== ====
GoogleDrive drive
e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
e/n/d/r/c/s/q>
A log from the command with the -vv
flag
rclone bisync /path1 /path2 --track-renames --max-delete 20 -vv
2025/07/13 14:38:09 DEBUG : rclone: Version "v1.70.3" starting with parameters ["rclone" "bisync" "/path1" "/path2" "--track-renames" "--max-delete" "20" "-vv"]
2025/07/13 14:38:09 DEBUG : Creating backend with remote "/path1"
2025/07/13 14:38:09 DEBUG : Using config file from "/root/.config/rclone/rclone.conf"
2025/07/13 14:38:09 DEBUG : Creating backend with remote "/path2"
2025/07/13 14:38:09 NOTICE: bisync is IN BETA. Don't use in production!
2025/07/13 14:38:09 INFO : Setting --ignore-listing-checksum as neither --checksum nor --compare checksum are set.
2025/07/13 14:38:09 INFO : Bisyncing with Comparison Settings:
{
"Modtime": true,
"Size": true,
"Checksum": false,
"HashType1": 0,
"HashType2": 0,
"NoSlowHash": false,
"SlowHashSyncOnly": false,
"SlowHashDetected": true,
"DownloadHash": false
}
2025/07/13 14:38:09 DEBUG : Lock file created: /root/.cache/rclone/bisync/path1..path2.lck
2025/07/13 14:38:09 INFO : Synching Path1 "/path1/" with Path2 "/path2/"
2025/07/13 14:38:09 DEBUG : updated backup-dir for Path1
2025/07/13 14:38:09 DEBUG : updated backup-dir for Path2
2025/07/13 14:38:09 INFO : Building Path1 and Path2 listings
2025/07/13 14:38:09 DEBUG : &{fs1:0x400084e000 fs2:0x400084e0a0 abort:false critical:false retryable:false basePath:/root/.cache/rclone/bisync/path1..path2 workDir:/root/.cache/rclone/bisync listing1:/root/.cache/rclone/bisync/path1..path2.path1.lst listing2:/root/.cache/rclone/bisync/path1..path2.path2.lst newListing1:/root/.cache/rclone/bisync/path1..path2.path1.lst-new newListing2:/root/.cache/rclone/bisync/path1..path2.path2.lst-new aliases:map[] opt:0x4000846120 octx:{emptyCtx:{}} fctx:{emptyCtx:{}} InGracefulShutdown:false CleanupCompleted:false SyncCI:<nil> CancelSync:<nil> DebugName: lockFile:/root/.cache/rclone/bisync/path1..path2.lck renames:map[] resyncIs1to2:false}: starting to march!
2025/07/13 14:38:09 DEBUG : folder1: path2 only
2025/07/13 14:38:09 DEBUG : folder1: is Dir
2025/07/13 14:38:09 DEBUG : folder1_renamed: path1 only
2025/07/13 14:38:09 DEBUG : folder1_renamed: is Dir
2025/07/13 14:38:09 DEBUG : folder2: both path1 and path2
2025/07/13 14:38:09 DEBUG : folder2: is Dir
2025/07/13 14:38:09 DEBUG : folder2/file10: both path1 and path2
2025/07/13 14:38:09 DEBUG : folder2/file10: is Object
2025/07/13 14:38:09 DEBUG : folder1/file1: path2 only
2025/07/13 14:38:09 DEBUG : folder1/file1: is Object
2025/07/13 14:38:09 DEBUG : folder1_renamed/file1: path1 only
2025/07/13 14:38:09 DEBUG : folder1_renamed/file1: is Object
2025/07/13 14:38:09 DEBUG : folder1_renamed/file2: path1 only
2025/07/13 14:38:09 DEBUG : folder1/file2: path2 only
2025/07/13 14:38:09 DEBUG : folder1_renamed/file2: is Object
2025/07/13 14:38:09 DEBUG : folder1_renamed/file3: path1 only
2025/07/13 14:38:09 DEBUG : folder1/file2: is Object
2025/07/13 14:38:09 DEBUG : folder1_renamed/file3: is Object
2025/07/13 14:38:09 DEBUG : folder1_renamed/file4: path1 only
2025/07/13 14:38:09 DEBUG : folder1_renamed/file4: is Object
2025/07/13 14:38:09 DEBUG : folder1/file3: path2 only
2025/07/13 14:38:09 DEBUG : folder1/file3: is Object
2025/07/13 14:38:09 DEBUG : folder1/file4: path2 only
2025/07/13 14:38:09 DEBUG : folder1_renamed/file5: path1 only
2025/07/13 14:38:09 DEBUG : folder1/file4: is Object
2025/07/13 14:38:09 DEBUG : folder1_renamed/file5: is Object
2025/07/13 14:38:09 DEBUG : folder1_renamed/file6: path1 only
2025/07/13 14:38:09 DEBUG : folder1_renamed/file6: is Object
2025/07/13 14:38:09 DEBUG : folder1/file5: path2 only
2025/07/13 14:38:09 DEBUG : folder1/file5: is Object
2025/07/13 14:38:09 DEBUG : folder1/file6: path2 only
2025/07/13 14:38:09 DEBUG : folder1_renamed/file7: path1 only
2025/07/13 14:38:09 DEBUG : folder1/file6: is Object
2025/07/13 14:38:09 DEBUG : folder1_renamed/file7: is Object
2025/07/13 14:38:09 DEBUG : folder1/file7: path2 only
2025/07/13 14:38:09 DEBUG : folder1_renamed/file8: path1 only
2025/07/13 14:38:09 DEBUG : folder1/file7: is Object
2025/07/13 14:38:09 DEBUG : folder1/file8: path2 only
2025/07/13 14:38:09 DEBUG : folder1_renamed/file8: is Object
2025/07/13 14:38:09 DEBUG : folder1/file8: is Object
2025/07/13 14:38:09 DEBUG : folder1_renamed/file9: path1 only
2025/07/13 14:38:09 DEBUG : folder1_renamed/file9: is Object
2025/07/13 14:38:09 DEBUG : folder1/file9: path2 only
2025/07/13 14:38:09 DEBUG : folder1/file9: is Object
2025/07/13 14:38:09 DEBUG : &{fs1:0x400084e000 fs2:0x400084e0a0 abort:false critical:false retryable:false basePath:/root/.cache/rclone/bisync/path1..path2 workDir:/root/.cache/rclone/bisync listing1:/root/.cache/rclone/bisync/path1..path2.path1.lst listing2:/root/.cache/rclone/bisync/path1..path2.path2.lst newListing1:/root/.cache/rclone/bisync/path1..path2.path1.lst-new newListing2:/root/.cache/rclone/bisync/path1..path2.path2.lst-new aliases:map[] opt:0x4000846120 octx:{emptyCtx:{}} fctx:{emptyCtx:{}} InGracefulShutdown:false CleanupCompleted:false SyncCI:<nil> CancelSync:<nil> DebugName: lockFile:/root/.cache/rclone/bisync/path1..path2.lck renames:map[] resyncIs1to2:false}: march completed. err: <nil>
2025/07/13 14:38:09 INFO : Path1 checking for diffs
2025/07/13 14:38:09 INFO : - Path1 File was deleted - folder1/file1
2025/07/13 14:38:09 INFO : - Path1 File was deleted - folder1/file2
2025/07/13 14:38:09 INFO : - Path1 File was deleted - folder1/file3
2025/07/13 14:38:09 INFO : - Path1 File was deleted - folder1/file4
2025/07/13 14:38:09 INFO : - Path1 File was deleted - folder1/file5
2025/07/13 14:38:09 INFO : - Path1 File was deleted - folder1/file6
2025/07/13 14:38:09 INFO : - Path1 File was deleted - folder1/file7
2025/07/13 14:38:09 INFO : - Path1 File was deleted - folder1/file8
2025/07/13 14:38:09 INFO : - Path1 File was deleted - folder1/file9
2025/07/13 14:38:09 DEBUG : 2025-07-13 17:02:59.427353314 +0000 UTC: modification time the same (differ by 0s, within tolerance 1ns)
2025/07/13 14:38:09 INFO : - Path1 File is new - folder1_renamed/file1
2025/07/13 14:38:09 INFO : - Path1 File is new - folder1_renamed/file2
2025/07/13 14:38:09 INFO : - Path1 File is new - folder1_renamed/file3
2025/07/13 14:38:09 INFO : - Path1 File is new - folder1_renamed/file4
2025/07/13 14:38:09 INFO : - Path1 File is new - folder1_renamed/file5
2025/07/13 14:38:09 INFO : - Path1 File is new - folder1_renamed/file6
2025/07/13 14:38:09 INFO : - Path1 File is new - folder1_renamed/file7
2025/07/13 14:38:09 INFO : - Path1 File is new - folder1_renamed/file8
2025/07/13 14:38:09 INFO : - Path1 File is new - folder1_renamed/file9
2025/07/13 14:38:09 INFO : Path1: 18 changes: 9 new, 0 modified, 9 deleted
2025/07/13 14:38:09 INFO : Path2 checking for diffs
2025/07/13 14:38:09 DEBUG : 2025-07-13 17:01:22.355915576 +0000 UTC: modification time the same (differ by 0s, within tolerance 1ns)
2025/07/13 14:38:09 DEBUG : 2025-07-13 17:01:26.401741704 +0000 UTC: modification time the same (differ by 0s, within tolerance 1ns)
2025/07/13 14:38:09 DEBUG : 2025-07-13 17:01:28.168392421 +0000 UTC: modification time the same (differ by 0s, within tolerance 1ns)
2025/07/13 14:38:09 DEBUG : 2025-07-13 17:01:30.345427299 +0000 UTC: modification time the same (differ by 0s, within tolerance 1ns)
2025/07/13 14:38:09 DEBUG : 2025-07-13 17:01:32.075293903 +0000 UTC: modification time the same (differ by 0s, within tolerance 1ns)
2025/07/13 14:38:09 DEBUG : 2025-07-13 17:01:34.17534032 +0000 UTC: modification time the same (differ by 0s, within tolerance 1ns)
2025/07/13 14:38:09 DEBUG : 2025-07-13 17:01:36.308182322 +0000 UTC: modification time the same (differ by 0s, within tolerance 1ns)
2025/07/13 14:38:09 DEBUG : 2025-07-13 17:01:38.597560316 +0000 UTC: modification time the same (differ by 0s, within tolerance 1ns)
2025/07/13 14:38:09 DEBUG : 2025-07-13 17:01:40.475888109 +0000 UTC: modification time the same (differ by 0s, within tolerance 1ns)
2025/07/13 14:38:09 DEBUG : 2025-07-13 17:02:59.427353314 +0000 UTC: modification time the same (differ by 0s, within tolerance 1ns)
2025/07/13 14:38:09 ERROR : Safety abort: too many deletes (>20%, 9 of 10) on Path1 "/path1/". Run with --force if desired.
2025/07/13 14:38:09 DEBUG : Lock file removed: /root/.cache/rclone/bisync/path1..path2.lck
2025/07/13 14:38:09 NOTICE: Bisync aborted. Please try again.
2025/07/13 14:38:09 INFO :
Transferred: 0 B / 0 B, -, 0 B/s, ETA -
Errors: 1 (retrying may help)
Checks: 20 / 20, 100%, Listed 22
Elapsed time: 0.0s
2025/07/13 14:38:09 DEBUG : 7 go routines active
2025/07/13 14:38:09 NOTICE: Failed to bisync: too many deletes