rsync 似乎会覆盖 ExFat 上已经存在的文件

rsync 似乎会覆盖 ExFat 上已经存在的文件

我发现两块硬盘之间 rsync 的行为很奇怪,这两块硬盘包含完全相同的四个分区。但是,在一个分区上,rsync 似乎总是再次复制文件,我不明白为什么。

rsync -r --update --progress "/media/part3/" "/media/part3_backup" --exclude '.Spotlight-V100'  --exclude '.fseventsd'  --exclude '.Trashes'  --exclude '._.Trashes'  --exclude '.TemporaryItems'  --exclude '._.TemporaryItems'  --delete

欢迎任何解释。

答案1

我在从 ext4 到 exfat 时遇到了同样的问题rsync -avx。它一直在复制文件。-avx没有保留时间,并给了我一个操作不允许 (1)错误。

对于 exFAT 文件系统,这对我来说很有用:

rsync -rtv [source] [destination]

解释:

  • r:递归
  • t:保留时间
  • v:详细

您必须确保时间得到保留。

答案2

@firepol 也有一个很棒的答案。我的回答是为了补充一下这个答案,并稍微增强一下:

rsync复制和镜像到 FAT 和 exFAT 文件系统的最佳设置

快速摘要

我刚刚为此痛苦地度过了几天,以下是我得出的结论:

对于 exFAT 和 FAT 文件系统,请使用rsync -hvrltD --modify-window=1-h使数字“人类可读”为以 1000 为基数的数字。 部分--modify-window=1真的很重要使 FAT 和 exFAT 文件系统能够正确同步,而不必每次都重新复制所有数据!有关详细信息,请参阅下文和man rsync

完整的rsync命令可能如下所示:

SOURCE_PATH="path/to/source/dir"
DESTINATION_PATH="path/to/destination/dir"

# Option 1. **Copy** from source to destination.
#
# dry run
time sudo rsync -hvrltD --modify-window=1 --stats --info=progress2 \
    --dry-run "$SOURCE_PATH/" "$DESTINATION_PATH/"
# actual copy
time sudo rsync -hvrltD --modify-window=1 --stats --info=progress2 \
    "$SOURCE_PATH/" "$DESTINATION_PATH/"

# Option 2. **Mirror** from source to destination. 
# - CAUTION: this deletes files and folders that are on the destination but not
#   the source, thereby making destination dir *exactly match* the source dir.
#
# dry run
time sudo rsync -hvrltD --modify-window=1 --stats --info=progress2 \
    --delete --delete-excluded --dry-run "$SOURCE_PATH/" "$DESTINATION_PATH/"
# actual copy
time sudo rsync -hvrltD --modify-window=1 --stats --info=progress2 \
    --delete --delete-excluded "$SOURCE_PATH/" "$DESTINATION_PATH/"

为了FAT 和 exFAT 文件系统,例如 NTFS、ext4 等,我-hvrltD --modify-window=1在上面的所有命令中都用-hvra代替来替换。 -a添加了一些与 FAT 和 exFAT 文件系统不兼容的内容,例如权限和所有权(-pgo),并且--modify-window=1仅对 FAT 和 exFAT 文件系统是必要的,以防止在数据已经在目标位置时将其重新复制到目标位置。

额外细节

通常,对于非 FAT 或 exFAT 的文件系统,我使用-awith rsync,正如我在这里的回答中所解释的那样:如何使用 FreeFileSync 和 rsync 复制数据

-a或“存档”模式包括-rlptgoD,正如我在另一个答案中所解释的那样:rsync 和符号链接-r不是总是-a要小心)。

-rlptgoD、from的含义man rsync为:

   --recursive, -r          recurse into directories
   --links, -l              copy symlinks as symlinks
   --perms, -p              preserve permissions
   --times, -t              preserve modification times
   --group, -g              preserve group
   --owner, -o              preserve owner (super-user only)
   -D                       same as --devices --specials
   --devices                preserve device files (super-user only)
   --specials               preserve special files ["such as named sockets and fifos"]

如果rsync使用外置FAT或者胖的文件系统,但是,这些文件系统确实不是支持 POSIX 所有者、组和权限,因此删除-pgo,并使用-rltD代替-a我还喜欢添加-v“详细”和-h“人类可读的数字”,结果为-hvrltD

在一个点上我读FAT 和 exFAT 文件系统不支持符号链接(软链接),-l但在真正的 exFAT 文件系统上测试时,删除-l会导致大量“跳过非常规文件”错误!因此,-l重新放入即可解决这些错误并使 rsync 运行更顺畅。

至于--modify-window=1部分,这是真的很重要适用于 FAT 和 exFAT 文件系统!请参见man rsync此处(重点已添加):

--modify-window=NUM, -@

比较两个时间戳时,如果它们的差值不超过修改窗口值,rsync 会将这两个时间戳视为相等。默认值为0,仅匹配整数秒。如果指定负值(并且接收方至少为 3.1.3 版本),则还会考虑纳秒。 指定1对于复制到/从 MS Windows FAT 文件系统复制很有用,因为 FAT 表示具有 2 秒分辨率的时间(允许时间与原始时间最多相差 1 秒)。

所以,如果你离开--modify-window=1,rsync 将永远无法判断时间戳何时匹配,它只会不断地复制、重新复制、再复制,所有数据每次运行 rsync 时,而不是在数据已经复制一次的情况下看到目标上的文件大小和时间戳匹配!换句话说,如果没有--modify-window=1,rsync 将复制全部每次都重新加载数据,而不是忽略目标上已有的数据。这样不好。一定要添加此参数来修复它。我看到这个反复在过去两天对 exFAT 文件系统的测试中,我浪费了很多时间。

更多详情请见:

  1. rsync 似乎会覆盖 ExFat 上已经存在的文件
  2. https://superuser.com/a/384849/425838
  3. https://learn.microsoft.com/en-us/windows/win32/fileio/filesystem-function-comparison

也可以看看

  1. [我的答案]超级用户:最好使用 512kb 块还是更小或更大的块将硬盘重新格式化为 exFAT?
  2. 关于如何确定任何文件系统的簇大小的回答是:服务器故障:如何找到集群大小任何文件系统,无论是 NTFS、Apple APFS、ext4、ext3、FAT、exFAT 等。

相关内容