判断文件修改时间先后关系本质是将时间戳转为秒级Unix时间整数后比较;实际备份中,若目标文件不存在或比源文件旧,则执行同步以避免覆盖更新内容或重复传输。

判断两个文件的修改时间先后关系,本质是把时间戳转为可计算的整数(秒级 Unix 时间),再做数值比较。实际备份场景中,常见需求是:「如果目标文件比源文件旧,或目标文件不存在,则执行同步」——这能避免覆盖更新的内容,也防止重复传输。
获取并比较文件修改时间戳
用 stat -c %Y 获取文件最后修改时间(单位:秒,自 1970-01-01 起),这是最直接、跨系统兼容性好的方式:
-
source_file 和 target_file 都存在时:比较
stat -c %Y source_file与stat -c %Y target_file的数值大小 - target_file 不存在:直接触发同步(无需时间比较)
-
只关心是否「过期」而非相对新旧:比如“目标文件修改时间距今超过5分钟”,可用
$(($(date +%s) - $(stat -c %Y target_file))) -gt 300
典型同步决策逻辑(含错误处理)
以下是一个健壮的判断片段,可用于 rsync 或 scp 前的条件检查:
source="/path/to/source.conf" target="/backup/server.conf" <p>if [[ ! -e "$target" ]]; then echo "目标文件不存在,执行同步" rsync -a "$source" "$target" elif [[ $(stat -c %Y "$source") -gt $(stat -c %Y "$target") ]]; then echo "源文件更新,执行同步" rsync -a "$source" "$target" else echo "目标文件已是最新,跳过" fi
注意文件时间类型的选择
Linux 文件有三个时间戳,同步决策应始终使用 mtime(修改时间):
-
mtime(
stat -c %Y):内容最后一次被写入的时间 → 决定「数据是否更新」的核心依据 - ctime(
stat -c %Z):元数据(权限、所有者等)变更时间 → 不代表内容变化,不可用于同步判断 - atime(
stat -c %X):最后访问时间 → 受读操作影响,易误判
批量文件按修改时间筛选再同步
若需对目录下多个文件做「仅同步比目标服务器上同名文件更新的那些」,推荐结合 find + rsync --files-from:
- 先生成待同步文件列表(例如:源文件比目标对应文件新,或目标无对应文件)
- 用 rsync 的
--files-from批量传输,避免逐个判断开销大 - 示例关键逻辑:
find /src -type f -newermt "$(stat -c %y /dst/placeholder 2>/dev/null || date -d '1 year ago')" -printf "%P\n"(适用于目标端有参考时间基准的场景)

















