如何使用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
相关产品推荐
相关产品推荐

