Как найти файл по имени файла в терминале Mac OSX?

119

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

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

SPRBRN
источник
1
@VxJasonxV Вопросы Apple на 100% посвящены теме Super User, и нет необходимости в том, чтобы перебрасывать туда все вопросы Apple. Однако вопросы iPhone или iPad будут перенесены, когда / если потребуется.
BinaryMisfit
Это была не столько причина того, чтобы быть не по теме, но тот факт, что есть более конкретная тема / сайт для этой общей темы.
VxJasonxV
@Diago: Были ли какие-либо дискуссии по этому поводу в мета или чате? Просто интересно, потому что AFAIK apple.SE скоро выйдет из бета-версии, поэтому было бы неплохо, чтобы все были на одной странице.
Роберт С. Чаччо
1
@calavera. Довольно старое, но актуальное обсуждение можно найти здесь . Apple SE, Ubuntu SE и Linux SE - все это для того, чтобы дополнить Super User, но мы никоим образом не хотим заставлять пользователей двигаться. Я предпочитаю задавать вопросы Apple, а не Apple, поскольку я использую 3 разные операционные системы. Если у меня есть очень конкретный вопрос, я задам его на более специализированном сайте.
BinaryMisfit

Ответы:

164

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

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

  • find (программа)
  • / (путь) и
  • -name abc.dmg (критерии).
find / -name abc.dmg
VxJasonxV
источник
12
При поиске по всему диску могут появляться ошибки типа «отказано в разрешении», но они могут игнорироваться, если только вы не ожидаете, что файл будет находиться в папке с ограниченным доступом. Если это так, используйте sudo find / -name abc.dmg
Крис Нава
Пробовал, но безрезультатно.
СПРБРН
6
Предположительно, у вас нет файла с именем abc.dmg на вашем компьютере. Вы можете использовать -iname вместо -name, чтобы сделать поиск нечувствительным к регистру. Я очень сомневаюсь, что вы на самом деле ищете «abc.dmg», и учитывая этот (предположительно) факт, трудно сказать вам, в чем заключается ваша проблема, не имея реальных деталей.
VxJasonxV
2
@rxt: если найти не найдет его, его там нет ...
Роберт С. Чаччо
5
Учитывая, что отчет ОП пытались найти в тексте вопроса, стоит отметить, что порядок аргументов find имеет значение . Если должно быть find [path]+ [selection, grouping, and actions].
dmckee
23

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

pjammer
источник
6

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

locate abc.dmg
Wuffers
источник
2
Обратите внимание на osxтег. slocate db не заполняется по умолчанию.
VxJasonxV
Пробовал, после создания базы данных, но безрезультатно.
СПРБРН
если locateи то и mdfindдругое не работает, скорее всего, файл не на вашем компьютере. Или его не называют, как вы думаете, его назвали. возможно, поиск ВСЕХ DMG может стать вашим следующим шагом?
Пилман
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 для использования других операторов поиска.

Samir
источник
Потрясающие! Подчеркивая это: D
Atcold
0

Захватите список всех файлов на вашем диске как root от /

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

Cat весь файл через 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

...и т.д. К сожалению, также будут записаны все смонтированные диски, поэтому лучше всего извлечь те Time Machine, у которых много ссылок. Так что в другом окне я бегу, watch tail -n 10 ~/file-list.txtкоторый показывает мне, где это происходит в моем подлого взлома!

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