排除查找中不包含特定文件名的目录?

问题描述:

比方说,我有一个包含许多子目录的目录,每个子目录中都有一些文件。我希望检查这些目录中哪些不包含特定的文件。例如,如果这是我的目录:排除查找中不包含特定文件名的目录?

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

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

dir/B 
dir/D 

是否有可能与UNIX find要做到这一点,或者做我需要使用一些替代工具?

我找到了一个很好的解决方案后, bit more research:

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

在哪里可以将foo替换为您要查找的任何文件。

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

+0

有没有办法删除输出中存在的当前文件夹'./'?,因为如果我需要将这些子目录复制到另一个目录,'。/'的存在将是有害的 – WanderingMind 2015-09-22 15:43:42

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

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

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

2 - 给执行权限上面的脚本:

chmod +x ./check.sh 

3 - 最后使用find命令:

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

有点迟到了,这里是一个一行是应工作:

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

诀窍是,ls */foo会悄悄地越过不匹配的目录(不包含“富”目录),因此使用xargs将强制它在不包含foo的目录上输出到stderr。那么这只是丢掉stdout只是看看我们正在寻找什么。