在使用find命令时排除不包含特定文件名的目录?

5

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

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

如果我想列出所有不包含foo的目录,我将得到:
dir/B
dir/D

可以使用Unix的find命令来实现吗?还是需要使用其他工具?

4个回答

7
我在进一步研究后找到了一个好的解决方案:
使用以下命令: find . -type d \! -exec test -e '{}/foo' \; -printfoo 替换为你要查找的文件名。
这将列出所有不包含所需文件的目录列表。

有没有办法删除输出中存在的当前文件夹 ./?因为如果我需要将这些子目录复制到另一个目录,那么 ./ 的存在会对此造成不利影响。 - rambalachandran

0

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

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

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

chmod +x ./check.sh

3 - 最后使用此查找命令:

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

0
comm -3 <(find -type d) <(find -name foo -printf '%h\n')
  • 获取所有目录
  • 仅获取包含foo的目录
  • 比较,只打印差异

0
有点晚了,但这里有一个应该能用的一行代码:
ls | xargs -I dir ls dir/foo > /dev/null

诀窍在于ls */foo会默默地跳过不匹配的目录(不包含“foo”的目录),因此使用xargs将强制它在不包含foo的目录上向我们输出到stderr。然后只需丢弃stdout,就可以看到我们要找的内容了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接