我正在尝试创建 for 循环并搜索特定目录的文件类型。我的结构如下:
tree -d -L 2 .
.
├── modules <-- This folder don't have any configuration files and need to be skipped
│ └── lambda <-- This folder is where I want to search for files
├── sub1
│ └── lambda
├── sub10
├── sub1@tmp
├── sub2
│ └── lambda
├── sub3
│ └── lambda
├── sub7
│ └── lambda
└── sub9
└── lambda
循环正在执行的操作是在文件夹中搜索特定文件类型并运行命令。一切都按预期工作,但应从循环中跳过文件夹“modules”,并检查“./modules/lambda”内的文件夹。
我的脚本是:
#!/bin/bash
set -e
for d in $(find . -mindepth 2 -maxdepth 3 -not -path "*/.*" -type f -name "*.tf" | awk -F / ' { print $2 } ')
do
cd ${d}
echo `terraform init && terraform apply --auto-approve`
cd -
done
如果我运行命令,我会看到下面的输出,我不想循环模块文件夹,但我想循环抛出 ex 内的子文件夹。拉姆达:
find . -mindepth 2 -maxdepth 3 -not -path "*/.*" -type f -name "*.tf" | awk -F / ' { print $2 } '
sub1
modules
modules
sub2
sub3
sub7
sub9
答案1
您在 terraform 文件上循环。好的。
但:
- 不要直接在
find
输出上循环(特殊字符不受保护) - 不要获取目录名称
awk
(因为你不知道深度)
#!/bin/bash
set -e
while IFS= read -r -d '' tf_filename; do
tf_dirname="${tf_filename%/*}"
printf "Terraform dir = '%s'" "$tf_dirname"
cd "${tf_dirname}" >/dev/null \
&& {
terraform init && terraform apply --auto-approve
cd - >/dev/null
}
done < <(find . -mindepth 2 -maxdepth 3 -not -path "*/.*" -type f -name "*.tf" -print0)
- 循环文件(nul 字符分隔文件名,不是空格,也不是 LF、CR、TAB...带
-print0
选项) - 从文件名获取目录名
- 以作品
terraform
为执行条件cd
没有 '<(...)' 运算符的版本:
#!/bin/bash
set -e
find . -mindepth 2 -maxdepth 3 -not -path "*/.*" -type f -name "*.tf" -print0 \
| while IFS= read -r -d '' tf_filename; do
tf_dirname="${tf_filename%/*}"
printf "Terraform dir = '%s'" "$tf_dirname"
cd "${tf_dirname}" >/dev/null \
&& {
terraform init && terraform apply --auto-approve
cd - >/dev/null
}
done
你还可以使用这个shebang:#! /usr/bin/env bash