是否可以在 Mac OS X 中为网络卷创建定位数据库?

是否可以在 Mac OS X 中为网络卷创建定位数据库?

我需要能够快速搜索网络卷上的数百万个文件,而不是直接搜索,而是在数据库中查找信息。

与“自己动手”相比,使用locatemlocate构建数据库似乎是更合理的,但我无法获取locatemlocate处理 AFP 网络附加卷(或 SMB)。

有人有什么建议吗?locate.rc我用我能想到的所有组合更改了文件,但我怀疑 AFP 或 SMB 都不适用于 FILESYSTEMS 行。

FILESYSTEMS="hfs ufs afp"

我尝试了 NFS,但我无权访问服务器,因此无法将其设置为接受来自 Mac 的连接(它似乎要求您将“不安全”设置为域的选项之一)。

答案1

事实证明,有可能让locate.updatedb索引其他文件系统,包括网络连接的文件系统。
问题是文件系统的根(以及您想要索引的内容的树)必须可供用户/组“nobody”读取。

/etc/locate.rc 的使用方法正确

进一步研究后,我发现 /usr/libexec/locate.updatedb 只是使用 find 来构建索引。
它循环遍历 /etc/locate.rc FILESYSTEMS 中的条目(至少在 10.6 上,如果未设置,则默认为 hfs)。

find 的手册页建议使用“sysctl vfs”来找出计算机上有效的内容。就我而言:

sysctl vfs|grep mounted
vfs.nfs has 1 mounted instance
vfs.hfs has 3 mounted instances
vfs.autofs has 3 mounted instances
vfs.afpfs has 4 mounted instances

进行一些快速测试来验证这一点:

prowler:~%% mount |grep Volumes/keen
afp_1I6KyU4igzg00Q0vsj4E2G0H-1.2f0004fb on /Volumes/keen (afpfs, nodev, nosuid, mounted by keen)
prowler:~%% touch /Volumes/keen/test-afpfs
prowler:~%% find /Volumes/keen/ -name test-afpfs -fstype afpfs
prowler:~%% find /Volumes/keen/test-afpfs -name test-afpfs -fstype afpfs
/Volumes/keen/test-afpfs
prowler:~%% find /Volumes/keen/test-afpfs -name test-afpfs -fstype hfs
prowler:~%% 

至少对于 10.6 来说,afpfs 对于 AFP 挂载的文件系统是正确的。

现在 afpfs 失败了。

当 OSX (10.6) 挂载 AFP 卷(通过登录项或 Finder -> 前往 -> 连接到服务器挂载 - AFP 的传统 OSX 机制)时,它会将其挂载为仅用户可读:

prowler:/Volumes/keen%% ls -ld /Volumes/keen
drwx------  6 keen  keen  264 Dec 13 12:45 /Volumes/keen/

尝试手动更正此问题失败:

prowler:/Volumes/keen%% sudo chmod a+rx /Volumes/keen
prowler:/Volumes/keen%% ls -ld /Volumes/keen
drwx------  6 keen  keen  264 Dec 13 12:52 /Volumes/keen/

我还没有找到解决方法(我没有尝试过 autofs,因为该方法在每个 OSX 版本中都会被破坏……)。

已挂载的 hfs(以及大概的 hfs+ 等)卷不会出现此问题,通过磁盘工具 -> NFS 挂载(10.6)挂载的 NFS 卷也不会出现此问题。

prowler:~%% mount |grep nfs
murf:/backups on /Users/keen/backups (nfs, nodev, nosuid, automounted, nobrowse)
prowler:~%% ls -ld /Users/keen/backups
drwxrwxrwx  33 root  wheel  2048 Dec 13 03:05 /Users/keen/backups/

我在尝试测试仅对 afp 支架进行定位索引时发现了这一点:

prowler:/Volumes/keen%% grep FILESYSTE /etc/locate.rc 
FILESYSTEMS="afpfs"

prowler:/Volumes/keen%% sudo /usr/libexec/locate.updatedbshell-init: error retrieving current directory: getcwd: cannot access parent directories: Permission denied
shell-init: error retrieving current directory: getcwd: cannot access parent directories: Permission denied
shell-init: error retrieving current directory: getcwd: cannot access parent directories: Permission denied
find: .: Permission denied

在 afp 安装之外使用 $PWD 运行时没有出现该错误:

prowler:~%% sudo /usr/libexec/locate.updatedb
prowler:~%% 

但也没有任何结果:

prowler:~%% locate test-afpfs
prowler:~%% 

因此,到目前为止,我发现的简短答案是 - 是的!您可以定位以在 OSX 上索引网络卷。不,您无法索引 afp 网络卷。

答案2

因此,如果您尝试搜索数百万个文件,您可能希望通过命令行使用类似 grep 的命令。您可以通过 /volumes/sharename 访问共享(前提是您已通过 SMB 或 AFP 连接)。

#Print the files to screen:
grep -rI 'textstring' /Volumes/sharename/folder/

#capture the search in a file:
grep -rI 'textstring' /Volumes/sharename/folder/ > ~/desktop/searchResults.txt

*如果您的搜索非常宽松,它可能会变得非常大,因为它将捕获所有匹配的文件。

如果你只是想找一个文件,那么你可以像这样搜索

#display the results onscreen for a file ending in 'txt'
find /Volumes/sharename/folder -name '*txt'

#capture the results in a file on your desktop.
find /Volumes/sharename/folder -name '*txt' > ~/desktop/findResults.txt

*如果您的搜索非常宽松,这也会变得非常大,因为它会捕获所有匹配的文件。

您可以使用数据库来存储所有文件,但数据库的大小与存储文件的系统大小相同,通过这样做,您可以复制文件系统本身的功能。

另一种方法是搜索使用 rsync 创建的本地文件集。如果主机上没有 rsync 守护程序,您仍然可以挖掘所有可以访问的文件。同样,您需要的空间与要挖掘的文件一样多。

相关内容