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

在Ansible中快速查找指定时段内yyyymmdd_hhmmss格式的文件夹

高效查找指定时间区间内的yyyymmdd_hhmmss格式文件夹

你的问题核心是之前的方案通过遍历每个可能的时间值执行find,导致效率极低。这里提供一个只需要一次目录扫描+本地过滤的高效方案:

核心思路

  1. 先用find模块一次性找出所有名称符合yyyymmdd_hhmmss格式的文件夹
  2. 将文件夹名转换为无下划线的字符串(如20221231_120000 → 20221231120000),利用字符串字典序与时间顺序一致的特性,直接和起始/结束时间的无下划线字符串比较大小,筛选出符合区间的文件夹

完整Playbook示例

- name: 查找指定时间区间内的目标文件夹
  hosts: your_target_hosts
  vars:
    # 定义起始和结束时间(格式:yyyymmdd_hhmmss)
    start_dt: "20221231_120000"
    end_dt: "20230101_235920"
    check_path: "/folderstocheck/"
    # 预处理:将时间字符串转为无下划线的格式,用于比较
    start_str: "{{ start_dt | replace('_', '') }}"
    end_str: "{{ end_dt | replace('_', '') }}"
  tasks:
    - name: 扫描所有符合格式的文件夹
      ansible.builtin.find:
        paths: "{{ check_path }}"
        file_type: directory
        # 正则匹配8位日期+下划线+6位时间的文件夹名
        patterns: "^\\d{8}_\\d{6}$"
        use_regex: yes
      register: all_candidate_folders

    - name: 筛选出时间区间内的文件夹
      ansible.builtin.set_fact:
        target_folders: >
          {{
            all_candidate_folders.files |
            # 提取文件夹名称
            map(attribute='basename') |
            # 过滤出大于等于起始时间的
            select('>=', start_str) |
            # 过滤出小于等于结束时间的
            select('<=', end_str) |
            # 拼接回完整路径
            map('regex_replace', '^(.*)$', '{{ check_path }}\\1') |
            list
          }}

    - name: 输出结果
      ansible.builtin.debug:
        var: target_folders

方案优势

  • 仅执行一次目录扫描,不管时间区间跨度多大,都不会产生多次find调用
  • 过滤逻辑在Ansible本地完成,无需远程重复操作,速度提升极其明显
  • 字符串比较逻辑直观,无需复杂正则,易维护

为什么之前的方案慢?

你用with_sequence的方式会遍历区间内的每一个时间值(比如1小时区间就是3600个值),每个值都执行一次find操作,每次1秒的话总耗时就是3600秒=60分钟,效率极低。新方案完全避免了这个问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 08:45:46