You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:38:44