如何构建循环:用jq遍历JSON块筛选旧Zip包并处理
筛选并删除早于指定日期的ZIP文件(基于JQ解析JSON)
我来帮你一步步实现这个需求!首先咱们得从JSON数据里精准筛选出符合条件的ZIP包,再通过循环处理这些文件完成删除操作。
1. 用JQ筛选目标ZIP文件
首先,我们需要从你的JSON数据里挑出ZIP类型且修改时间早于指定日期的文件。JQ可以轻松完成这个筛选,还能提取我们需要的字段:
基础筛选(按日期匹配)
如果只需要按日期(忽略具体时间)筛选,用下面的命令:
jq -r '.hits[] | select(.mimeType == "application/zip" and (.lastModified | split(" ") | .[0]) < "2020-06-25") | .path' your_json_data.json
命令拆解:
.hits[]:遍历hits数组里的每一个数据块select(...):筛选两个条件:.mimeType == "application/zip":只保留ZIP格式的文件(.lastModified | split(" ") | .[0]) < "2020-06-25":提取lastModified里的日期部分,和目标日期比较
.path:输出文件的完整路径(方便后续删除操作)
精确时间筛选(含时分秒)
如果需要精确到具体时间点(比如删除2020-06-25 00:00:00之前的文件),可以把时间转换成时间戳来比较:
jq -r '.hits[] | select(.mimeType == "application/zip" and (.lastModified | strptime("%Y-%m-%d %H:%M:%S") | mktime) < ("2020-06-25 00:00:00" | strptime("%Y-%m-%d %H:%M:%S") | mktime)) | .path' your_json_data.json
2. 循环处理筛选结果
接下来,我们把JQ的筛选结果传入bash循环,逐个处理这些文件。下面是完整的脚本示例:
#!/bin/bash # 定义目标日期(可以按需修改) TARGET_DATE="2020-06-25" # 如果需要精确时间,改成 TARGET_DATETIME="2020-06-25 00:00:00" # 读取JQ筛选结果,循环处理每个文件 jq -r '.hits[] | select(.mimeType == "application/zip" and (.lastModified | split(" ") | .[0]) < "'"$TARGET_DATE"'") | .path' your_json_data.json | while read -r file_path; do # 先打印提示(测试阶段可以先看输出,确认无误再执行删除) echo "即将删除文件:$file_path" # 取消下面的注释,执行实际删除操作 # rm -f "$file_path" done
提示:如果你的JSON数据是通过API请求获取的(比如curl),可以直接把JQ命令接在请求后面,不用保存到文件:
curl "your_api_endpoint_url" | jq -r '...' | while read -r file_path; do ...; done
额外说明
- 测试阶段建议先保留
echo命令,确认输出的文件路径都是你想要删除的,再启用rm命令 - 如果环境中需要权限验证(比如AEM的包删除),可以把
rm换成对应的API删除命令,比如调用AEM的删除接口
内容的提问来源于stack exchange,提问作者Alfador
相关产品推荐
相关产品推荐

