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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 14:36:01