AIX系统下使用SED处理子目录文件且不修改目录时间戳的咨询
AIX sed批量替换保留目录时间戳解决方案
问题原因
子目录时间戳更新是因为原脚本在待处理文件所在目录下创建、删除临时文件,目录内文件增删操作会触发目录元数据更新,导致目录mtime变更。
优化思路
将所有临时文件创建在系统公共临时目录(如/tmp),不在业务目录下做文件增删操作,仅修改目标文件本身的内容,即可避免子目录时间戳被更新。
修正后脚本
# 创建独立临时工作目录,避免进程冲突 WORK_TMP=$(mktemp -d /tmp/log_replace.XXXXXX) # 遍历所有目标log文件 find . -type f -name "*.log" -print0 | while IFS= read -r -d '' f do # 生成唯一临时文件名 tmp_file="${WORK_TMP}/$(basename "$f")_$$.tmp" # 备份原文件时间戳 touch -r "$f" "$tmp_file" # 执行替换输出到临时文件 sed "s/str1/str2/g" "$f" > "$tmp_file" # 用替换后的内容覆盖原文件(不触发目录文件增删) cat "$tmp_file" > "$f" # 恢复原文件的时间戳 touch -r "$tmp_file" "$f" # 清理临时文件 rm -f "$tmp_file" done # 全局临时目录清理 rm -rf "$WORK_TMP"
说明
- 采用
find -print0 + read -d ''的写法兼容带空格、特殊字符的文件名 - 替换逻辑不涉及业务目录下的临时文件创建/删除,不会触发目录元数据变更
- sed命令后加
g代表全局替换,若仅需替换每行第一个匹配内容可删除该参数
内容的提问来源于stack exchange,提问作者MikeU
相关产品推荐
相关产品推荐

