假设我有一个包含许多子目录的目录,每个子目录中都有许多文件。我希望检查其中哪些目录不包含特定文件。例如,如果这些是我的目录:
dir/A:
foo
bar
dir/B:
bar
dir/C:
foo
dir/D:
dir/E:
foo
bar
如果我想列出所有不包含的目录foo
,我会得到:
dir/B
dir/D
是否可以使用 unix 执行此操作find
,还是需要使用其他工具?
经过更多研究,我找到了一个很好的解决方案:
find . -type d \! -exec test -e '{}/foo' \; -print
你在哪里替换foo
你正在寻找的任何文件。
这将打印出不包含您要查找的任何文件的所有目录的列表。
派对有点晚了,这里有一个应该可以工作的单线:
ls | xargs -I dir ls dir/foo > /dev/null
诀窍是它ls */foo
会默默地传递不匹配的目录(不包含 'foo' 的目录),因此 using将强制它在不包含 foo 的目录上xargs
向我们提供输出到stderr 。然后只需丢弃标准输出即可查看我们正在寻找的内容。
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 \;