系统学习 macOS 学习路径:从 BSD 文件命令到系统、网络与开发维护

ln

创建硬链接或符号链接,用多个路径指向同一份内容。

补充说明

默认 ln 源 目标 创建硬链接:两个名字指向同一 inode,权限、扩展属性和内容完全共享,删除其中一个名字不会影响另一个。硬链接不能跨文件系统,也不能指向目录(Time Machine 的内部目录链接是特例,普通用户不能创建)。ln -s 源 目标 创建符号链接,链接里保存的是路径字符串,可以跨卷、可以指向尚不存在的目标。

BSD 与 GNU 的差异:macOS 的 ln 支持 -h/-n(目标是符号链接时不跟进去)、-w(源不存在时警告)、-F(目标是目录时先移除);GNU 的 -r(生成相对链接)和 -t(指定目标目录)在 macOS 上不可用。GNU 习惯写 ln -sfn,macOS 对应 ln -shf 或 ln -sfh。

参数顺序是 ln -s 源 目标,与 cp 相反,写反会得到一个指向错误位置的链接。目标已存在且是目录时,链接会被创建在目录里面,文件名取源的 basename;要替换目录本身或替换指向目录的链接,必须加 -h/-n。

常用示例

# 把 Homebrew 安装的命令链接到 ~/bin,注意源在前、链接在后
% ln -s /opt/homebrew/bin/rg ~/bin/rg

# 替换已存在的符号链接而不是把新链接放进目标目录
% ln -sfn ~/dotfiles/zshrc ~/.zshrc

# 硬链接同一卷上的大文件,两个名字共享内容
% ln ~/data/archive.bin ~/Backup/archive.bin
% ls -li ~/data/archive.bin ~/Backup/archive.bin

# 创建相对符号链接,移动整个 dotfiles 目录后仍然有效
% ln -s ../dotfiles/gitconfig ~/.gitconfig

# 目标还不存在时也允许创建,但用 -w 提醒这是悬空链接
% ln -sw ~/missing/file ~/Desktop/shortcut

# 查看链接指向和 inode
% ls -l ~/.zshrc && readlink ~/.zshrc

易错点与排错

相关命令

参考链接

读完自测

合上页面,先回答,再展开对照。

  1. 硬链接和符号链接在跨卷、指向目录、共享 inode 三方面有何区别?
  2. ln -sf new ~/config-link 在 config-link 指向目录时可能发生什么?
  3. 为什么替换普通文件前要特别小心 ln -sf?
答案
  1. 硬链接不能跨卷、不能指目录、共享同一 inode;符号链接可跨卷、可指目录、保存路径字符串。
  2. 不加 -h/-n 时可能把链接建进目标目录,而不是替换链接;应使用 ln -sfn。
  3. -f 会先 unlink 原有普通文件,文件内容会直接丢失且无法恢复。
微信小程序码:扫码打开命令速查小程序

小程序版

微信扫码,随时查命令