在Ansible中快速查找指定时段内yyyymmdd_hhmmss格式的文件夹
高效查找指定时间区间内的
yyyymmdd_hhmmss格式文件夹 你的问题核心是之前的方案通过遍历每个可能的时间值执行find,导致效率极低。这里提供一个只需要一次目录扫描+本地过滤的高效方案:
核心思路
- 先用
find模块一次性找出所有名称符合yyyymmdd_hhmmss格式的文件夹 - 将文件夹名转换为无下划线的字符串(如
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
相关产品推荐
相关产品推荐

