我是一名 Linux 管理员,我习惯使用locate命令。我不记得这个命令是OSX自带的还是我使用brew安装的。
您可能知道,locate 与 find 不同,它创建一个数据库,允许从终端进行快速搜索。常规的 Linux updatedb 命令(用于刷新数据库)对我来说不起作用,我必须使用:sudo /usr/libexec/locate.updatedb
。此外,配置文件位于:/etc/locate.rc
。
我希望能够找到 iCloud Drive 上的文件。问题是,尽管已将其设置为索引整个“/”系统,但定位不会索引位于以下位置的 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.
因此,也许我需要使用一些技巧,将用户 nobody 添加到我的用户组,但我以前从未听说过 nobody 用户。此外,如果我想将我的普通用户组附加到 nobody 用户,也没有 usermod 命令。
你们这些聪明人有没有什么建议可以解决这个奇怪的要求?
答案1
我会跳过尝试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
)
(尽管这实际上是不完整的——例如,它不包含完全索引和可搜索的文本文件的内容。)