Bash 脚本以递归方式迭代文件并使用正则表达式中的匹配项



>我有一个包含许多子目录的目录。在所有这些子文件夹中,我们有 *.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

最新更新