Як знайти файл за назвою файлу в терміналі Mac OSX?


118

Я хочу , щоб знайти файл на моєму Macbook з ім'ям файлу: abc.dmg. Я намагався використовувати прожектор, але він не знаходить його. Коли я спробував знайти та використати:, find -name abc.dmg -path /я отримав помилки.

Який правильний синтаксис для пошуку файлу за назвою файлу за допомогою команди find на терміналі Mac OSX?


1
@VxJasonxV Питання щодо Apple на 100% стосуються теми для Super User, і немає жодної необхідності переносити туди кожне запитання Apple. Питання щодо iPhone або iPad, однак, будуть переміщені, коли / якщо потрібно.
— BinaryMisfit

Це було не стільки причиною того, що це поза темою, а тим, що існує більш конкретна тема / сайт для цієї загальної теми.
— VxJasonxV

@Diago: Чи були дискусії щодо цього на мета чи в чаті? Цікаво, адже AFAIK apple.SE буде запущений з бета-версії досить скоро, тому було б непогано розмістити всіх на одній сторінці.
— Robert S Ciaccio

1
@calavera. Тут досить давню дискусію, але відповідну можна знайти тут . Apple SE, Ubuntu SE та Linux SE - це все, щоби зробити комплімент Super User, але жодним чином ми не хочемо змушувати користувачів рухатися. Я вважаю за краще тут задавати свої питання Apple, а не Apple, оскільки я використовую 3 різні операційні системи. Якщо у мене є дуже конкретне питання, я його запитую на більш спеціалізованому сайті.
— BinaryMisfit

Відповіді:


163

У своєму найпростішому вигляді findприймає один параметр: шлях. У своїй фактично корисній формі він проходить шлях, який супроводжується критеріями звуження.

Таким чином, ви хочете:

  • find (Програма)
  • / (шлях), і
  • -name abc.dmg (критерії).
find / -name abc.dmg

12
Ви можете отримати помилки відхиленого дозволу під час пошуку всього диска, але вони можуть бути проігноровані, якщо ви не очікуєте, що файл буде в папці з обмеженим доступом. Якщо так, використовуйте sudo find / -name abc.dmg
— Chris Nava

Спробував це, але результату немає.
— SPRBRN

6
Імовірно, тоді на комп’ютері у вас немає файлу з іменем abc.dmg. Ви можете використовувати -iname замість -name, щоб зробити пошукову справу нечутливою. Я дуже сумніваюся, що ви насправді шукаєте "abc.dmg", і враховуючи цей (імовірно) факт, важко сказати вам, у чому полягає ваша проблема, не маючи фактичних деталей.
— VxJasonxV

2
@rxt: якщо find doo не знайде, його немає ...
— Robert S Ciaccio

5
Зважаючи на те, що звіт про ОП намагався знайти в тексті запитання, варто зазначити, що порядок аргументів має find значення . Якщо має бути find [path]+ [selection, grouping, and actions].
— dmckee

23

find . -name '*.csv'наприклад, працював для мене із мальовничими кодами. ОП також може використати find . -name '*.dmg'для перевірки свого поточного каталогу, якщо припустити, що він перебуває /.



6

Ви можете використовувати locateкоманду.

locate abc.dmg

2
Зверніть увагу на osxтег. slocate db не заповнюється за замовчуванням.
— VxJasonxV

Спробував це, створивши базу даних, але результату немає.
— SPRBRN

якщо locateі те і mdfindінше не вдасться, швидше за все, файл не на вашій машині. Або його не названо, як ви вважаєте, що його назвали. можливо пошук ВСІХ DMG може бути вашим наступним кроком?
— peelman

3

Найпростіший спосіб (який я впевнений, ви вже пробували, але ей, дозвольте мені все-таки додати його до теми) - це ввести abc.dmg у поле пошуку вгорі праворуч у будь-якому вікні пошуку, а потім виберіть "Файл Ім'я "з опцій на панелі пошуку, що відображається.

Немає потреби в терміналі.

