You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何递归将工作目录与备份目录中对应文件/目录的修改时间统一为二者中的最旧值?

如何递归将工作目录与备份目录中对应文件/目录的修改时间统一为二者中的最旧值?

我完全懂你这种折腾的烦恼——两个几乎一模一样的目录,就因为当年拷贝文件、解压归档时没注意保留修改时间,或者跨文件系统/用scp传输丢了时间精度,导致大量文件、目录甚至符号链接的修改时间乱成一团,哪边更旧还没规律。之前那种分三次跑find、每个文件都开个bash进程的写法确实太笨重,维护起来头疼,效率也低。

下面给你一套更高效、可读性更强的解决方案,核心思路是一次遍历目录、批量处理条目、只对内容/属性一致的条目同步到最旧时间:

先明确前提

在执行脚本前,务必先确认两个目录的核心内容一致:

diff -rq --no-dereferences "/long_path_1" "/long_path_2"

如果只有.cache这类无关紧要的差异,就可以放心执行下面的操作了。

优化后的脚本

先定义两个目录变量(方便后续修改路径),然后分三类条目处理:

# 定义要同步的两个目录
DIR1="/long_path_1"
DIR2="/long_path_2"

# 1. 处理普通文件:内容一致则同步到较旧的修改时间
find "$DIR1" -type f -exec bash -c '
for file do
    # 提取相对路径,匹配另一个目录中的对应文件
    rel_path=${file#"$DIR1"/}
    file2="$DIR2/$rel_path"
    
    # 跳过目标目录中不存在的文件
    [[ -f "$file2" ]] || continue
    # 跳过内容不一致的文件
    cmp -s "$file" "$file2" || continue
    
    # 比较时间,把新文件的时间改成旧文件的时间
    if [[ "$file" -ot "$file2" ]]; then
        touch -r "$file" "$file2"
    elif [[ "$file2" -ot "$file" ]]; then
        touch -r "$file2" "$file"
    fi
done
' bash {} +

# 2. 处理符号链接:链接目标一致则同步到较旧的修改时间
find "$DIR1" -type l -exec bash -c '
for link do
    rel_path=${link#"$DIR1"/}
    link2="$DIR2/$rel_path"
    
    [[ -h "$link2" ]] || continue
    # 比对链接的目标是否完全一致
    [[ $(readlink "$link") == $(readlink "$link2") ]] || continue
    
    # 只同步链接本身的修改时间(-h选项不跟随链接)
    if [[ "$link" -ot "$link2" ]]; then
        touch -h -r "$link" "$link2"
    elif [[ "$link2" -ot "$link" ]]; then
        touch -h -r "$link2" "$link"
    fi
done
' bash {} +

# 3. 处理目录:对应目录存在则同步到较旧的修改时间
# 前提:已通过diff确认两个目录的内容结构一致
find "$DIR1" -type d -exec bash -c '
for dir do
    rel_path=${dir#"$DIR1"/}
    dir2="$DIR2/$rel_path"
    
    [[ -d "$dir2" ]] || continue
    
    # 同步目录本身的修改时间
    if [[ "$dir" -ot "$dir2" ]]; then
        touch -r "$dir" "$dir2"
    elif [[ "$dir2" -ot "$dir" ]]; then
        touch -r "$dir2" "$dir"
    fi
done
' bash {} +

为什么这个脚本更好?

  • 效率更高:用{} +代替{} \;,每次会把一批文件传给同一个bash进程,避免了为每个文件单独创建进程的开销,大目录下速度提升明显
  • 可读性强:每种类型的处理逻辑封装成循环,结构清晰,后续修改也方便
  • 兼容性好:所有引号都正确处理了带空格、特殊字符的路径,不用担心报错

注意事项

  • 如果不确定目录内容是否完全一致,可以在目录处理部分加一步diff -q "$dir" "$dir2"来验证,但会增加额外开销,建议提前做全量diff确认
  • 符号链接的处理默认只同步链接本身的时间,如果需要同步链接指向文件的时间,去掉touch的-h选项即可,但要注意权限问题
  • 执行前可以先在小范围目录测试,比如把DIR1改成子目录,确认逻辑没问题再跑全量

备注:内容来源于stack exchange,提问作者user1787659

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 14:35:32