将 Mac 软件优雅的转移到移动硬盘里

2 天前
 wangheng486

📦 AppPorts

https://github.com/wzh4869/AppPorts 外置硬盘拯救世界!/ External drives save the world!

一款专为 macOS 设计的应用程序迁移与链接工具。
轻松将庞大的应用程序迁移至外部存储,同时保持系统无感运行。

✨ 简介

Mac 的内置存储空间寸土寸金。AppPorts 允许您一键将 /Applications 目录下的应用程序迁移到外部移动硬盘、SD 卡或 NAS ,并在原位置保留应用入口,让系统误以为应用仍在本地。

对 macOS 系统而言,应用依然“存在”于本地,您可以像往常一样启动它们,但实际占用的却是廉价的外部存储空间。

🚀 核心功能

🏆 为什么选择 AppPorts ?

相较于市面上其他方案,AppPorts 采用了独特的 Contents 链接 技术,兼顾了美观、兼容性与系统整洁度。

方案 AppPorts 传统软链
Finder 图标 原生 (无箭头) ❌ 有箭头 (快捷方式)
Launchpad 完美索引 ⚠️ 经常失效
App 菜单 (macOS 26) 完美支持 ❌ 不支持
文件系统整洁度 极佳 (仅 1 个链接) ✅ 极佳 (仅 1 个链接)
维护与还原 毫秒级 ✅ 毫秒级

📸 截图

欢迎页 主界面
深色模式 语言切换

🛠️ 安装与运行

系统要求

下载安装

请前往 Releases 页面下载最新版本的 AppPorts.dmg

⚠️ “AppPorts”已损坏,无法打开

如果打开应用时遇到此提示(且系统建议移到废纸篓),这是因为应用没有进行开发者签名,被 macOS 的 Gatekeeper 机制拦截。 (注意:以下命令假设您已将 AppPorts 拖入 应用程序 文件夹) 您需要在终端运行以下命令来移除隔离属性,即可正常打开:

xattr -rd com.apple.quarantine /Applications/AppPorts.app

⚠️ 权限说明

首次运行时,AppPorts 需要 “完全磁盘访问权限” 才能读写 /Applications 目录。

  1. 打开 系统设置 -> 隐私与安全性
  2. 选择 完全磁盘访问权限
  3. 点击 + 号,添加 AppPorts 并开启开关。
  4. 重启 AppPorts 。
1224 次点击
所在节点    macOS
24 条回复
byby
2 天前
既然这么好,为啥才 9 个 star
wangheng486
2 天前
@byby 我也不知道哈哈哈,可能是之前没在别的地方发,我觉得还挺好用的
BernieDu
2 天前
是在 application 创建一个空的 app 文件夹,文件夹内的内容是软连接到移动硬盘的 app 吧。这样的话拔掉移动硬盘会留下一堆无效内容,还不如直接在移动硬盘的 application 文件夹直接打开 app 啊
xy19009188
1 天前
可以提个建议吗,app 除了按照首字母,还可以按照 app 大小进行排序
tamarix666
1 天前
正好有这个需求,多谢 OP 。有个小问题:如果移动硬盘意外掉线,有没有修复机制呢?
wangheng486
1 天前
@BernieDu 软件内可以直接删除“空的 app 文件夹”,这个软件起初就是为了“软连接”管理麻烦的问题,时间长了忘记哪个软件是在外置存储,做空的文件夹目的是为了 mac26 之前版本启动台软连接会出现不好看的快捷方式角标问题。
wangheng486
1 天前
@xy19009188 感谢,我这边后期会试着加这个功能
wangheng486
1 天前
@tamarix666 没有,这样比较复杂,暂时没有考虑这个问题。这个可以简单理解为一个“软连接”管理应用,只不过软连接实现比较像“软件真的就在内置存储一样”
iamzuoxinyu
1 天前
支持 Playcover 的 ios 应用/游戏么,貌似有的游戏类的应用会检测 container 里的软链接。
wangheng486
1 天前
@iamzuoxinyu 还真没试过 Playcover ...
unneeded
1 天前
原来还有映射 contents 这个方法,我之前映射.app ,经常在搜索框里搜到两个应用
回头试试看,感谢分享
wangheng486
1 天前
@xy19009188 已添加该功能
wangheng486
1 天前
@unneeded 其实映射 contents 也会这样,软件目的就是不让旧版本的 macos 启动台出现软连接角标
unneeded
1 天前
@wangheng486 #13
那我感觉可以优化一下,把目标文件夹中的".app"去掉,这样搜索框就不会搜到两个应用了
unneeded
1 天前
@unneeded #14
甚至可以换成.framework 这种,这样还可以避免搜到内部的可执行文件
unneeded
1 天前
@unneeded #14 不过想了想似乎可以直接把目标目录加到排除列表里😂
wangheng486
1 天前
@unneeded 感谢,我想想怎么弄🙏
xy19009188
1 天前
@wangheng486 老哥是真速度,这下我的小 256 有救了
xy19009188
1 天前
发现没有 adobe 家的应用
runking
1 天前
我之前让 AI 写的这个


