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


12

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

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

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



2
您还可以使用来找到它locate,它应该快得多,但是仅updatedb在上次运行时该文件已经存在时才起作用。
西蒙·里希特

Answers:


17

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

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

该谓词的POSIX 描述为:

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

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

如果当前路径名的基本名与pattern匹配,则求值为true

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


10

两种方式(除了使用-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
    

这两种选择都比-pathJeff所示的方式慢。我仍然将它们留在此处作为示例,因为它们可能会适用于其他事物。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.