>我有一个包含许多子目录的目录。在所有这些子文件夹中,我们有 *.yml 文件。
文件名如下所示:
file-name-daily-1.yml
file-name-daily-2.yml
file-name-weekly-1.yml
file-name-weekly-2.yml
file-name-monthly-1.yml
每个文件中都有一行,如下所示:
- name: Some line of text here
我有一个看起来像这样的命令:
node index.js --epr --run "[my matched string]" -p $D -p $F -p $T
我需要一个 bash 脚本,它将递归搜索目录中包含关键字的文件(每天、每周、每月、1、2 等(,然后在匹配的文件中抓取":"后面的文本。然后,我需要针对每个匹配项运行我的命令。
这个伟大的社区将如何完成这样的任务?
这可以在没有循环的情况下完成,如下所示:
find DIR/ -name *.yml -exec sh -c "grep '- name:.*' {} | sed 's/-name:(.*)/1/'| xargs -I '{}' yourcommand --yourargument {}" ;
其中yourcommand
将替换为要运行的命令,其中包含find
的结果。
此脚本首先find
通配符表达式匹配的文件。
然后,它执行一个命令,该命令使用grep
查找文件的相关行,并使用sed
修改输出以仅获取相关文本。
最后,参数通过管道传送到yourcommand
中,占位符{}
取代参数。
您可以使用以下方法测试代码
find DIR/ -name *.yml -exec sh -c "grep "^- name:" {} | sed 's/-name:(.*)/1/' | xargs -I '{}' echo "node index.js --epr --run {} -p $F -p $T -p $D1"" ;
并在对结果满意后删除echo
。
可能使用 lurker 提到的find
。
pattern="*-daily*"
for match in $(find . -name $pattern -exec grep '- name:' {} ; | awk -F ': ' '{print $2}'); do
node index.js --epr --run "${match}" -p $D -p $F -p $T
done