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

Shell脚本实现查找指定修改日期后文件并按修改日期排序

解决Shell脚本筛选并按修改日期排序文件的问题

没问题,我来帮你一步步实现这个需求!针对你提到的两个核心步骤,我会给出具体的命令和完整脚本示例,完美适配你给出的文件日期格式。

第一步:筛选修改日期晚于指定日期的文件

我们可以借助GNU find 命令的 -newermt 选项,它能直接识别类似 Mar 28、Apr 1 这种日常日期格式,用起来非常顺手。

比如你要筛选修改时间晚于Apr 1 00:00的文件,命令如下:

find /your/target/dir -type f -newermt "Apr 1 00:00"
  • -type f:只筛选普通文件,自动排除目录、链接等非文件类型
  • -newermt "Apr 1 00:00":指定筛选条件——修改时间晚于这个日期字符串(也支持2024-04-01这种ISO标准格式)

第二步:按修改日期排序文件

这里提供两种可靠的排序方式,优先推荐第一种(时间戳排序),能彻底避免日期格式解析的潜在问题:

方式1:用Unix时间戳排序(最稳妥)

find 可以输出文件的Unix时间戳(从1970年开始累计的秒数),结合sort按数字排序,最后提取出纯文件名:

find /your/target/dir -type f -newermt "Apr 1 00:00" -printf "%T@ %p\n" | sort -n | cut -d' ' -f2-
  • -printf "%T@ %p\n":输出格式为「Unix时间戳 文件名」,时间戳能精准反映修改时间先后
  • sort -n:按数字从小到大排序(即从旧到新),如果要从新到旧排序,只需加-r改成sort -nr
  • cut -d' ' -f2-:去掉开头的时间戳部分,只保留文件名

方式2:结合ls排序(显示详细信息)

如果需要同时看到文件的修改时间、大小等详细信息,可以用xargs把find的结果传给ls -lt(按修改时间从新到旧排序):

find /your/target/dir -type f -newermt "Apr 1 00:00" -print0 | xargs -0 ls -lt
  • -print0和-0:专门处理带空格或特殊字符的文件名,避免出现解析错误
  • ls -lt:按修改时间从新到旧排序,换成ls -ltr则是从旧到新排序

完整脚本示例

把上面的逻辑整合成可复用的脚本,方便你随时调整参数:

#!/bin/bash

# 配置参数
TARGET_DIR="./"  # 目标目录,这里默认用当前目录
CUTOFF_DATE="Apr 1 00:00"  # 筛选的截止日期
SORT_ORDER="asc"  # asc=从旧到新,desc=从新到旧

# 构建排序参数
if [ "$SORT_ORDER" = "desc" ]; then
    SORT_OPTION="-nr"
else
    SORT_OPTION="-n"
fi

# 执行筛选和排序
find "$TARGET_DIR" -type f -newermt "$CUTOFF_DATE" -printf "%T@ %p\n" | sort $SORT_OPTION | cut -d' ' -f2-

比如用你给出的文件示例,当CUTOFF_DATE设为Apr 2 00:00时,输出会是:

file_K_2
fi...(你的Apr 9的文件)
file_L_6
file_H_4
file_H_5

(按从旧到新排序,如果把SORT_ORDER设为desc则顺序完全反过来)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:13:27