在子文件夹中搜索但排除上面的文件夹

在子文件夹中搜索但排除上面的文件夹

我正在尝试创建 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)
  1. 循环文件(nul 字符分隔文件名,不是空格,也不是 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

相关内容