Як знайти файл за назвою файлу в терміналі 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.