我有一个文件列表(具有完整路径)。 如何只选择与模式匹配的文件?
例如我有:
/tmp/test/a.txt
/tmp/test/b.txt
/tmp/test/c.log
/tmp/test/d.log
/tmp/test/e.txt
我只想获取以log结尾的文件
/tmp/test/c.log
/tmp/test/d.log
我认为我的列表不适用于您的示例
这是我的脚本及其输出
- name: List all files
debug:
msg: "{{ item }}"
verbosity: 3
with_items: "{{ valid_logs_dir_files.stdout_lines }}"
将打印
changed: [localhost] => (item=/tmp/test/a.txt)
ok: [localhost] => (item=/tmp/test/b.txt)
ok: [localhost] => (item=/tmp/test/c.log)
ok: [localhost] => (item=/tmp/test/d.log)
ok: [localhost] => (item=/tmp/test/e.txt)
答案 0 :(得分:1)
如果该列表来自远程文件系统的动态列表,则可以使用find,例如。
- name: Get file name based on pattern
find:
paths: /tmp/test
patterns: "*.log"
register: find_results
- name: Download files log files, just as example about using find_result
fetch: src="{{ item['path'] }}" dest="myLocalDir"
with_items: "{{ find_results['files'] }}"
有关详细信息,请参见find - Return a list of files based on specific criteria。
要列出与本地计算机上的模式匹配的文件,请参阅fileglob。
如果您的列表不是从文件系统动态获得的,但是已经完成,请使用match
或search
filter
- hosts: 127.0.0.1
connection: local
vars:
myFiles:
- /tmp/test/a.txt
- /tmp/test/b.txt
- /tmp/test/c.log
- /tmp/test/d.log
- /tmp/test/e.txt
tasks:
- name: Filter list
set_fact:
new_list: "{{ myFiles | select('match','^/tmp/test/.*..log$') | list }}"
- name: Show filtered list
debug: msg="{{ item }}"
with_items: "{{ new_list }}"
用debug
模块相应地替换file
,以删除文件。