如何限制 Linux 通过前缀查找?

如何限制 Linux 通过前缀查找?

我有一个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 检查后发现它似乎有效,希望对您有所帮助。

相关内容