ln是Linux/Unix系统中用于创建链接(link)的命令,它支持两种类型的链接:硬链接(hard link)和符号链接(symbolic link,也称软链接)。链接是Linux文件系统的重要特性,它允许一个文件拥有多个名称,或者在文件系统中创建指向其他文件/目录的引用。
硬链接本质上是同一文件数据的多个目录项,共享相同的inode,删除一个硬链接不影响其他硬链接;符号链接则是一个指向目标路径的特殊文件,类似于Windows的快捷方式。掌握ln是理解Linux文件系统结构和进行文件组织管理的重要技能。
1. 基本语法
| 命令 | 说明 |
|---|
ln TARGET LINK_NAME | |
ln -s TARGET LINK_NAME | |
ln -sf TARGET LINK_NAME | |
ln TARGET... DIRECTORY | |
ln -s TARGET... DIRECTORY | |
2. 符号链接
符号链接是一个指向目标路径的特殊文件,可以跨文件系统,可以指向目录。
| 命令 | 说明 |
|---|
ln -s /etc/nginx/sites-available/app /etc/nginx/sites-enabled/app | |
ln -s /usr/bin/python3 /usr/local/bin/python | |
ln -s /opt/myapp /usr/local/bin/myapp | |
ln -s /path/to/target . | |
ln -sf /new/target existing_link | |
ln -sr /path/to/target linkname | |
3. 硬链接
硬链接是同一文件数据的额外目录项,共享inode。它们不能跨文件系统,不能链接到目录(普通用户权限下)。
| 命令 | 说明 |
|---|
ln source.txt hardlink.txt | |
ln file1.txt file2.txt /backup/ | |
ln -v source.txt link.txt | |
ln -f existing.txt newlink.txt | |
硬链接特点:
4. 链接选项
5. 查看与验证链接
| 命令 | 说明 |
|---|
ls -l linkname | |
ls -la /path/ | |
readlink linkname | |
readlink -f linkname | |
stat linkname | |
file linkname | |
find . -type l | |
find . -xtype l | |
find . -type l -exec test ! -e {} \; -print | |
6. 实用组合模式
| 命令 | 说明 |
|---|
ln -sf $(which python3) /usr/local/bin/python | |
for f in *.txt; do ln "$f" "${f%.txt}_link.txt"; done | |
ln -rs /usr/share/doc /home/user/docs | |
cp -s /path/to/target/* . | |
find . -type l -exec readlink -f {} \; | |
ln -sfT /new/target linkname | 创建链接,将target视为普通文件(避免目录相关警告) |
ln -b -sT /new/target linkname | |
7. 硬链接 vs 符号链接对比
| 特性 | 硬链接 | 符号链接 |
|---|
| 本质 | | |
| inode | | |
| 跨文件系统 | | |
| 链接目录 | | |
| 原文件删除后 | | |
| 体积 | | |
| 磁盘空间显示 | | |
| 查看命令 | ls -i | readlink |
| 典型用例 | | |
8. 常用选项速查
| 选项 | 完整名称 | 说明 |
|---|
-s | | |
-f | | |
-b | | |
-i | | |
-n | | |
-v | | |
-r | | |
-T | | |
-t | | |
-S | | |
9. 故障排查
| 问题 | 解决方法 |
|---|
| ln: failed to create hard link: File exists | 目标文件已存在,使用-f强制覆盖;或先删除目标文件 |
| Too many levels of symbolic links | 存在循环符号链接,使用readlink -f跟踪完整路径检查 |
| Invalid cross-device link | |
| Broken symlink (dangling) | |
| Symlink points to wrong target | 使用readlink确认当前目标,然后用ln -sf修正 |
| ls -l显示链接指向路径不正确 | 检查是否使用了相对路径;考虑使用ln -sr创建相对链接 |
| 误用ln创建了硬链接到目录 | 删除硬链接;目录硬链接通常不允许,但在某些系统可能被创建 |
| 备份文件意外生成 | 使用-b时会产生备份文件,用--backup=numbered管理编号备份 |
温馨提示: ln是理解Linux文件系统的重要工具。建议掌握以下技巧:1)用符号链接管理软件的多个版本(如ln -sf python3.11 /usr/local/bin/python);2)用硬链接创建节省空间的备份(数据不复制);3)使用readlink -f获取链接的绝对路径;4)脚本中创建链接前先用-f确保覆盖;5)ln -sr创建相对路径链接,便于移动整个目录结构;6)使用find . -xtype l定期检查断开的链接。注意:git存储库不会跟踪符号链接的内容,只存储目标路径字符串。打包存档时,tar默认保留符号链接结构,而cp需要-d或-a选项保留符号链接。