Можно ли искать комбинацию каталогов / файлов?

12

Мне нужно найти изображение, скажем ABC.jpg, которое, как я знаю, будет программно помещено в каталог с именем ABC_MPSC. Я пробовал:

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

Но это ничего не возвращает (я на самом деле знаю, где именно тот, который я ищу, поэтому я знаю, что он существует). Есть ли команда поиска, которая может позволить мне не искать вручную?

хммм
источник
Очень похоже: unix.stackexchange.com/q/342392/117549 ; также: unix.stackexchange.com/q/352844/117549
Джефф Шаллер
2
Вы также можете найти его с помощью locate, который должен быть значительно быстрее, но работает только в том случае, если файл уже существовал на момент updatedbпоследнего запуска.
Саймон Рихтер

Ответы:

17

Здесь есть -pathпредикат, который полезен:

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

POSIX описание для этого предиката:

Основной должен оцениваться как true, если текущее имя пути соответствует шаблону, используя нотацию соответствия шаблону, описанную в нотации соответствия шаблона. Дополнительные правила в шаблонах, используемых для расширения имени файла, не применяются, так как это операция сопоставления, а не расширение.

Причина, по которой вы -name "ABC_MPSC/ABC.jpg"потерпели неудачу, заключается в том, что -nameпредикат:

оценивать как 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
    

Обе эти альтернативы будут медленнее, чем использование -pathв пути, как показывает Джефф. Я оставляю их здесь в качестве примеров, тем не менее, они могут быть адаптированы для других вещей.

Кусалананда
источник