【问题标题】:Exclude directories in find that don't contain a specific filename?在 find 中排除不包含特定文件名的目录?
【发布时间】:2013-04-25 21:45:41
【问题描述】:

假设我有一个包含许多子目录的目录,每个子目录中都有许多文件。我希望检查其中哪些目录不包含特定文件。例如,如果这些是我的目录:

dir/A:
    foo
    bar
dir/B:
    bar
dir/C:
    foo
dir/D:
dir/E:
    foo
    bar

如果我想列出所有不包含foo 的目录,我会得到:

dir/B
dir/D

是否可以使用 unix find 执行此操作,或者我需要使用其他工具吗?

【问题讨论】:

    标签: unix find


    【解决方案1】:

    经过一番研究,我找到了一个很好的解决方案:

    find . -type d \! -exec test -e '{}/foo' \; -print

    在哪里用您要查找的任何文件替换 foo

    这将打印出不包含您要查找的任何文件的所有目录的列表。

    【讨论】:

    • 有没有办法删除输出中存在的当前文件夹./ ?因为如果我需要将这些子目录复制到另一个目录,./ 的存在将是有害的
    【解决方案2】:
    comm -3 <(find -type d) <(find -name foo -printf '%h\n')
    
    • 获取所有目录
    • 仅获取包含foo 的目录
    • 比较,仅打印差异

    【讨论】:

      【解决方案3】:

      1 - 在当前目录(或路径中的某处)中创建一个简单的 1 衬里脚本。让我们将其命名为check.sh

      cd "$1" && [[ ! -f "$2" ]] && pwd
      

      2 - 授予上述脚本执行权限:

      chmod +x ./check.sh
      

      3 - 最后使用这个查找命令:

      find . -maxdepth 1 -type d -exec ./check.sh '{}' foo \;
      

      【讨论】:

        【解决方案4】:

        派对有点晚了,这里有一个应该可以工作的单线:

        ls | xargs -I dir ls dir/foo > /dev/null
        

        诀窍在于ls */foo 会默默地传递不匹配的目录(不包含 'foo' 的目录),所以使用xargs 会强制它给我们输出到 stderr 在不包含 foo 的目录上。然后只需扔掉 stdout 即可查看我们正在寻找的内容。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-01-04
          • 1970-01-01
          • 2020-04-24
          • 2023-04-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多