我有一个包含大量子目录和文件的目录A ,并希望获得名为foo的所有文件的列表,这些文件位于A中与*bar相匹配的目录中。 例如:
./goldbar/fiz/baz/foo ./leadbar/foo ./candy/figbar/foo 我有一些额外的限制:
*bar (这是一个必要的优化,因为它需要很长时间来扫描) 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,它似乎工作,希望它有帮助。