是否可以搜索目录/文件组合?

是否可以搜索目录/文件组合?

我需要找到一个图像,例如 ABC.jpg,我知道该图像会以编程方式放入名为 ABC_MPSC 的目录中。我试过了:

cd /
find . -name "ABC_MPSC/ABC.jpg"

但这不会返回任何内容(我实际上知道我正在搜索的特定内容在哪里,所以我知道它存在)。有没有一个 find 命令可以让我不必手动搜索?

答案1

这里有一个-path有用的谓词:

find . -path '*/ABC_MPSC/ABC.jpg'

POSIX 描述该谓词是:

如果当前路径名使用模式匹配表示法中描述的模式匹配表示法与模式匹配,则主变量应评估为 true。用于文件名扩展的模式中的附加规则不适用,因为这是匹配操作,而不是扩展。

你失败的原因-name "ABC_MPSC/ABC.jpg"是因为-name谓词:

如果当前路径名的基本名与模式匹配,则评估为 true

换句话说,-name从未见过目录当前文件名的,仅基本文件名本身(例如 ABC.jpg)。

答案2

两种方式(除了使用-path):

  1. 查找目录,然后检测文件:

    find / -type d -name 'ABC_MPSC' -exec test -f {}/ABC.jpg \; -print
    

    这依赖于find扩展{}到找到的目录的当前路径名的实现,即使它与/ABC.jpg(它不是必需的要做到这一点)。也可以写成

    find / -type d -name 'ABC_MPSC' \
        -exec sh -c 'test -f "$1"/ABC.jpg' sh {} \; -print
    
  2. 查找该文件,然后检查其父目录名称:

    find / -type f -name 'ABC.jpg' -exec sh -c '
        case $(dirname "$1") in
            */ABC_MPSC) exit 0 ;;
            *) exit 1
        esac' sh {} \; -print
    

-path这两种替代方案都会比杰夫展示的方式慢。尽管如此,我还是将它们留在这里作为示例,因为它们可能适用于其他用途。

相关内容