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

bit*_*ker 12 find

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

cd /
find . -name "ABC_MPSC/ABC.jpg"
Run Code Online (Sandbox Code Playgroud)

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

Jef*_*ler 17

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

find . -path '*/ABC_MPSC/ABC.jpg'
Run Code Online (Sandbox Code Playgroud)

该谓词的POSIX 描述是:

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

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

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

换句话说,-name永远不会看到当前文件名的目录,只会看到基本文件名本身(例如 ABC.jpg)。


Kus*_*nda 10

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

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

    find / -type d -name 'ABC_MPSC' -exec test -f {}/ABC.jpg \; -print
    
    Run Code Online (Sandbox Code Playgroud)

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

    find / -type d -name 'ABC_MPSC' \
        -exec sh -c 'test -f "$1"/ABC.jpg' sh {} \; -print
    
    Run Code Online (Sandbox Code Playgroud)
  2. 查找文件,然后检查它的父目录名称:

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

这两种替代方法都比-path按照 Jeff 展示的方式使用要慢。我仍然将它们留在这里作为示例,因为它们可能适用于其他事物。