如何让rsync忽略文件属性,仅按内容判断创建硬链接?
rsync硬链接备份问题:文件整理后重复复制的解决办法
问题描述
我用定时rsync脚本备份存储驱动器,命令如下:
rsync --delete --stats -PSvahHAXx --log-file=Backup_<TIME> --link-dest=Backups/<lastBackup> <StorageDrive> "Backups/<nextBackup>"
但两次备份之间如果整理存储(比如重命名、移动文件夹),rsync识别不出是同一份文件,会创建新副本而非硬链接。于是我在rsync命令后加了:
jdupes --recurse -L Backups/
这个命令会把重复文件替换成硬链接,可执行后下次跑rsync时,它不再创建硬链接而是重新复制所有文件,推测是文件属性和源文件不一致导致的。想知道有没有办法让rsync忽略文件属性,只对比相同位置的文件内容来判断是否能创建硬链接?
实用解决方案
1. 调整rsync参数,强制按内容校验
rsync默认会对比文件的权限、时间戳、属性等信息,你可以通过以下参数让它只关注文件内容:
- 加上
--checksum(或短参数-c):强制用文件内容的校验和判断是否相同,而非依赖属性 - 加上
--ignore-times:跳过修改时间对比,强制校验内容 - 加上
--no-perms --no-owner --no-group --no-times:直接跳过权限、所有者、组、时间戳的属性检查
调整后的命令示例:
rsync --delete --stats -PSvahHAXx --checksum --ignore-times --no-perms --no-owner --no-group --log-file=Backup_<TIME> --link-dest=Backups/<lastBackup> <StorageDrive> "Backups/<nextBackup>"
2. 优化jdupes的硬链接操作
jdupes的-L参数会把重复文件硬链接到第一个找到的文件,这会导致备份文件的属性被覆盖,和源存储的文件属性不一致。改用-O参数可以保留原始文件的属性,只替换重复文件为硬链接:
jdupes --recurse -O Backups/
3. 用rsync原生参数处理文件移动/重命名
其实不需要额外依赖jdupes,rsync的--fuzzy参数可以在目标目录中查找内容匹配的文件(即使文件名或路径变了),直接创建硬链接而非复制。开启这个参数后,文件重命名、移动的场景rsync能自动识别:
rsync --delete --stats -PSvahHAXx --fuzzy --log-file=Backup_<TIME> --link-dest=Backups/<lastBackup> <StorageDrive> "Backups/<nextBackup>"
这个方案更高效,建议优先尝试。
内容的提问来源于stack exchange,提问作者kEks
相关产品推荐
相关产品推荐

