È possibile cercare una combinazione directory / file?


12

Devo trovare un'immagine, diciamo ABC.jpg, che so che sarà stata inserita a livello di codice in una directory chiamata ABC_MPSC. Ho provato:

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

Ma questo non restituisce nulla (in realtà so dove si trova quello particolare che sto cercando, quindi so che esiste). Esiste un comando find che potrebbe permettermi di non dover cercare manualmente?



2
Puoi anche trovarlo usando locate, che dovrebbe essere significativamente più veloce, ma funziona solo se il file esisteva già quando è updatedbstata eseguita l'ultima volta.
Simon Richter,

Risposte:


17

C'è un -pathpredicato che è utile qui:

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

La descrizione POSIX per quel predicato è:

Il primario deve valutare come vero se il percorso corrente corrisponde al modello usando la notazione di corrispondenza del modello descritta in Notazione di corrispondenza del modello. Le regole aggiuntive in Pattern utilizzati per l'espansione del nome file non si applicano poiché si tratta di un'operazione di corrispondenza, non di espansione.

Il motivo per cui il tuo -name "ABC_MPSC/ABC.jpg"fallimento è dovuto al -namepredicato:

deve essere considerato vero se il nome di base dell'attuale percorso corrisponde al modello

In altre parole, -namenon vede mai la directory del nome file corrente, ma solo il nome file base stesso (ABC.jpg, per esempio).


10

Due modi (oltre all'utilizzo-path ):

  1. Cerca la directory, quindi rileva il file:

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

    Questo si basa findsull'implementazione per espandersi {}al percorso corrente della directory trovata, anche se è concatenato con /ABC.jpg(non è necessario farlo). Potrebbe anche essere scritto come

    find / -type d -name 'ABC_MPSC' \
        -exec sh -c 'test -f "$1"/ABC.jpg' sh {} \; -print
    
  2. Cerca il file, quindi controlla il nome della directory principale:

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

Entrambe queste alternative sarebbero più lente rispetto all'uso -pathnel modo mostrato da Jeff. Li lascerò qui come esempi, poiché potrebbero essere adattati per altre cose.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.