如何使用AQL或Artifactory REST API删除Artifactory中的空文件夹
Artifactory 空文件夹清理可行方案
方案1:优化现有REST API实现(无需额外工具权限)
你原来的命令逻辑可以优化,解决两个问题:一是避免误删有文件但无子目录的文件夹,二是减少多步管道的性能损耗,优化后命令如下:
# 1. 递归拉取目标路径下所有文件夹路径 curl -u "${username}:${password}" -X GET "<ARTIFACTORY_URL>/artifactory/api/storage/<REPO_NAME>/jenkins/artifacts?list&deep=0&listFolders=1&mdTimestamps=1" | jq -r '.files[] | select(.folder == true) | .uri' > folder_list.txt # 2. 逐个判断文件夹是否为空并删除 while read folder_path; do item_count=$(curl -u "${username}:${password}" -s "<ARTIFACTORY_URL>/artifactory/api/storage/<REPO_NAME>/jenkins/artifacts${folder_path}?list&deep=1" | jq '.files | length') if [ $item_count -eq 0 ]; then echo "删除空文件夹: ${folder_path}" curl -u "${username}:${password}" -X DELETE "<ARTIFACTORY_URL>/artifactory/<REPO_NAME>/jenkins/artifacts${folder_path}" fi done < folder_list.txt
如果目标路径下文件夹量级过万,可以把deep参数调整为合适的层级分批处理,避免单次请求超时
方案2:使用JFrog CLI实现(本地客户端无需服务端权限)
如果你可以在本地安装JFrog CLI(仅本地运行,不需要服务端安装插件,符合你的权限限制),可以用更简洁的方式实现,性能比原生curl调用高很多:
首先配置CLI认证:
jf config add artifactory_instance --url <ARTIFACTORY_URL> --user ${username} --password ${password}
然后执行空文件夹清理:
# 搜索所有空文件夹,--limit可按需调整批量大小 jf rt s "<REPO_NAME>/jenkins/artifacts/*" --include-folders | jq -r '.[] | select(.type == "folder" and .size == 0) | .path' | while read empty_folder; do jf rt delete "${empty_folder}" -q done
该方案的优势是CLI内置了请求重试、批量处理逻辑,比手动编写curl脚本稳定性更高
方案3:AQL优化查询方案
你之前对AQL的用法可以调整,不需要匹配type为any,而是直接通过AQL筛选出没有子条目的文件夹,查询语句示例:
items.find({ "repo": "<REPO_NAME>", "path": {"$match": "jenkins/artifacts/*"}, "type": "folder", "$or": [ {"children": {"$size": 0}}, {"children": {"$exists": false}} ] })
调用AQL接口执行查询并批量删除的脚本:
curl -u "${username}:${password}" -X POST "<ARTIFACTORY_URL>/artifactory/api/search/aql" \ -H "Content-Type: text/plain" \ -d 'items.find({"repo":"<REPO_NAME>","path":{"$match":"jenkins/artifacts/*"},"type":"folder","$or":[{"children":{"$size":0}},{"children":{"$exists":false}}]})' \ | jq -r '.results[] | "\(.repo)/\(.path)/\(.name)"' | while read folder_path; do curl -u "${username}:${password}" -X DELETE "<ARTIFACTORY_URL>/artifactory/${folder_path}" done
该方案比逐一遍历文件夹性能高很多,查询逻辑由Artifactory服务端直接处理,减少了大量客户端和服务端的交互请求
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

