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

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

使用步骤

  1. 将上述脚本保存为archive_audit.sh
  2. 赋予执行权限:
chmod +x archive_audit.sh
  1. 运行脚本:
./archive_audit.sh

关键说明

  • 用perl获取完整修改时间,避免ls的时间格式差异问题,无论文件新旧都能准确拿到年份;
  • 通过case语句将月份缩写转为全名,匹配需求的目录命名;
  • mkdir -p确保层级目录不存在时自动创建,无需手动提前建目录;
  • 脚本会自动跳过源目录中的子目录,只处理普通文件。

内容的提问来源于stack exchange,提问作者Christopher Karsten

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 17:10:24