Jacky's blog
首页
  • Android
  • Web
  • Server
  • Python
  • iOS
  • Java
  • Vue
  • 计算机基础
  • 工具链
  • AI
  • 个人成长
  • 博客
  • 分类
  • 标签
  • 归档
收藏
GitHub (opens new window)

Jack Yang

编程; 随笔
首页
  • Android
  • Web
  • Server
  • Python
  • iOS
  • Java
  • Vue
  • 计算机基础
  • 工具链
  • AI
  • 个人成长
  • 博客
  • 分类
  • 标签
  • 归档
收藏
GitHub (opens new window)
  • 开发工具

  • 构建工具

  • 版本控制

  • 容器

  • 调试工具

  • 测试工具

  • CLI 工具

    • tmux
    • oh-my-zsh
    • ripgrep 高性能文本搜索工具使用指南
    • awk
    • sed
    • xargs
    • fzf
    • fd
    • raycast
    • VisiData 终极生存指南(vd)
    • yq
    • direnv
    • ln 软链接/硬链接使用指南
      • 📖 简介
      • 📝 语法
      • ⚡ 常用命令
        • 1. 创建软链接(最常用)
        • 2. 创建硬链接
        • 3. 覆盖已有链接
        • 4. 查看链接指向
        • 5. 删除链接
      • 💡 常用场景
        • 场景1:Git Worktree 复用 node_modules
        • 场景2:配置文件统一管理
        • 场景3:常用工具快捷方式
      • 🆚 软链接 vs 硬链接
      • 🆚 硬链接 vs Copy
      • ⚠️ 注意事项
        • 1. 相对路径 vs 绝对路径
        • 2. 相对路径的计算
        • 3. 检查链接是否有效
        • 4. 批量查找失效链接
    • watch
    • osascript
  • 网络工具

  • 编辑器

  • 设计工具

  • 多媒体

  • 包管理

  • 平台工具

  • tools
  • cli_tools
Jacky
2026-09-21
目录

ln 软链接/硬链接使用指南

# 📖 简介

ln 是 Linux/macOS 下的链接创建命令,分为:

  • 软链接(Symbolic Link):类似 Windows 的快捷方式,指向原文件路径
  • 硬链接(Hard Link):多个文件名指向同一个 inode

# 📝 语法

ln [选项] 源文件 目标文件
1

# ⚡ 常用命令

# 1. 创建软链接(最常用)

ln -s 源文件 目标链接
1

示例:把主项目的 node_modules 链接到 worktree

cd ../myproject-feature-branch
ln -s ../myproject/node_modules node_modules
1
2

# 2. 创建硬链接

ln 源文件 目标文件
1

# 3. 覆盖已有链接

ln -sf 源文件 目标链接
1
  • -f:强制覆盖已存在的目标文件

# 4. 查看链接指向

ls -l 目标链接
# 或
readlink 目标链接
1
2
3

# 5. 删除链接

rm 目标链接
# 或
unlink 目标链接
1
2
3

⚠️ 删除软链接不会删除原文件,放心删。

# 💡 常用场景

# 场景1:Git Worktree 复用 node_modules

# 创建 worktree 后,链接主项目的 node_modules
cd ../myproject-feature-branch
ln -s ../myproject/node_modules node_modules
1
2
3

优点:秒完成,不用重新 npm install 缺点:worktree 里改了 package.json 需要重新安装

# 场景2:配置文件统一管理

# 把配置文件统一放在 dotfiles 目录,软链接到 home
ln -s ~/dotfiles/.zshrc ~/.zshrc
ln -s ~/dotfiles/.tmux.conf ~/.tmux.conf
1
2
3

# 场景3:常用工具快捷方式

# 把常用脚本链接到 /usr/local/bin
ln -s ~/scripts/mytool.sh /usr/local/bin/mytool
1
2

# 🆚 软链接 vs 硬链接

特性 软链接(-s) 硬链接
是否可以跨文件系统 ✅ 可以 ❌ 不可以
是否可以链接目录 ✅ 可以 ❌ 不可以
删除原文件后 链接失效(悬空链接) 链接仍有效(数据仍在)
inode 新的 inode 和原文件相同 inode
适用场景 目录、跨分区、快捷方式 文件备份、节省空间

# 🆚 硬链接 vs Copy

一句话:硬链接是同一份数据多一个名字,Copy 是数据复制一份、从此互不相干。

特性 硬链接 Copy(cp)
inode 相同(指向同一份数据) 不同(数据完整复制一份)
磁盘占用 几乎为 0(只新增一条目录项) 数据占多少就翻多少
内容是否同步 ✅ 改一处处处可见(本质是同一个文件) ❌ 复制后各自独立、互不影响
删除原文件后 链接仍有效(引用计数 -1,数据不删) 不影响(本来就是两份)
元数据(权限/时间戳) 共享同一套 各自独立
适用场景 去重、增量备份(如 rsync --link-dest) 独立快照、真正的备份

验证:

echo "hello" > a.txt
ln a.txt b.txt     # 硬链接
cp a.txt c.txt     # 复制

ls -i a.txt b.txt c.txt
# a.txt、b.txt 的 inode 相同;c.txt 不同
# ls -l 第二列的数字 = 指向该 inode 的硬链接数

echo " world" >> b.txt
cat a.txt          # hello world —— 硬链接同步变化
cat c.txt          # hello —— 复制不受影响
1
2
3
4
5
6
7
8
9
10
11

💡 macOS 补充:APFS 上 cp -c 走 clonefile(写时复制),初始不占额外空间、修改后才真正复制——兼得 Copy 的独立性和硬链接的省空间。 ⚠️ 编辑器坑:vim/VS Code 保存时常是"写临时文件再替换",会把硬链接拆成两份。想保住硬链接关系:追加写入(echo >>)或 vim 设置 set backupcopy=yes 原地写入。

# ⚠️ 注意事项

# 1. 相对路径 vs 绝对路径

  • 用相对路径创建的软链接,移动目录后可能失效
  • 用绝对路径创建的软链接,移动源文件后失效

# 2. 相对路径的计算

  • 相对路径是相对于链接所在目录,不是当前目录

# 3. 检查链接是否有效

# 如果输出为空,说明链接有效
# 如果报错 "No such file or directory",说明链接失效
ls -l 目标链接
1
2
3

# 4. 批量查找失效链接

# 查找所有失效的软链接
find . -xtype l
1
2
#Shell#tool#cli#macos
上次更新: 2026/10/09, 15:51:11
direnv
watch

← direnv watch→

最近更新
01
GitHub CLI(gh)工作流与 CI 排查
10-08
02
Xcode 工程文件说明
09-28
03
osascript
09-23
更多文章>
Theme by Vdoing | Copyright © 2019-2026 Jacky | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式