Чи можливо шукати комбінацію каталогу / файлів?


12

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

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

Але це нічого не повертає (я фактично знаю, де саме той, який я шукаю, тому я знаю, що він існує). Чи є команда find, яка могла б дозволити мені шукати не вручну?



2
Ви також можете знайти його за допомогою locate, яке повинно бути значно швидшим, але працює лише в тому випадку, коли файл вже існував під час updatedbостаннього запуску.
Саймон Ріхтер

Відповіді:


17

Тут є -pathкорисний присудок:

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

POSIX опис для цього предиката:

Первинний повинен оцінювати як істинне, якщо поточне ім'я шляху відповідає шаблону, використовуючи позначення відповідності шаблонів, описані в Нотації відповідності шаблону. Додаткові правила у шаблонах, що використовуються для розширення імені файлів, не застосовуються, оскільки це сумісна операція, а не розширення.

Причина того, що ваш -name "ABC_MPSC/ABC.jpg"збій, полягає в тому, що -nameпредикат:

слід оцінити як істинне, якщо базове ім'я поточного імені шляху відповідає шаблону

Іншими словами, -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способу, як показує Джефф. Я залишаю їх тут як приклади, оскільки вони, можливо, можуть бути адаптовані до інших речей.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.