WSL:当源文件不存在时,rsync 不会删除目标文件中的文件

WSL:当源文件不存在时,rsync 不会删除目标文件中的文件

这是在 W10 机器上使用 WSL。

我正在尝试将一个驱动器镜像到另一个驱动器。

我使用的命令如下:

root@M17A:/mnt/c/WINDOWS/system32# rsync -rtivlHu --delete --exclude "Backups" "/mnt/f/" "/mnt/h/"  

(注意:我也尝试过delete-before

我遇到的问题是有时目标中存在但源中不存在的文件不会被删除。此类文件可能位于 H 驱动器根目录中(在这种情况下永远不会被删除),或者深埋在目录结构中,最终可能会被删除,也可能不会被删除。

我在输出的开始处看到了这样的东西:

root@M17A:/mnt/c/WINDOWS/system32# rsync -rtivlHu --delete --exclude "Backups" "/mnt/f/" "/mnt/h/"
sending incremental file list
rsync: opendir "/mnt/f/$RECYCLE.BIN/S-1-5-21-3556251925-1847326050-1130181678-1001" failed: Permission denied (13)
rsync: failed to set times on "/mnt/h/.": Invalid argument (22)
IO error encountered -- skipping file deletion
./
temp.tmp
...

rsync: opendir句话似乎与回收目录有关,但并不是特别相关。回收站最终是否没有镜像也无所谓。只是这增加了分析问题所在时的难度。

请注意“遇到 IO 错误 —— 跳过文件删除”这一行。

我可以毫无困难地手动将文件复制到 H: 驱动器并从中删除文件。

这可能与 W10 所有权/权限有关吗?我不得不承认,我根本不了解 W10 的这一方面,当我试图了解它时,我最终不得不在黑暗的房间里睡了很长时间,被恐惧和精神疲劳所淹没。

答案1

IO 错误会导致故障安全并禁用 的操作--delete。以下是文档 ( man rsync) 对此事的说明:

如果发送方检测到任何 I/O 错误,则将自动禁用目标上的任何文件删除功能。这是为了防止发送方的临时文件系统故障(例如 NFS 错误)导致目标上大量文件删除。您可以使用该选项覆盖此--ignore-errors设置。

但是,简单地添加--ignore-errors可以防止rsync出现其他意外错误;它并不是您想象的那样直接。

我建议从您的副本中省略回收站,并避免使用--ignore-errors

rsync -auH -iv --delete --exclude 'Backups/' --exclude '/$RECYCLE.BIN/' /mnt/f/ /mnt/h/

如果Backups实际上只有,/mnt/f/Backups那么您应该使用/Backups/来省略顶级目录。如果在源树中散布着Backups不需要的目录(即,在 下的各个点),那么您当前没有前导的排除模式是正确的。Backups/mnt/f/

相关内容