需结合系统报告、终端命令、homebrew/mas工具、手动筛查及info.plist解析五种方法全面获取mac软件清单:一用系统报告导出gui应用;二用mdfind等命令扫描.app路径与元数据;三用brew list --cask和mas list补全第三方安装;四人工核查非标路径应用并记录来源;五用python解析info.plist提取精确版本信息。

如果您需要全面掌握 Mac 上所有安装过的软件,尤其是为迁移、审计或排查目的生成可复用的清单,则需结合系统原生工具与命令行能力,覆盖 App Store、Homebrew、手动拖拽安装等多种来源。以下是具体操作方法:
一、通过系统报告获取图形化应用全量视图
系统报告由 macOS 内置提供,能识别并结构化展示所有被系统索引的应用程序,包含名称、版本、获得方式(如 App Store、开发者签名、未知来源)及最近使用时间,无需命令行基础即可完成导出。
1、点击屏幕左上角的苹果菜单,选择“关于本机”。
2、在弹出窗口中点击“系统报告”按钮。
3、左侧边栏依次展开“软件”→“应用程序”,右侧即显示所有已识别的应用程序条目。
4、将鼠标移至列表任意位置,按 Command+A 全选,再按 Command+C 复制。
5、粘贴至文本编辑器或表格软件中,即可保存为可读性高的应用清单。
二、使用终端命令扫描全系统 .app 包并导出路径与元数据
终端命令可绕过 Spotlight 索引限制,直接遍历文件系统,精准定位所有以 .app 结尾的包体,并提取其路径、显示名称与版本号,适用于自动化处理或需保留原始安装路径的场景。
1、打开“启动台”,进入“其他”文件夹,点击“终端”启动命令行工具。
2、执行以下命令列出系统级应用程序目录内容:ls /Applications。
3、执行以下命令列出当前用户专属应用程序目录内容:ls ~/Applications。
4、运行全系统深度检索命令,返回含路径、版本与类型信息的结果:mdfind "kMDItemKind == 'Application'" | xargs -I {} mdls -name kMDItemDisplayName -name kMDItemVersion -name kMDItemPath {} 2>/dev/null。
5、如需仅导出纯名称列表并保存为桌面文件,执行:mdfind "kMDItemKind == 'Application'" | sed 's/\.app.*$/.app/' | sort -u > ~/Desktop/app_list.txt。
三、调用 Homebrew Cask 与 App Store 工具补全第三方安装记录
Homebrew Cask 和 App Store 安装的应用可能未被系统报告完整收录,尤其当应用未注册为常规 GUI 应用时,需分别调用对应管理工具提取其安装日志,确保清单无遗漏。
1、若已安装 Homebrew,运行命令查看所有通过 Cask 安装的图形应用:brew list --cask。
2、安装并配置 mas 工具:先执行 brew install mas,再运行 mas signin your@apple.com 登录 Apple ID,最后导出 App Store 应用列表:mas list > ~/Desktop/appstore_apps.txt。
3、如需一键生成可重装脚本,执行:brew bundle dump --file ~/Desktop/Brewfile,该文件可在新机直接执行 brew bundle install --file Brewfile 恢复全部 brew 及 cask 应用。
四、筛查手动安装(拖拽/Dmg/Pkg)应用并记录来源
手动安装类应用不会被任何包管理器追踪,需主动检查非标准路径与命名特征,辅以人工核对,避免遗漏关键生产力工具或商业软件。
1、检查 /Applications 目录下非 Apple 自带、且不在 App Store 或 Brewfile 中的应用,例如 Notion、Obsidian、Typora 等。
2、使用终端快速初筛可能的手动安装项:ls /Applications | grep -E "(Alpha|Beta|Preview|Edition|Pro)$|^[A-Z]" | grep -v "Xcode\|Utilities\|Pages\|Numbers"。
3、对每个确认项,记下官网下载地址或安装包来源,例如:Notion → notion.so/desktop,方便后续直链复现安装过程。
五、提取 .app 包内 Info.plist 获取精确版本与构建信息
部分应用在系统报告或 mdfind 中无法正确显示版本号,此时需直接读取其内部 Info.plist 文件,该文件包含 CFBundleShortVersionString 与 CFBundleVersion 等权威元数据,确保导出信息准确可靠。
1、打开终端,执行 Python 脚本批量解析:python3 -c "import plistlib, os; [print(f'{os.path.basename(app)}: {plistlib.load(open(os.path.join(app, \"Contents/Info.plist\"), \"rb\"))[\"CFBundleShortVersionString\"]}') for app in [os.path.join('/Applications', x) for x in os.listdir('/Applications') if x.endswith('.app') and os.path.exists(os.path.join('/Applications', x, 'Contents/Info.plist'))]]"。
2、如需导出为 CSV 文件,运行完整脚本:python3 -c "import os, plistlib, csv, datetime; path='/Applications'; files=[f for f in os.listdir(path) if f.endswith('.app')]; with open('~/Desktop/app_full_info.csv', 'w', newline='') as f: w=csv.writer(f); w.writerow(['Name','Version','Build','Date']); [w.writerow([f, plistlib.load(open(os.path.join(path,f,'Contents/Info.plist'),'rb')).get('CFBundleShortVersionString','N/A'), plistlib.load(open(os.path.join(path,f,'Contents/Info.plist'),'rb')).get('CFBundleVersion','N/A'), datetime.datetime.fromtimestamp(os.path.getctime(os.path.join(path,f))).strftime('%Y-%m-%d')]) for f in files if os.path.exists(os.path.join(path,f,'Contents/Info.plist'))]"。