Також пам’ятайте, що вказівники каталогів Spotlight лише вказані на панелі керування Spotlight та abc.dmg можуть бути не в одному з цих каталогів.

Виправте мене, якщо я помиляюся, але я думаю, що команда find повинна знати, що вивести:

find / -name abc.dmg -print

... повинен надрукувати будь-які результати в терміналі (включаючи помилки дозволу).

Якщо ви не хочете помилок дозволу і хочете шукати інші каталоги користувачів, виконайте вказані нижче дії.

sudo find / -name abc.dmg -print

2

Ви можете використовувати наступні функції командного рядка для швидкого пошуку та відкриття відповідного файлу. Мені це легше, ніж набрати довгу рядок запиту у вікні прожектора.

Додайте наступні функції в ~/.bash_aliases.

# find any item matching search query in file name
spot(){
  mdfind "kMDItemDisplayName=='*$1*'cd";
}

# restrict to files under (recursive) a specific path 
findpaper(){
    mdfind -onlyin "/Users/foo/articles" "kMDItemDisplayName=='*$1*'cd";
}

# default to open the first entry unless 2nd positional argument is given
openpaper(){
    FILEID=$(printf "%sp" ${2:-1})

    open "$(mdfind -name -onlyin "/Users/foo/articles" "kMDItemDisplayName=='*$1*'cd" | sed -n "${FILEID}")"

}

Тепер source ~/.bash_aliasesабо відкрийте нову функцію завантаження терміналу. Щоб шукати файли зі словами, пиріг та 2016 в будь-якому місці в назві файлу, виконайте це

spot pie*2016 #or
spot 2016*pie

Немає необхідності додавати або додавати *до вашого запиту як шаблон пошуку, який '*$1*'вже вказує напис підкреслення на початку та в кінці вашого запиту. Додатково cdдля нечутливих до регістру і ігнорування діакритичних позначок, наприклад, fredповернеться як Frédéric, так і FrEDeric.

findpaperобмежить пошук результатів за певним шляхом (рекурсивний), тоді як openpaper pie*201відкриє (або перший із кількох результатів) результат пошуку або openpaper pie*201 3відкриє третій запис результату. Щоб уникнути відкриття bash-скриптів або інших файлів без документів, ви можете обмежити вміст файлу додатковими атрибутами пошуку. Див. Синтаксис запитів щодо метаданих файлів і https://ss64.com/osx/mdfind.html для використання інших пошукових операторів.


Дивовижно!
— Стилінг

0

Запишіть список кожного файлу на диску як корінь з /

sudo find / &> ~/file-list.txt
sudo chown $(whoami) ~/file-list.txt

Проведіть весь файл через grep для пошуку всього диска:

cat ~/file-list.txt | grep abc.dmg

Використовуйте регулярні вирази, щоб відображати лише файли .jpg та .dmg:

cat ~/file-list.txt | grep -E "(\.dmg|\.jpg)"

Результат:

Applications/Visualisations/CurvedSpaces-forMac.app/Contents/Resources/Textures/paper.jpg

... тощо. На жаль, також буде захоплено всі змонтовані диски, тому найкраще вийняти ті з них, які мають багато посилань. Тож у іншому вікні я біжу, watch tail -n 10 ~/file-list.txtяке показує мені, де це в моєму підступному злому!


1
Погані практики чи речі, які заслуговують на коментар: (1) sudo find / > ~/file-list.txtздається кращим, ніж запускати всю оболонку як корінь. (2) find *буде пропускати приховані (крапкові) об'єкти (якщо такі є) у /. (3) &>- це башизм. (4) Марне використання cat. (5) grep abc.dmgбуде надруковано напр /foo/bar/123abcXdmg456/baz/whatever. // Одне добре, що ваша відповідь приносить до цього потоку (а інша відповідь - ні) - це підхід, коли користувач працює findодин раз, а потім повторно використовує збережений результат кілька разів, не запитуючи файлові системи (и) знову і знову. Однак ця потенційна перевага не наголошена.
— Каміль Маціоровський

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