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