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

如何基于目录输出文本文件筛选最新文件超3天的目录名称?

从目录详情文本中筛选符合条件的目录

问题描述

需要编写脚本,从包含目录列表及目录内文件详情的文本文件(如file.txt)中,找出最新文件已超过3天的目录并输出其名称。示例file.txt内容如下:

drwxr-xr-x 2 root root 4096 Aug  3 00:00 Directory1
drwxr-xr-x 2 root root 4096 Aug 15 00:00 Directory2
drwxr-xr-x 2 root root 4096 Aug 15 00:00 Directory3

/root/Downloads/syslog/Directory1:
total 12
-rw-r--r-- 1 root root 18 Aug 20 00:00 file1
-rw-r--r-- 1 root root  9 Jun 23 00:00 file2
-rw-r--r-- 1 root root  9 Dec  8  2022 file3

不同于直接用find -mtime操作真实文件,需要从静态文本中解析日期并判断。

解决方案

以下是结合bash和awk的脚本实现,可处理文本中带/不带年份的日期格式,筛选出符合条件的目录:

#!/bin/bash

# 计算3天前的Unix时间戳,作为判断阈值
THREE_DAYS_AGO=$(date -d "3 days ago" +%s)

# 解析文本文件,筛选目标目录
awk -v cutoff="$THREE_DAYS_AGO" '
# 记录所有顶层目录
/^drwx/ {
    dirs[$NF] = 1
    next
}
# 定位当前处理的目录详情块
/^\/.*:$/ {
    split(substr($0, 1, length($0)-1), path_parts, "/")
    current_dir = path_parts[length(path_parts)]
    next
}
# 提取文件的修改日期并转换为时间戳
/^-/ && !/^total/ {
    # 适配两种日期格式:带年份/不带年份
    if ($9 ~ /^[0-9]{4}$/) {
        file_date = sprintf("%s %s %s", $6, $7, $9)
    } else {
        file_date = sprintf("%s %s %s", $6, $7, $8)
    }
    # 调用date命令转换为时间戳
    cmd = "date -d \"" file_date "\" +%s"
    cmd | getline file_ts
    close(cmd)
    # 更新当前目录的最新文件时间戳
    if (file_ts > latest_ts[current_dir]) {
        latest_ts[current_dir] = file_ts
    }
}
# 遍历所有目录,输出符合条件的名称
END {
    for (dir in dirs) {
        if (latest_ts[dir] < cutoff) {
            print dir
        }
    }
}
' file.txt

工作说明

  1. 阈值计算:用date命令生成3天前的Unix时间戳,作为判断“超过3天”的基准。
  2. 文本解析:
    • 识别所有顶层目录行(以drwx开头),存入数组记录。
    • 定位每个目录的详情块(以路径加冒号开头),提取目录名称。
    • 对每个文件行,根据是否带年份提取日期,转换为Unix时间戳,记录每个目录下的最新文件时间。
  3. 条件判断:遍历所有目录,对比最新文件时间戳与阈值,输出符合条件的目录名。

注意事项

  • 脚本依赖GNU date(Linux系统默认支持),如果是BSD系统(如macOS),需调整date命令参数(比如用date -j -f "%b %d %Y" "Dec 8 2022" +%s转换日期)。
  • 确保文本中的目录与对应详情块一一对应,否则可能出现匹配错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 13:27:22