#!/bin/bash
# =============================================================================
# 一键恢复脚本 - SSD 数据软链接设置
# One-Click Restore Script for SSD Data Symlinks
# =============================================================================
# 使用方法 / Usage:
# chmod +x /Volumes/SSD/AppData/restore_symlinks.sh
# /Volumes/SSD/AppData/restore_symlinks.sh
# =============================================================================

set -e

RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

SSD_PATH="/Volumes/SSD/AppData"

echo -e "${BLUE}========================================${NC}"
echo -e "${BLUE} SSD 数据软链接恢复脚本${NC}"
echo -e "${BLUE} 版本: 1.0 | 日期: 2026-01-05${NC}"
echo -e "${BLUE}========================================${NC}"
echo ""

if [ ! -d "$SSD_PATH" ]; then
echo -e "${RED}错误: SSD 未挂载: $SSD_PATH${NC}"
exit 1
fi

echo -e "${GREEN}✓ SSD 已检测到${NC}"
echo ""

create_symlink() {
local source="$1"
local target="$2"
local name="$3"

if [ ! -e "$source" ]; then
echo -e "${YELLOW}⚠ 跳过 $name: 数据不存在${NC}"
return
fi

if [ -e "$target" ] && [ ! -L "$target" ]; then
echo -e "${YELLOW}⚠ $name: 目标已存在,跳过${NC}"
return
fi

[ -L "$target" ] && rm "$target"
mkdir -p "$(dirname "$target")"
ln -s "$source" "$target"
echo -e "${GREEN}✓ $name${NC}"
}

echo -e "${BLUE}[1/6] Gemini${NC}"
create_symlink "$SSD_PATH/Gemini/antigravity" "$HOME/.gemini/antigravity" "Gemini Playground"
create_symlink "$SSD_PATH/Gemini/antigravity-browser-profile" "$HOME/.gemini/antigravity-browser-profile" "Browser Profile"

echo -e "${BLUE}[2/6] Microsoft Edge${NC}"
create_symlink "$SSD_PATH/MicrosoftEdge/Microsoft Edge" "$HOME/Library/Caches/Microsoft Edge" "Edge Cache"

echo -e "${BLUE}[3/6] Xcode${NC}"
mkdir -p "$HOME/Library/Developer/Xcode"
create_symlink "$SSD_PATH/Xcode/DerivedData" "$HOME/Library/Developer/Xcode/DerivedData" "DerivedData"

echo -e "${BLUE}[4/6] Quark${NC}"
create_symlink "$SSD_PATH/Quark/Data" "$HOME/Library/Application Support/Quark" "Quark"

echo -e "${BLUE}[5/6] PixPin${NC}"
create_symlink "$SSD_PATH/PixPin/Data" "$HOME/Library/Application Support/PixPin" "PixPin"

# New additions based on the provided instruction
echo -e "${BLUE}[6/6] Google${NC}"
create_symlink "$SSD_PATH/Google/Data" "$HOME/Library/Application Support/Google" "Google Data"

echo -e "${BLUE}[7/6] Microsoft Edge App Support${NC}"
create_symlink "$SSD_PATH/MicrosoftEdge/AppSupport/Data" "$HOME/Library/Application Support/Microsoft Edge" "Edge App Support Data"

echo -e "${BLUE}[8/6] Apple Wallpaper${NC}"
create_symlink "$SSD_PATH/AppleWallpaper/Data" "$HOME/Library/Application Support/com.apple.wallpaper" "Apple Wallpaper Data"

echo -e "${BLUE}[9/6] UE DDC 环境变量${NC}"
ZSHRC="$HOME/.zshrc"
if grep -q "UE_LocalDataCachePath" "$ZSHRC" 2>/dev/null; then
echo -e "${GREEN}✓ 环境变量已存在${NC}"
else
echo "" >> "$ZSHRC"
echo "# Unreal Engine DDC" >> "$ZSHRC"
echo "export UE_LocalDataCachePath=\"$SSD_PATH/UnrealEngine/DDC\"" >> "$ZSHRC"
echo "export UE_SharedDataCachePath=\"$SSD_PATH/UnrealEngine/DDC\"" >> "$ZSHRC"
echo -e "${GREEN}✓ 环境变量已添加${NC}"
fi

echo ""
echo -e "${GREEN}✅ 恢复完成! 请运行: source ~/.zshrc${NC}"

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1188205

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX