¿Es posible buscar una combinación de directorio / archivo?

12

Necesito encontrar una imagen, digamos ABC.jpg, que sé que se habrá colocado programáticamente en un directorio llamado ABC_MPSC. He intentado:

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

Pero eso no devuelve nada (en realidad sé dónde está el que estoy buscando, así que sé que existe). ¿Existe un comando de búsqueda que me permita no tener que buscar manualmente?

hmmm
fuente
2
También puede encontrarlo usando locate, que debería ser significativamente más rápido, pero solo funciona si el archivo ya existía la updatedbúltima vez que se ejecutó.
Simon Richter

Respuestas:

17

Hay un -pathpredicado que es útil aquí:

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

La descripción de POSIX para ese predicado es:

El primario evaluará como verdadero si el nombre de ruta actual coincide con el patrón utilizando la notación de coincidencia de patrón descrita en la notación de coincidencia de patrón. Las reglas adicionales en los patrones utilizados para la expansión del nombre de archivo no se aplican ya que esta es una operación de coincidencia, no una expansión.

La razón por la que -name "ABC_MPSC/ABC.jpg"falló es porque el -namepredicado:

se evaluará como verdadero si el nombre base del nombre de ruta actual coincide con el patrón

En otras palabras, -namenunca ve el directorio del nombre de archivo actual, solo el nombre de archivo base (ABC.jpg, por ejemplo).

Jeff Schaller
fuente
10

Dos formas (aparte de usar-path ):

  1. Busque el directorio, luego detecte el archivo:

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

    Esto se basa en la findimplementación para expandirse {}al nombre de ruta actual del directorio encontrado, aunque esté concatenado con /ABC.jpg(no es necesario hacerlo). También podría escribirse como

    find / -type d -name 'ABC_MPSC' \
        -exec sh -c 'test -f "$1"/ABC.jpg' sh {} \; -print
    
  2. Busque el archivo, luego verifique el nombre del directorio principal:

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

Ambas alternativas serían más lentas que usarlas -pathcomo lo muestra Jeff. Sin embargo, los dejo aquí como ejemplos, ya que posiblemente podrían adaptarse para otras cosas.

Kusalananda
fuente