创建硬链接或符号链接,用多个路径指向同一份内容。
默认 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
ln -sf 会先 unlink 目标再建链接。如果目标原本是普通文件而不是链接,文件内容会直接消失;替换前先 ls -l 确认。-h/-n 会把新链接建到该目录里。用 ln -sfn,事后 ls -ld 核对。Cross-device link,指向目录会报 Operation not permitted;这不是权限问题,改用符号链接。chmod 会影响所有名字。要独立控制权限就复制文件。readlink 和 ls -l 验证。sudo ln -s 到 /System 或 /usr(/usr/local 除外)会失败;把自定义命令放到 ~/bin 或 /usr/local/bin。ls — 用 -li 查看 inode 和链接指向。cp — 需要独立副本而不是链接时使用。mv — 移动链接本身而不是目标。ln — GNU 版对照,注意 -r/-t。mklink — Windows 的链接命令。合上页面,先回答,再展开对照。
ln -sf new ~/config-link 在 config-link 指向目录时可能发生什么?ln -sf?-h/-n 时可能把链接建进目标目录,而不是替换链接;应使用 ln -sfn。-f 会先 unlink 原有普通文件,文件内容会直接丢失且无法恢复。
小程序版
微信扫码,随时查命令