使用Ansible我正在努力使用find
模块的确切文件名,而不使用regex。
我的用例需要用户输入,我担心用户会试图聪明地使用regex做比我想让他们做的更多的事情。如果字符串包含regex字符,我可以拒绝它,但我宁愿将字符串视为精确的文件名。
下面的代码确实找到了匹配的文件,但是如果给定的文件名是*.txt
,那么所有的.txt文件都将被匹配。
- name: collect paths for matching file
find:
paths: "{{ target_folder }}"
patterns: "{{ filename }}"
file_type: file
recurse: true
register: file_matches
我担心拒绝特定字符串的影响的原因是,我知道,在极少数情况下,要查看的一些文件名具有非ascii字符,我不知道这将如何与no-regex断言一起发挥作用。
看起来违反直觉,一个选项实际上是通过regex启用匹配,参数use_regex: true
与regex_escape
过滤器的使用相结合。
原因在pattern
参数注释中指出:
一个或多个(shell或regex)模式,其类型由
use_regex
选项控制。
<一口> 来源:https://docs.ansible.com/ansible/latest/collections/ansible/builtin/find_module.html参数模式 一口>
并且由于use_regex
的默认值是false
,因此默认行为将具有Shell模式,如果您以regex方式转义该字符,则无法很好地工作。
所以,你的任务最终是:
- name: collect paths for matching file
find:
paths: "{{ target_folder }}"
patterns: "{{ filename | regex_escape }}"
file_type: file
recurse: true
use_regex: true
register: file_matches