如何在Ansible中从filetree变量提取子串并拆分文件路径
Ansible 文件路径拆分处理方案
我有如下目录结构:
└── custom_files ├── colors.js ├── favicon.ico └── img ├── icons │ ├── android-icon-144x144.png │ └── favicon-16x16.png └── logo.svg
已通过以下Ansible代码将相对于inventory的文件路径输出到变量files_folder中:
custom_files_dir: "{{ inventory_dir }}/custom_files" files_folder: "{{ lookup('community.general.filetree', custom_files_dir) | selectattr('state', 'equalto', 'file') | map(attribute='src') | list | flatten | sort | select | unique | map('replace', custom_files_dir, '') }}"
得到的结果为:
files_folder: - /colors.js - /favicon.ico - /img/icons/android-icon-144x144.png - /img/icons/favicon-16x16.png - /img/logo.svg
以下是针对两个需求的实现方案:
需求1:提取每个文件路径最后一个/之前的目录部分
使用Ansible内置的dirname过滤器,直接对files_folder中的每个路径处理:
file_dirs: "{{ files_folder | map('dirname') | list }}"
执行后输出:
file_dirs: - / - / - /img/icons - /img/icons - /img
如果希望根目录对应的结果为空字符串而非/,可以追加replace过滤器:
file_dirs: "{{ files_folder | map('dirname') | map('replace', '/', '') | list }}"
处理后结果:
file_dirs: - '' - '' - img/icons - img/icons - img
需求2:拆分路径为目录和文件名的二维数组
结合dirname和basename过滤器,分别提取目录与文件名并组合成二维数组。这里提供两种写法:
写法1:单变量赋值
file_path_pairs: "{{ files_folder | map('zip', files_folder | map('dirname') | map('replace', '/', '', 1), files_folder | map('basename')) | map('list') | list }}"
写法2:循环构建数组(可读性更强)
- set_fact: file_path_pairs: [] - set_fact: file_path_pairs: "{{ file_path_pairs + [ [ item | dirname | replace('/', '', 1), item | basename ] ] }}" loop: "{{ files_folder }}"
两种写法最终都会得到目标结果:
file_path_pairs: - ['', 'colors.js'] - ['', 'favicon.ico'] - ['img/icons', 'android-icon-144x144.png'] - ['img/icons', 'favicon-16x16.png'] - ['img', 'logo.svg']
解释:dirname提取目录部分后,用replace('/', '', 1)移除开头的/,让根目录下的文件对应空字符串;basename负责提取纯文件名,最后将每一组目录和文件名封装为列表,再收集成二维数组。
内容的提问来源于stack exchange,提问作者Вадим Глушков
相关产品推荐
相关产品推荐

