如何规范化指向 APFS 卷组成员的路径

How to normalize paths pointing to members of an APFS Volume Group

我的代码有时会获取指向卷组辅助卷的路径。

例如,在 Catalina 或 Big Sur 启动卷上,有一个系统和一个数据角色成员,我可能有如下路径:

/System/Volumes/Data/usr/local/bin

常规(“规范化”)路径为:

/usr/local/bin

如何使用可用的 macOS 框架函数(Obj-C 或 Swift)将第一条路径转换为第二条路径?

请注意,我不想为此简单地硬编码字符串替换,因为至少在 Big Sur 上,组中的其他已安装卷也会发生同样的情况。例如,我可能有另一个 10.15 的可启动系统,其卷名为“Catalina”,然后这两个卷将显示为:

系统:/Volumes/Catalina 数据:/Volumes/Catalina - 数据

现在,如果我得到像 /Volumes/Catalina - Data/Users/Shared 这样的路径,我想将其规范化为 /Volumes/Catalina/Users/Shared

NSStrings resolvingsymlinksinpath 方法应该可以解决问题![​​=14=]

给定 let path:String = "/System/Volumes/Data/Users/":

(lldb) po path
"/System/Volumes/Data/Users/"

(lldb) po (path as NSString).resolvingSymlinksInPath
"/Users"

除了 Patrick 的回答之外,这里还有一些应该也有效的替代方法:

// macOS 10.12 and later:
NSString *normalizedPath;
[url getResourceValue:&normalizedPath forKey:NSURLCanonicalPathKey error:nil];

// pre-10.12:
NSURL *normalizedURL = url.fileReferenceURL.filePathURL;

此外,fcntl 调用 F_GETPATH_NOFIRMLINK 应该适用于此。

的作用是[NSURL URLByStandardizingPath]

请注意,firmlinked 卷的根目录,例如/System/Volumes/Data,不会像人们希望的那样导致 /。这条路径需要特殊处理,即需要检测它是一个卷 (NSURLIsVolumeKey),如果是,则确定其“主”成员。请参阅 了解完成该部分的方法。

要确定 shell(终端)中的规范化路径,请参阅 https://superuser.com/a/1490999/41872