92

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

Каков правильный синтаксис для поиска файла по имени с помощью команды find на терминале Mac OSX?

6 ответов6

127

В простейшем виде find принимает один параметр: путь. В своей действительно полезной форме он идет по пути сужения критериев.

Таким образом, вы хотите:

  • find (программа)
  • / (путь)
  • и -name abc.dmg (критерии).

find / -name abc.dmg

17

find . -name '*.csv' например, работал для меня с подстановочными знаками. OP также может использовать find . -name '*.dmg' чтобы проверить его текущий каталог, предполагая, что он был в / .

7

Команда mdfind использует базу данных Spotlight

http://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/mdfind.1.html

6

Вы можете использовать команду locate .

locate abc.dmg
3

Самый простой способ (который, я уверен, вы уже пробовали, но, в любом случае, позвольте мне добавить его в ветку), введите abc.dmg в поле поиска в верхнем правом углу любого окна поиска, а затем выберите "Файл". Имя »из опций на панели поиска, которая появляется.

Нет необходимости в терминале.

Также помните, что только Spotlight индексирует каталоги, указанные на панели управления Spotlight, и abc.dmg может отсутствовать в одном из этих каталогов.

Поправьте меня, если я не прав, но я думаю, что команда find должна знать, что выводить:

find / -name abc.dmg -print

... должен печатать любые результаты в терминал (в том числе ошибки разрешения).

Если вы не хотите ошибок разрешения и хотите искать другие каталоги пользователей, то:

sudo find / -name abc.dmg -print
1

Вы можете использовать следующие функции командной строки, чтобы быстро найти и открыть соответствующий файл. Я нахожу это проще, чем набирать длинную строку запроса в окне прожектора.

Добавьте следующие функции в ~/.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 для использования других операторов поиска.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .