하위 폴더에서 검색하되 상위 폴더는 제외

하위 폴더에서 검색하되 상위 폴더는 제외

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)
  1. 루프 파일(공백이 아닌 문자로 구분된 파일 이름, LF, CR, TAB... -print0옵션 포함)
  2. 파일 이름에서 디렉터리 이름 가져오기
  3. 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

관련 정보