如何递归将工作目录与备份目录中对应文件/目录的修改时间统一为二者中的最旧值?
如何递归将工作目录与备份目录中对应文件/目录的修改时间统一为二者中的最旧值?
我完全懂你这种折腾的烦恼——两个几乎一模一样的目录,就因为当年拷贝文件、解压归档时没注意保留修改时间,或者跨文件系统/用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
相关产品推荐
相关产品推荐

