Назад | Перейти на главную страницу

MacOSX и Locate для поиска файлов на iCloud Drive

Я администратор Linux и привык к команде locate. Я не помню, является ли команда родной в OSX или я установил ее с помощью brew.

Как вы, возможно, знаете, locate отличается от find тем, что он создает базу данных, что позволяет выполнять быстрый поиск из терминала. Обычная команда Linux updatedb, которая обновляет базу данных, у меня не работает, я должен использовать: sudo /usr/libexec/locate.updatedb. Также файл конфигурации находится по адресу: /etc/locate.rc.

Я хочу иметь возможность находить файлы на iCloud Drive. Проблема в том, что даже если он настроен на индексирование всей системы «/», locate не индексирует iCloud Drive, который находится по адресу: ~/Library/Mobile Documents/com~apple~CloudDocs.

Я даже добавил это в тестовых целях в файл конфигурации и выполнил указанную команду обновления. Однако функция locate никогда не находит файл на iCloud Drive.

Я заметил, что на странице руководства по команде locate написано:

The locate database is typically built by user ``nobody'' 
and the locate.updatedb(8) utility skips directories which are not
readable for user ``nobody'', group ``nobody'', or world.  
For example, if your HOME directory is not world-readable, 
none of your files are in the database.

Так что, возможно, мне нужно проделать какой-нибудь трюк и добавить пользователя none в мою группу пользователей, однако я никогда раньше не слышал о пользователях nobody. Также нет команды usermod, если я хочу добавить мою обычную группу пользователей к пользователю nobody.

Есть ли у кого-нибудь из вас, умных умов, предложение, чтобы решить эту странную просьбу?

Я бы пропустил попытки получить locate для индексации файлов и используйте аналогичную, но гораздо более мощную систему macOS Spotlight. в отличие locate, он индексирует все (но затем ограничивает вывод файлами, доступными для чтения пользователем, выполняющим поиск). Он также постоянно обновляется и индексирует гораздо больше атрибутов файла, чем просто имя файла. Он доступен в командной строке с помощью то mdfind команда. По умолчанию он ищет по всем индексированным атрибутам файлов любой текст, который вы ему даете; если вы хотите искать только по имени, используйте -name вариант:

$ mdfind -name icloud-file
/Users/gordon/Library/Mobile Documents/com~apple~CloudDocs/Example-iCloud-File-2.txt
/Users/gordon/Library/Mobile Documents/com~apple~CloudDocs/Example-iCloud-File.rtf

Обратите внимание, что он не использует тот же синтаксис запроса, что и locate; -name просто выполняет поиск без учета регистра имени. Вы можете стать намного интереснее, используя Синтаксис выражения запроса метаданных Spotlight:

$ mdfind "kMDItemFSName == iCloud-File"    # this does an exact-match search, so no matches
$ mdfind "kMDItemFSName == *iCloud-File*"    # Wildcards to the rescue!
/Users/gordon/Library/Mobile Documents/com~apple~CloudDocs/Example-iCloud-File-2.txt
/Users/gordon/Library/Mobile Documents/com~apple~CloudDocs/Example-iCloud-File.rtf
$ mdfind "kMDItemFSName == *iCloud-File* && kMDItemContentType == public.plain-text"
/Users/gordon/Library/Mobile Documents/com~apple~CloudDocs/Example-iCloud-File-2.txt

Чтобы лучше понять, какие атрибуты он может искать, используйте mdls:

$ mdls "/Users/gordon/Library/Mobile Documents/com~apple~CloudDocs/Example-iCloud-File-2.txt"
_kMDItemOwnerUserID            = 501
kMDItemContentCreationDate     = 2017-09-01 19:06:49 +0000
kMDItemContentModificationDate = 2017-09-01 19:07:06 +0000
kMDItemContentType             = "public.plain-text"
kMDItemContentTypeTree         = (
    "public.plain-text",
    "public.item",
    "public.text",
    "public.data",
    "public.content",
    "public.plain-text"
)
kMDItemDateAdded               = 2017-09-01 19:07:06 +0000
kMDItemDisplayName             = "Example-iCloud-File-2.txt"
kMDItemFSContentChangeDate     = 2017-09-01 19:07:06 +0000
kMDItemFSCreationDate          = 2017-09-01 19:06:49 +0000
kMDItemFSCreatorCode           = ""
kMDItemFSFinderFlags           = 0
kMDItemFSHasCustomIcon         = (null)
kMDItemFSInvisible             = 0
kMDItemFSIsExtensionHidden     = 0
kMDItemFSIsStationery          = (null)
kMDItemFSLabel                 = 0
kMDItemFSName                  = "Example-iCloud-File-2.txt"
kMDItemFSNodeCount             = (null)
kMDItemFSOwnerGroupID          = 20
kMDItemFSOwnerUserID           = 501
kMDItemFSSize                  = 22
kMDItemFSTypeCode              = ""
kMDItemKind                    = "Plain Text Document"
kMDItemLogicalSize             = 22
kMDItemPhysicalSize            = 4096
kMDItemUserCreatedDate         = (
    "2017-09-01 19:06:49 +0000"
)
kMDItemUserCreatedUserHandle   = (
    501
)
kMDItemUserModifiedDate        = (
    "2017-09-01 19:06:52 +0000",
    "2017-09-01 19:07:06 +0000"
)
kMDItemUserModifiedUserHandle  = (
    501,
    501
)

(Хотя на самом деле это неполно - например, в него не входит содержимое текстового файла, которое полностью индексировано и доступно для поиска.)