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
コマンドを実行すると、次の出力が表示されます。私はモジュールフォルダを繰り返したくないが、throw 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)
- ループファイル(スペース以外の文字で区切られたファイル名、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