【问题标题】:How can I limit macOS terminal commands to a specific volume?如何将 macOS 终端命令限制为特定卷?
【发布时间】:2022-01-18 22:49:41
【问题描述】:

我正在运行 macOS Big Sur,并希望使用“查找”终端命令在我的启动卷上搜索文件名。问题是启动卷包含一个名为“卷”的文件夹,其中列出了所有已安装的卷。当我想将搜索限制在启动卷时,这会导致“查找”搜索所有已安装的磁盘。如何构建一个终端命令,将操作限制在一个挂载的卷上?

【问题讨论】:

    标签: macos terminal


    【解决方案1】:

    对于挂载在 /Volumes 下的卷,很简单:使用 find -x。根据手册页:

    -x 防止 find 下降到设备号与下降开始的文件的设备号不同的目录中。

    但这比这更复杂,因为从 macOS Catalina (v10.15) 开始,看似系统卷实际上是两个不同卷的合成,一个包含不可变核心 OS 文件的系统卷(以只读方式安装) ,以及一个包含所有用户数据、配置文件、添加的软件等的“数据”卷。文件系统根目录是系统卷,数据卷安装在 /System/Library/Volumes/Data,“firmlinks”用于使部分数据卷出现在文件系统中的相关位置(例如 /Users 与 /System/Library/Volumes/Data/Users 牢固链接)。更多信息请参见 Ask Different herehere,以及 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,或者只是忽略很多权限错误。

    【讨论】:

    • 'sudo find -x / -path /System/Volumes/Data -prune -false -o -name myfile.txt' 对我有用。很好的答案。
    猜你喜欢
    • 1970-01-01
    • 2017-07-19
    • 2022-08-24
    • 1970-01-01
    • 2019-05-27
    • 2017-01-15
    • 2017-10-08
    • 1970-01-01
    • 2019-01-30
    相关资源
    最近更新 更多