AIX系统:如何按文件日期将文件移入年月层级文件夹结构
AIX审计日志按年月归档的解决方案
问题描述
需要将AIX系统的审计日志按「年份/完整月份名」的层级结构归档,但遇到AIX系统ls -l命令的格式问题:近期文件的时间列显示具体时间而非年份,导致无法直接用awk+循环提取文件的年月信息来完成归档。
待归档文件位于/opt/audit/move/,执行ls -l的输出示例:
ls -l /opt/audit/move/
输出:
-rw-r--r-- 1 gl_user user 0 18 Aug 2019 test1.txt -rw-r--r-- 1 gl_user user 0 06 Nov 18:55 test2.txt
期望的归档结构:
# 归档后文件路径示例 /opt/audit/2019/August/test1.txt /opt/audit/2022/November/test2.txt
解决思路
避开ls的时间格式歧义,直接用工具获取文件的完整修改时间戳,再提取年月信息创建目录并移动文件。AIX上可以用perl或兼容的stat命令获取完整时间。
实现脚本
以下是可直接运行的bash脚本,处理文件归档:
#!/bin/bash SOURCE="/opt/audit/move" TARGET_ROOT="/opt/audit" # 遍历源目录下的所有文件 for f in "$SOURCE"/*; do # 跳过非文件类型 [ -f "$f" ] || continue # 用perl获取文件修改时间的完整字符串(如"Mon Nov 6 18:55:00 2022") mod_str=$(perl -e 'print scalar localtime((stat shift)[9])' "$f") # 提取年份和月份缩写 year=$(echo "$mod_str" | awk '{print $4}') month_abbr=$(echo "$mod_str" | awk '{print $2}') # 将月份缩写转换为全名 case $month_abbr in Jan) month="January";; Feb) month="February";; Mar) month="March";; Apr) month="April";; May) month="May";; Jun) month="June";; Jul) month="July";; Aug) month="August";; Sep) month="September";; Oct) month="October";; Nov) month="November";; Dec) month="December";; esac # 创建目标目录(自动递归创建层级) target_dir="$TARGET_ROOT/$year/$month" mkdir -p "$target_dir" # 移动文件到目标目录 mv "$f" "$target_dir/" done
使用步骤
- 将上述脚本保存为
archive_audit.sh - 赋予执行权限:
chmod +x archive_audit.sh
- 运行脚本:
./archive_audit.sh
关键说明
- 用
perl获取完整修改时间,避免ls的时间格式差异问题,无论文件新旧都能准确拿到年份; - 通过
case语句将月份缩写转为全名,匹配需求的目录命名; mkdir -p确保层级目录不存在时自动创建,无需手动提前建目录;- 脚本会自动跳过源目录中的子目录,只处理普通文件。
内容的提问来源于stack exchange,提问作者Christopher Karsten
相关产品推荐
相关产品推荐

