排除查找中不包含特定文件名的目录?
问题描述:
比方说,我有一个包含许多子目录的目录,每个子目录中都有一些文件。我希望检查这些目录中哪些不包含特定的文件。例如,如果这是我的目录:排除查找中不包含特定文件名的目录?
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
替换为您要查找的任何文件。
这将打印出所有不包含任何文件的目录列表。
答
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只是看看我们正在寻找什么。
有没有办法删除输出中存在的当前文件夹'./'?,因为如果我需要将这些子目录复制到另一个目录,'。/'的存在将是有害的 – WanderingMind 2015-09-22 15:43:42