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 -nrcut -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
相关产品推荐
相关产品推荐

