É possível procurar uma combinação de diretório / arquivo?

12

Preciso encontrar uma imagem, digamos ABC.jpg, que eu sei que terá sido programaticamente colocada em um diretório chamado ABC_MPSC. Eu tentei:

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

Mas isso não retorna nada (na verdade eu sei onde está o particular que estou procurando, então sei que ele existe). Existe um comando find que me permita não precisar pesquisar manualmente?

hmmm
fonte
2
Você também pode encontrá-lo usando locate, que deve ser significativamente mais rápido, mas funciona apenas se o arquivo já existia na updatedbúltima execução.
Simon Richter

Respostas:

17

Há um -pathpredicado que é útil aqui:

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

A descrição do POSIX para esse predicado é:

O primário deve avaliar como verdadeiro se o nome do caminho atual corresponde ao padrão usando a notação de correspondência de padrões descrita em Notação de Correspondência de Padrão. As regras adicionais em Padrões usados ​​para expansão de nome de arquivo não se aplicam, pois esta é uma operação correspondente, não uma expansão.

A razão pela qual você -name "ABC_MPSC/ABC.jpg"falhou é porque o -namepredicado:

deve avaliar como verdadeiro se o nome da base do nome do caminho atual corresponde ao padrão

Em outras palavras, -namenunca vê o diretório do nome do arquivo atual, apenas o nome do arquivo base (ABC.jpg, por exemplo).

Jeff Schaller
fonte
10

Duas maneiras (além de usar-path ):

  1. Procure o diretório e detecte o arquivo:

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

    Isso depende da findimplementação para expandir {}para o nome do caminho atual do diretório encontrado, mesmo que concatenado com /ABC.jpg(não é necessário fazer isso). Também poderia ser escrito como

    find / -type d -name 'ABC_MPSC' \
        -exec sh -c 'test -f "$1"/ABC.jpg' sh {} \; -print
    
  2. Procure o arquivo e verifique o nome do diretório pai:

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

Ambas as alternativas seriam mais lentas do que -pathas usadas como Jeff mostra. Estou deixando-os aqui como exemplos, no entanto, pois eles poderiam ser adaptados para outras coisas.

Kusalananda
fonte