如何用AppleScript获取已挂载和未挂载磁盘的/dev节点列表?
当然可以搞定!你说的没错,System Events确实拿不到/dev节点——毕竟它是面向用户级文件系统的工具,而/dev是Unix底层的设备文件目录。不过我们可以结合AppleScript和shell命令来实现类似mount命令的效果,轻松获取已挂载和未挂载磁盘的/dev节点。
实现方案:结合AppleScript与Shell命令
1. 获取已挂载磁盘的/dev节点
直接调用mount命令过滤出磁盘设备,再用AppleScript解析结果:
-- 获取已挂载磁盘的/dev节点及挂载信息 set mountedDiskOutput to do shell script "mount | grep -E '^/dev/disk'" set diskInfoList to paragraphs of mountedDiskOutput repeat with diskLine in diskInfoList -- 拆分每行,提取/dev节点和挂载点 set AppleScript's text item delimiters to " on " set {devNode, mountDetails} to text items of diskLine set mountPoint to text item 1 of text items of mountDetails -- 截断后面的挂载参数 set AppleScript's text item delimiters to "" -- 这里可以替换成你需要的处理逻辑,比如存入列表 log "/dev节点: " & devNode & " | 挂载点: " & mountPoint end repeat
这段代码会过滤掉mount输出里的虚拟文件系统(比如/dev/fuse之类的),只保留磁盘设备的信息,然后拆分出/dev/diskXsY格式的节点和对应的挂载点。
2. 获取所有磁盘(含未挂载)的/dev节点
要拿到未挂载的磁盘,我们可以用diskutil list命令,它会列出系统识别的所有磁盘设备:
-- 获取所有磁盘的/dev节点(无论是否挂载) set allDiskOutput to do shell script "diskutil list | grep -E '^/dev/disk' | awk '{print $1}'" set allDevNodes to paragraphs of allDiskOutput repeat with devNode in allDevNodes -- 处理每个/dev节点,比如打印或存储 log "磁盘设备: " & devNode end repeat
diskutil list会输出包括未挂载分区在内的所有磁盘设备,我们用awk直接提取第一列的/dev路径,就能得到完整的设备节点列表。
3. 进阶:筛选未挂载的磁盘/dev节点
如果需要单独找出未挂载的设备,可以对比已挂载和全量设备列表:
-- 第一步:获取已挂载的/dev节点列表 set mountedDevs to {} set mountedOutput to do shell script "mount | grep -E '^/dev/disk' | awk '{print $1}'" repeat with dev in paragraphs of mountedOutput set end of mountedDevs to dev end repeat -- 第二步:获取所有磁盘的/dev节点列表 set allDevs to {} set allOutput to do shell script "diskutil list | grep -E '^/dev/disk' | awk '{print $1}'" repeat with dev in paragraphs of allOutput set end of allDevs to dev end repeat -- 第三步:找出未挂载的节点 set unmountedDevs to {} repeat with dev in allDevs if dev is not in mountedDevs then set end of unmountedDevs to dev end if end repeat -- 输出结果 display dialog "未挂载的磁盘/dev节点:" & return & (joinList(unmountedDevs, return)) -- 辅助函数:将列表转为字符串 on joinList(lst, delimiter) set AppleScript's text item delimiters to delimiter set resultStr to lst as string set AppleScript's text item delimiters to "" return resultStr end joinList
关键说明
- System Events看不到/dev是因为它只暴露用户可见的文件系统,而/dev属于Unix系统级目录,不在用户空间的文件树里。
- 借助
mount和diskutil这两个原生shell工具,我们能直接获取底层设备信息,再用AppleScript做解析和二次处理,完美替代mount命令的功能。
内容的提问来源于stack exchange,提问作者BUKTOP
相关产品推荐
相关产品推荐

