我需要编写一个 Bash 脚本(最好是单行脚本)来查找当前目录下的所有子目录.tf,其中包含具有特定文件扩展名的任何文件,即. 棘手的部分是一个文件夹中可能有多个.tf文件,而我需要文件夹-而不是文件名。
例如,假设我的目录内容如下所示:
\n\n.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 docs\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 README.md\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 diagram.png\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 project\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Makefile\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 terraform\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 environments\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 prod\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main.tf\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 staging\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main.tf\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 module\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 ecs.tf\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 rds.tf\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 s3.tf\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 security_group.tf\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 sqs.tf\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 variable.tf\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 tests\n|\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 test_main.py\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 .terraform\n \xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 ignore_me.tf\nRun Code Online (Sandbox Code Playgroud)\n\n在这种情况下,我希望命令返回terraform/module, terraform/environments/prod, 和terraform/environments/staging。我还需要一种方法来过滤掉某些永远不应该包含的目录。在上面的示例中请注意,我没有包含点文件目录.terraform。
我已经知道如何编写以下 find 命令,它可以找到文件.tf本身:
find . -name '*.tf' -not -path '*.terraform*'\nRun Code Online (Sandbox Code Playgroud)\n\n但是我不确定如何编写命令来查找包含这些文件的目录。
\nlar*_*sks 11
您可以使用 find 的-printf操作仅打印出目录名称,然后删除重复项:
find . -name '*.tf' -not -path '*.terraform*' -printf '%h\n' | sort -u
Run Code Online (Sandbox Code Playgroud)
打印-printf '%h\n'出包含匹配文件的目录名称,而sort -u最后的 则删除重复项。