如何基于目录输出文本文件筛选最新文件超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
工作说明
- 阈值计算:用
date命令生成3天前的Unix时间戳,作为判断“超过3天”的基准。 - 文本解析:
- 识别所有顶层目录行(以
drwx开头),存入数组记录。 - 定位每个目录的详情块(以路径加冒号开头),提取目录名称。
- 对每个文件行,根据是否带年份提取日期,转换为Unix时间戳,记录每个目录下的最新文件时间。
- 识别所有顶层目录行(以
- 条件判断:遍历所有目录,对比最新文件时间戳与阈值,输出符合条件的目录名。
注意事项
- 脚本依赖GNU
date(Linux系统默认支持),如果是BSD系统(如macOS),需调整date命令参数(比如用date -j -f "%b %d %Y" "Dec 8 2022" +%s转换日期)。 - 确保文本中的目录与对应详情块一一对应,否则可能出现匹配错误。
内容的提问来源于stack exchange,提问作者soccerrat
相关产品推荐
相关产品推荐

