【问题标题】:How can I find all the folders that contain certain file extensions in Bash?如何在 Bash 中找到包含某些文件扩展名的所有文件夹?
【发布时间】:2019-01-05 00:36:11
【问题描述】:

我需要编写一个 Bash 脚本(最好是单行脚本)来查找当前目录下的所有 子目录,其中包含具有特定文件扩展名的任何文件,即.tf。棘手的部分是一个文件夹中可能有多个.tf 文件,我需要文件夹 - 不是文件名。

例如,假设我的目录内容如下所示:

.
├── docs
│   ├── README.md
│   └── diagram.png
├── project
│   └── main.py
├── Makefile
├── terraform
│   ├── environments
│   │   ├── prod
│   │   │   └── main.tf
│   │   └── staging
│   │       └── main.tf
│   └── module
│       ├── ecs.tf
│       ├── rds.tf
│       ├── s3.tf
│       ├── security_group.tf
│       ├── sqs.tf
│       └── variable.tf
├── tests
|   └── test_main.py
└── .terraform
    └── ignore_me.tf

在这种情况下,我希望命令返回 terraform/moduleterraform/environments/prodterraform/environments/staging。我还需要一种方法来过滤掉某些不应包含的目录。在上面的示例中,请注意我没有包含点文件目录.terraform

我已经知道怎么写下面的find命令,可以自己找到.tf文件:

find . -name '*.tf' -not -path '*.terraform*'

但是我不确定如何编写命令来查找包含这些文件的目录。

【问题讨论】:

    标签: bash


    【解决方案1】:

    您可以使用 find 的 -printf 操作仅打印出目录名称,然后删除重复项:

    find . -name '*.tf' -not -path '*.terraform*' -printf '%h\n' | sort -u
    

    -printf '%h\n' 打印出包含匹配文件的目录名称,而末尾的 sort -u 删除重复项。

    【讨论】:

    • 如果您的目录名称包含换行符,这仍然会产生不正确的输出。这些显然是一个不常见的极端情况,但需要指出。
    【解决方案2】:

    试试这个:

    shopt -s globstar
    
    echo **/*.tf | xargs dirname | sort -u
    

    【讨论】:

    • 如果任何文件或目录名称包含空格,这将不起作用。
    • 我同意。你的答案更完整。我建议添加 [[ -f "$i" ]] ||在没有找到任何内容且 i 为 */.tf 或存在扩展名为 .tf 的目录的情况下继续循环。
    【解决方案3】:

    这个find 命令也应该可以工作:

    find . -type d -not -path '*/.terraform*' \
    -exec bash -c 'shopt -s failglob; ( : "$1"/*.tf ) 2>/dev/null && echo "$1"' - {} \;
    
    • 如果 glob 模式失败,failglob 将返回失败。
    • find 命令扫描当前路径中的每个目录,bash -c 检查每个目录中是否存在*.tf 文件。

    【讨论】:

      【解决方案4】:

      你可以这样做:

      shopt -s globstar  # to enable support for **
      
      for i in **/*.tf; do echo "${i%/*}"; done | sort -u
      

      如果您尚未启用**shopt 行将为您完成。

      我们遍历所有子目录中的所有*.tf 文件并打印出它们的目录名称(通过切断所有尾随/* 组件)。 sort -u 用于删除重复项。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-22
        • 2016-09-02
        • 2014-08-11
        • 1970-01-01
        • 2019-07-07
        • 2022-12-14
        相关资源
        最近更新 更多