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

如何在Ansible中统计AWS S3子文件夹内的文件数量

解决Ansible统计S3指定前缀下各子文件夹文件数量的问题

我懂你的需求啦——你现在的代码只能算出所有文件的总数,但想要按folder/下面的每个子文件夹分别统计文件数量对吧?咱们来修改代码,实现你要的效果。

原代码的问题分析

你现有的CountFilesS3Folder任务直接取了s3_bucket_items.s3_keys | length,这只会返回所有文件的总数量(也就是你看到的11);而且with_items: s3_bucket_items的用法也不对,因为s3_bucket_items是整个注册的结果对象,不是可遍历的列表。

修正后的完整Playbook

我们可以利用Ansible的过滤器实现分组统计,这里给你两种清晰的实现方式:

方式一:一步到位的循环处理

- name: AwsS3
  aws_s3:
    bucket: teste-acme
    mode: list
    prefix: folder/
  register: s3_bucket_items

- name: Count files per subfolder under prefix
  debug:
    msg: "{{ item.0 }} {{ item.1 | length }}"
  loop: "{{ s3_bucket_items.s3_keys | map('split', '/') | map('extract', 1) | list | zip(s3_bucket_items.s3_keys) | groupby(0) }}"

方式二:分步处理更易读

如果觉得上面的链式过滤器有点绕,可以拆成两步,逻辑更直观:

- name: AwsS3
  aws_s3:
    bucket: teste-acme
    mode: list
    prefix: folder/
  register: s3_bucket_items

- name: Prepare folder-file pairs for grouping
  set_fact:
    s3_folder_file_pairs: "{{ s3_bucket_items.s3_keys | map('split', '/') | map(lambda x: {'folder': x[1], 'file': '/'.join(x)}) | list }}"

- name: Count files per subfolder
  debug:
    msg: "{{ item.key }} {{ item.list | length }}"
  loop: "{{ s3_folder_file_pairs | groupby('folder') }}"

代码逻辑解释

  1. 第一步(AwsS3任务):和你原来的代码一致,获取指定前缀下的所有文件路径,注册到s3_bucket_items变量中。
  2. 提取子文件夹名称:利用split('/')把每个文件路径拆分成列表,比如folder/bambu/bambu-338400da-1.tgz会被拆成['folder', 'bambu', 'bambu-338400da-1.tgz'],我们取索引为1的元素(也就是子文件夹名)。
  3. 分组统计:用groupby过滤器按子文件夹名分组,然后统计每组的长度,就是对应文件夹下的文件数量。

运行后的期望输出

执行后你会得到和需求一致的结果:

ok: [localhost] => { "msg": "bambu 1" }
ok: [localhost] => { "msg": "bonsai 1" }
ok: [localhost] => { "msg": "sakura 4" }
ok: [localhost] => { "msg": "shibazakura 3" }
ok: [localhost] => { "msg": "ume 2" }

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:15:36