关注

Linux/Unix 系统中用于创建链接的命令ln

ln 是 Linux/Unix 系统中用于创建链接的命令。链接可以理解为文件的“快捷方式”或“别名”,但比 Windows 的快捷方式更强大。

📝 核心概念:硬链接 vs 软链接

ln 可以创建两种完全不同的链接:

特性硬链接软链接(符号链接)
创建方式ln 源文件 链接名ln -s 源文件 链接名
本质同一个文件的多个名字指向源文件的特殊文件(存路径)
跨文件系统❌ 不可以✅ 可以
链接目录❌ 不可以(防止循环)✅ 可以
源文件删除后链接依然可用链接变成红色闪烁的断链
inode与源文件相同的 inode不同的 inode
文件大小不额外占用空间占用很小空间(存路径字符串)

🔍 简单理解

  • 硬链接:同一个文件实体,有两个门牌号(文件名)

  • 软链接:一个独立的文件,里面写着"我是谁谁谁的快捷方式"

💡 常用命令格式

bash

# 基本语法
ln [选项] 源文件 目标链接名

# 创建硬链接
ln file1.txt file1_hard.link

# 创建软链接(最常用)
ln -s file1.txt file1_soft.link

# 创建目录的软链接
ln -s /path/to/original/dir dir_link

# 强制覆盖已存在的链接
ln -sf 新源文件 已存在的链接名

# 创建软链接时使用绝对路径(避免移动后失效)
ln -s /绝对/路径/源文件 链接名

📊 对比示例:硬链接

bash

# 创建一个文件
echo "Hello" > original.txt

# 创建硬链接
ln original.txt hard.txt

# 查看详细信息(注意 inode 号相同)
ls -li original.txt hard.txt
# 输出示例:
# 1234567 -rw-r--r-- 2 user user 6  Apr 29 10:00 original.txt
# 1234567 -rw-r--r-- 2 user user 6  Apr 29 10:00 hard.txt
#         ^ 相同的 inode      ^ 链接数变成了2

# 修改任意一个,另一个也会变
echo "World" >> hard.txt
cat original.txt   # 输出: Hello World

# 删除源文件,硬链接还在且内容完整
rm original.txt
cat hard.txt       # 输出: Hello World (仍然正常)

🔗 重点:软链接(符号链接)

这是你在实际工作中最常用的,相当于"快捷方式"。

bash

# 创建软链接
ln -s /usr/bin/python3 python3.link

# 查看(注意颜色和箭头)
ls -l python3.link
# 输出:lrwxrwxrwx 1 user user 18 Apr 29 10:00 python3.link -> /usr/bin/python3
#       ^ 类型是 l (link)                    ^ 箭头指向源文件

# 目录的软链接
ln -s /var/log logs_link
cd logs_link     # 直接进入源目录

⚠️ 软链接的陷阱

bash

# 坑1:相对路径的问题
cd /tmp
ln -s /home/user/data data_link   # ✅ 绝对路径,安全
ln -s ../home/user/data data_link2 # ❌ 相对路径,移动后就失效

# 坑2:删除源文件后,链接变成"断链"
rm -rf /home/user/data
ls -l data_link
# 输出:lrwxrwxrwx 1 user user 18 Apr 29 10:00 data_link -> /home/user/data (红色闪烁或显示文件不存在)

# 坑3:对软链接执行 rm 需要小心
rm dir_link/        # ❌ 这会删除目录内容!不是删除链接本身
rm dir_link         # ✅ 删除链接文件本身(不加斜杠)
unlink dir_link     # ✅ 专门删除链接的命令

🎯 实际应用场景

1. 版本管理(最常见)

bash

# 维护多个版本,用软链接指代"当前版本"
ls -l
# lrwxrwxrwx 1 root root 12 Apr 29 10:00 current -> python3.8
# -rwxr-xr-x 1 root root 5000 Apr 29 09:00 python3.6
# -rwxr-xr-x 1 root root 5200 Apr 29 09:00 python3.8
# -rwxr-xr-x 1 root root 5500 Apr 29 09:00 python3.9

# 切换版本只需修改链接
ln -sf python3.9 current   # 快速切换到 3.9

2. 节省磁盘空间

bash

# 多个项目引用同一个大文件,但只占一份磁盘空间
mkdir project1 project2
echo "Big data" > data.bin
ln data.bin project1/data.bin   # 硬链接,不占额外空间
ln data.bin project2/data.bin

3. 路径简化

bash

# 把深层路径映射到方便的地方
ln -s /var/log/nginx/access.log ~/nginx.log
ln -s /mnt/huge_nas_drive/videos ~/videos

4. 备份时保留链接

bash

# 使用 cp -d 保留软链接属性
cp -rd /etc/ nginx_config_backup/

🔧 高级技巧

查看所有硬链接

bash

# 找到文件的 inode,然后查找所有指向它的文件
ls -i file.txt   # 假设 inode 是 123456
find . -inum 123456

查找损坏的软链接

bash

# 找出所有指向不存在目标的链接
find /path -type l ! -exec test -e {} \; -print

批量创建链接

bash

# 为某个目录下的所有 .conf 文件创建软链接
for file in /etc/nginx/conf.d/*.conf; do
    ln -s "$file" "./$(basename $file)"
done

📋 快速参考卡

需求命令
创建硬链接ln source linkname
创建软链接ln -s source linkname
强制覆盖已有链接ln -sf source linkname
查看链接信息ls -l linkname
删除链接rm linkname 或 unlink linkname
复制时保留链接cp -d source dest
查找某文件的硬链接find / -inum $(ls -i file | cut -d' ' -f1)

⚠️ 安全提示

  1. 不要对目录创建硬链接:系统不允许,因为可能造成循环引用

  2. 谨慎使用 rm -rf 处理软链接目录:不加 -f 会删除链接本身,加了可能删源目录

  3. 软链接的权限无关紧要:真正起作用的总是源文件的权限

  4. 跨文件系统时自动降级:如果无法创建硬链接,系统会报错,不会自动创建软链接

总结一句话:需要文件"快捷方式"并且可能跨磁盘或指向目录 → 用 ln -s(软链接);需要在同一磁盘上节省空间且永不担心源文件被删 → 用 ln(硬链接)。日常工作中 ln -s 覆盖 90% 的使用场景

转载自CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/ID501/article/details/160626528

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--