サブフォルダから検索しますが、親フォルダを除く

サブフォルダから検索しますが、親フォルダを除く

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

おすすめ記事