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

如何使用Ansible列表删除指定前缀匹配的文件?

解决Ansible遍历删除前缀匹配文件的问题

你的需求是遍历列表,删除以列表元素为前缀的所有文件,当前代码仅能精确匹配的原因是Ansible的file模块不支持通配符路径,直接写/var/tmp/MyFile/{{ item }}只会删除与元素完全同名的文件,无法匹配前缀。以下是两种可行的解决方案:

方案一:用find模块(推荐,符合Ansible幂等性)

先通过find模块查找所有符合前缀匹配的文件,再批量删除:

---
- hosts: localhost
  connection: local
  vars:
    regexp: '(?<=\/)(.*?)(?=\-[0-9])'
  tasks:    
    # 提取需要的前缀列表,自动过滤空值
    - set_fact: matches="{{ unarchived_list.files | map('regex_search', regexp) | select() | list }}"
    
    - debug: msg="{{ matches }}"

    # 查找每个前缀对应的所有文件
    - name: Find files matching each prefix
      find:
        paths: "/var/tmp/MyFile"
        patterns: "{{ item }}*"
        use_regex: no
      register: found_files
      with_items: "{{ matches }}"

    # 删除所有找到的文件
    - name: Delete matched files
      file:
        path: "{{ file_item.path }}"
        state: absent
      loop: "{{ found_files.results | flatmap(attribute='files') | list }}"

说明:

  • select()会自动过滤regex_search返回的None空值,无需额外定义empty变量
  • flatmap(attribute='files')会把find返回的多组文件列表合并成一个单层列表,方便后续遍历删除

方案二:用shell模块(简洁,需注意安全)

直接调用shell执行rm命令,实现和rm file*完全一致的效果:

---
- hosts: localhost
  connection: local
  vars:
    regexp: '(?<=\/)(.*?)(?=\-[0-9])'
  tasks:    
    - set_fact: matches="{{ unarchived_list.files | map('regex_search', regexp) | select() | list }}"
    
    - debug: msg="{{ matches }}"

    - name: Delete files starting with each prefix
      shell: rm -f "/var/tmp/MyFile/{{ item }}*"
      with_items: "{{ matches }}"

说明:

  • -f参数确保文件不存在时不会抛出错误
  • 注意:如果matches中的元素包含空格、特殊字符(如*、?),需要额外处理转义,避免意外删除文件,因此仅推荐在元素内容安全可控时使用此方案

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 17:48:11