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 linknameunlink linkname
复制时保留链接 cp -d source dest
查找某文件的硬链接 `find / -inum $(ls -i file

⚠️ 安全提示

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

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

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

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

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

相关推荐
勤劳的进取家1 小时前
传输层基础
运维·开发语言·学习·php
IDO读书1 小时前
CentOS 7 安装 xampp-linux-1.8.1.tar.gz 详细步骤(解压、启动、验证)
linux
wuminyu1 小时前
专家视角看Lambda表达式的原理解析
java·linux·c语言·jvm·c++
搬码后生仔1 小时前
【navicat不安装sql server直接远程连接服务器数据库】
运维·服务器·数据库
tingting01191 小时前
dns域名信息收集
linux·服务器·前端
JiaWen技术圈2 小时前
nf_tables 架构深度详解(内核级完整架构)
linux·服务器·安全·运维开发
007张三丰2 小时前
系统架构设计师范文5:论负载均衡设计
运维·系统架构·负载均衡·软考·软考高级论文
志栋智能2 小时前
跨越人机边界:超自动化巡检如何重塑工作流程?
运维·网络·人工智能·安全·自动化
XX風2 小时前
三维点云处理环境相关-ubuntu安装numpy、open3d
linux·ubuntu·numpy