如何通过 Linux 的 rsync --times 选项保持文件的时间同步?

问题浏览数Icon
2
问题创建时间Icon
2025-04-20 16:41:00
回答 | 共 3 个
作者头像
mingyue01

为什么不尝试使用 cp --preserve=timestamps 或 Unison 进行更灵活的时间同步?

作者头像
haixiao77

作为技术支持工程师,针对通过rsync的--times选项保持文件时间同步的需求,以下是我常用的解决方案:

  1. 基本命令结构

    rsync --times -r [其他可选参数] 源路径 目标路径
    • --times:确保同步后目标文件的修改时间(mtime)与源文件一致。
    • -r:递归同步目录(若同步单个文件可省略)。
  2. 完整示例(本地同步)

    rsync --times -rvh /source/dir/ user@remote:/dest/dir/
    • -v:输出详细信息,-h:人类可读格式,适用于调试。
  3. 结合归档模式(推荐)

    rsync -a --times /source/file user@remote:/dest/file
    • -a:归档模式(含递归、保留权限等),叠加--times更明确时间同步逻辑。
  4. 验证同步结果

    stat 源文件 && stat 目标文件   # 检查mtime是否一致

注意事项

  • 若目标文件已存在且内容未变,仅更新时间为源文件时间。
  • 需确保用户对目标路径有写权限及时间戳修改权限。
  • 网络同步时,时区差异可能导致时间显示不一致,但实际mtime值保持同步。
作者头像
frostwave66

rsync 的 --times(或 -t)选项用于同步文件的修改时间(mtime),确保目标文件的时间戳与源文件一致。以下是实践经验和挑战的详细说明:

使用方法

基础命令:rsync -t [其他选项] 源路径 目标路径。通常结合 -a(归档模式,已包含 -t)使用,例如:

rsync -avt /local/source/ user@remote:/remote/destination/

实践经验

  1. 增量备份优化:若文件内容未变但时间戳更新,-t 仅同步时间戳,避免重复传输内容,节省带宽。
  2. 依赖时间戳的场景:适用于需保留编译时间、日志轮转等场景,确保目标环境行为一致。
  3. 权限与所有权:时间戳同步需目标文件可写,若权限不足(如 root 创建的文件),需搭配 --chmod--no-perms 处理。

挑战与解决

  1. 时区差异:若源/目标系统时区不同,时间戳显示值可能不同(但 UTC 时间一致),需确认时区配置。
  2. 时间精度丢失:部分文件系统(如 FAT32)仅支持秒级时间戳,同步后可能存在误差。
  3. 元数据冲突:若同时使用 --checksum(校验文件内容),可能因时间戳不同触发冗余传输,需权衡参数组合。
  4. 只读目标限制:目标路径若为只读(如 CD-ROM),-t 会失败,需移除该选项或调整写入权限。

验证方法

同步后可通过 ls -lstat 检查时间戳,例如:

stat -c '%y' filename  # 查看文件修改时间

最佳实践

  • 优先使用 -a 而非单独 -t,以保留权限、所有权等属性。
  • 测试时添加 --dry-run 预览操作,避免误覆盖。
  • 跨平台同步时,确认文件系统对时间戳的支持粒度。