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

我有一个包含大量子目录和文件的目录A ,并希望获得名为foo的所有文件的列表,这些文件位于A中与*bar相匹配的目录中。 例如:

  • 是: ./goldbar/fiz/baz/foo
  • 是: ./leadbar/foo
  • No: ./candy/figbar/foo

我有一些额外的限制:

  • 我不能下降到不匹配*bar (这是一个必要的优化,因为它需要很长时间来扫描)
  • 我不能让shell执行glob扩展,因为它会返回许多结果:(即find *bar -type f -name foo失败)

我认为-path标志会给我我需要的结果,但我不知道它是否符合上述第一个约束条件。


编辑:假设A中有n * 10k个目录与*bar相匹配。 即任何试图用所有这些命令来build立命令(而不是处理每一个命令)都将失败。

我不知道如何-path将处理“不要下降到不符合*bar目录”的要求,我懒得build立一个环境来找出。
我知道下面几乎可以在任何* nix平台上运行:

 for dir in `ls -1 | grep bar`; do find $dir -type f -name foo done 

如果您在顶层目录中有纯文件,套接字等,或者您想稍微修改您的条件,则可能需要额外的ls / grep位的weaseling。

如果你正在寻找一个纯粹的解决scheme,那么

 find . \( -depth 1 -type d \! -name "*bar" \) -prune -o \( -depth +1 \! -type d -name foo \) -print 

应该做的伎俩。

试试这个 – 不知道它有多快。

 find -maxdepth 1 -type d -name '*bar' -exec find {} -name foo \; 

注意,这不适用于Solaris 10,因为它找不到-maxdepth

如何正则expression式版本:

 find -regex './[^/]*bar/.*/?foo$' 

编辑:调整它与一个更干净的一个,并终止行(所以你不匹配fooble,foogasm等…)

我用strace和-path检查本身不会避免不必要的入侵到不匹配的目录。 虽然这应该做的工作,

find . \( -name '.' \) -print -o \( ! -path '*directory_pattern*' \) -prune -o -name '*file_pattern*' -print

\(\)在这个特殊的情况下实际上并不需要,但是它们增加了可读性,如果你使用了更复杂的expression式,可能会需要它。 检查strace,它似乎工作,希望它有帮助。