Czy można wyszukać kombinację katalogu / pliku?

12

Muszę znaleźć obraz, powiedzmy ABC.jpg, który, jak wiem, zostanie programowo umieszczony w katalogu o nazwie ABC_MPSC. Próbowałem:

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

Ale to nic nie zwraca (tak naprawdę wiem, gdzie jest ten, którego szukam, więc wiem, że istnieje). Czy istnieje polecenie find, które może pozwolić mi nie szukać ręcznie?

hmmm
źródło
2
Można go również znaleźć za pomocą locate, co powinno być znacznie szybsze, ale działa tylko wtedy, gdy plik już istniał podczas updatedbostatniego uruchomienia.
Simon Richter

Odpowiedzi:

17

-pathPrzydaje się predykat:

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

POSIX opis do tego predykatu jest:

Jednostka podstawowa oceni jako prawdę, jeśli bieżąca nazwa ścieżki pasuje do wzorca, używając zapisu dopasowywania wzorca opisanego w Notacji dopasowania wzorca. Dodatkowe reguły we wzorcach używanych do rozszerzenia nazwy pliku nie mają zastosowania, ponieważ jest to operacja dopasowania, a nie rozszerzenie.

Powodem -name "ABC_MPSC/ABC.jpg"niepowodzenia jest -namepredykat:

ocenia się jako prawda, jeśli basename bieżącej nazwy ścieżki pasuje do wzorca

Innymi słowy, -namenigdy nie widzi katalogu bieżącej nazwy pliku, a jedynie samą nazwę pliku podstawowego (na przykład ABC.jpg).

Jeff Schaller
źródło
10

Dwa sposoby (oprócz używania-path ):

  1. Poszukaj katalogu, a następnie wykryj plik:

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

    To polega na findimplementacji, aby rozwinąć {}do bieżącej nazwy ścieżki znalezionego katalogu, nawet jeśli jest on połączony z /ABC.jpg(nie jest to wymagane ). Można to również zapisać jako

    find / -type d -name 'ABC_MPSC' \
        -exec sh -c 'test -f "$1"/ABC.jpg' sh {} \; -print
    
  2. Wyszukaj plik, a następnie sprawdź jego nazwę katalogu nadrzędnego:

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

Obie te alternatywy byłyby wolniejsze niż użycie -pathw sposób pokazany przez Jeffa. Zostawiam je tutaj jednak jako przykłady, ponieważ mogą być przystosowane do innych rzeczy.

Kusalananda
źródło