【发布时间】:2022-01-18 22:49:41
【问题描述】:
我正在运行 macOS Big Sur,并希望使用“查找”终端命令在我的启动卷上搜索文件名。问题是启动卷包含一个名为“卷”的文件夹,其中列出了所有已安装的卷。当我想将搜索限制在启动卷时,这会导致“查找”搜索所有已安装的磁盘。如何构建一个终端命令,将操作限制在一个挂载的卷上?
【问题讨论】:
我正在运行 macOS Big Sur,并希望使用“查找”终端命令在我的启动卷上搜索文件名。问题是启动卷包含一个名为“卷”的文件夹,其中列出了所有已安装的卷。当我想将搜索限制在启动卷时,这会导致“查找”搜索所有已安装的磁盘。如何构建一个终端命令,将操作限制在一个挂载的卷上?
【问题讨论】:
对于挂载在 /Volumes 下的卷,很简单:使用 find -x。根据手册页:
-x防止 find 下降到设备号与下降开始的文件的设备号不同的目录中。
但这比这更复杂,因为从 macOS Catalina (v10.15) 开始,看似系统卷实际上是两个不同卷的合成,一个包含不可变核心 OS 文件的系统卷(以只读方式安装) ,以及一个包含所有用户数据、配置文件、添加的软件等的“数据”卷。文件系统根目录是系统卷,数据卷安装在 /System/Library/Volumes/Data,“firmlinks”用于使部分数据卷出现在文件系统中的相关位置(例如 /Users 与 /System/Library/Volumes/Data/Users 牢固链接)。更多信息请参见 Ask Different here 和 here,以及 Eclectic Light Company here 的详细地图。
让这个问题变得棘手的部分原因是系统和数据卷具有相同的设备号,因此find -x 将它们视为相同的卷,并且会在不注意的情况下从一个卷交叉到另一个卷(包括以下固件链接)。例如,如果您搜索主文件夹中的内容,您可能会在 /Users/yourname 和 /System/Volumes/Data/Users/yourname 下找到相同的文件。根据您的需要,您可能需要排除 /System/Volumes/Data 以避免这些重复的结果。我认为您几乎总是可以通过在您的正常搜索前加上-path /System/Volumes/Data -prune -false -o 来排除它(除非您正在进行深度优先搜索)。例如,要在整个系统中搜索“myfile.txt”而不出现重复结果,您可以使用:
sudo find -x / -path /System/Volumes/Data -prune -false -o -name myfile.txt
(正如我所说,我认为除了深度优先搜索之外,这几乎总是有效的,但我可能错了——在你相信它之前先测试它。)
如果您想阻止find 关注固定链接...那就更难了。我认为您必须解析 /usr/share/firmlinks 中的固定链接列表,并从中生成一个修剪列表。
find 中似乎还有一个错误,它会在数据卷 (!) 下找到部分系统卷。这是一个显示与文件的虚假第二次匹配的示例:
$ find -x / -name BridgeVersion.bin 2>/dev/null
/System/Library/CoreServices/BridgeVersion.bin
/System/Volumes/Data/System/Library/CoreServices/BridgeVersion.bin
$ ls /System/Volumes/Data/System/Library/CoreServices/BridgeVersion.bin
ls: /System/Volumes/Data/System/Library/CoreServices/BridgeVersion.bin: No such file or directory
我真的不知道该怎么处理这个。
顺便说一句,您可能会遇到的另一件事是透明度、同意和控制 (TCC) 隐私系统(请参阅here)和系统完整性保护(SIP,请参阅here)限制对许多部分的访问文件系统(独立于普通文件权限和 root 访问权限),因此您可能需要授予对运行 find 的任何应用程序的访问权限,或者关闭 SIP,或者只是忽略很多权限错误。
【讨论】: