我有一个A
包含大量子目录和文件的目录,并且想要获取与匹配的foo
目录中所有名为 的文件的列表。例如:A
*bar
- 是的:
./goldbar/fiz/baz/foo
- 是的:
./leadbar/foo
- 不:
./candy/figbar/foo
我有一些额外的限制:
- 我不能进入不匹配的目录
*bar
(这是一个必要的优化,因为扫描这些目录需要很长时间) - 我不能允许 shell 进行 glob 扩展,因为它会返回许多结果:(即
find *bar -type f -name foo
失败)
我认为-path
旗帜会给我我需要的结果,但我不知道它是否符合上述第一个约束。
A
编辑:假设该匹配中有 n*10k 个目录*bar
。即,任何尝试使用所有这些目录构建命令(而不是逐个处理命令)的操作都将失败。
答案1
我不确定如何-path
处理“不要进入不匹配的目录*bar
”要求,而且我懒得构建环境来找出答案。但
我知道以下内容几乎可以在任何 *nix 平台上运行:
for dir in `ls -1 | grep bar`; do
find $dir -type f -name foo
done
如果您的顶级目录中有纯文件、套接字等,或者您想要稍微修改一下条件,则可能需要对ls
/位进行额外的调整。grep
答案2
如果你正在寻找一个纯粹的解决方案find
,那么
find . \( -depth 1 -type d \! -name "*bar" \) -prune -o \( -depth +1 \! -type d -name foo \) -print
应该可以解决问题。
答案3
尝试一下 - 但不确定它会有多快。
find -maxdepth 1 -type d -name '*bar' -exec find {} -name foo \;
注意:这不适用于 Solaris 10,因为它没有找到-maxdepth
答案4
我使用 strace 进行了检查,发现 -path 本身无法避免不必要的侵入不匹配的目录。不过,下面这个应该可以解决问题:
find . \( -name '.' \) -print -o \( ! -path '*directory_pattern*' \) -prune -o -name '*file_pattern*' -print
\(
在这个特定情况下,实际上并不需要 and ,\)
但它们增加了可读性,如果您使用更复杂的表达式,则可能需要它们。使用 strace 检查后发现它似乎有效,希望对您有所帮助。