Linux 软链接与硬链接一、先分清楚两种链接硬链接是同一个东西的不同名字软链接是贴在墙上的地址便条。软链接硬链接命令ln -s 目标 链接名ln 目标 链接名本质独立文件存目标路径字符串同一 inode 的另一个目录项跨文件系统✅❌链接目录✅❌删除原文件链接断裂不受影响日常首选← 90% 场景用它少用二、软链接2.1 创建ln -s 目标 链接名常用选项-f强制覆盖已有文件-n链接名本身是软链接且指向目录时替换链接而非跟进目录。行为取决于链接名当前状态链接名状态行为不存在创建链接名 → 目标已存在是目录进到目录里面创建目标末级名 → 目标已存在是文件报错File exists加-f覆盖# 状态1/home/user/link 不存在 $ ln -s /home/user/project /home/user/link # → /home/user/link - /home/user/project # 状态2/home/user/link 已存在是普通目录 $ ln -s /home/user/project /home/user/link # → /home/user/link/project - /home/user/project # 链接跑到目录里面了 # 状态3/home/user/link 已存在是文件 $ ln -s /home/user/project /home/user/link # ln: failed to create symbolic link /home/user/link: File exists $ ln -sf /home/user/project /home/user/link # -f 强制覆盖2.2 日常操作# 假定 /home/user/link - /home/user/project mv /home/user/link /home/user/newname # 改名条不影响目标 mv /home/user/project /home/user/other # 目标被移动 → 链接断裂ls 变红 echo hello /home/user/link/data.log # 通过链接读写 → 目标同步更新2.3 删除# 指向文件的软链接直接删 rm /home/user/link # 指向目录的软链接需要 -r rm -r /home/user/link陷阱rm -r /home/user/link/末尾带/会顺着链接删掉目标目录的内容。删链接本身不要带/。2.4 限制目标被移动或删除后链接断裂死链不会自动修复不支持 inotify 追踪目标变化三、硬链接3.1 创建ln 目标 链接名硬链接只能链接已存在的文件不能链接目录。$ echo 第一行 a.txt $ ln a.txt b.txt $ ln -f a.txt b.txt # -f 强制覆盖已有文件3.2 日常操作$ ls -li 1234 -rw-r--r-- 2 user group 13 ... a.txt # inode1234, 链接数2 1234 -rw-r--r-- 2 user group 13 ... b.txt # 同一个 inode $ echo 第二行 b.txt # 改 b.txt $ cat a.txt # a.txt 同步变化 第一行 第二行 $ mv a.txt c.txt # 改名不影响仍是同一个 inode3.3 删除$ rm a.txt # 链接数 2 → 1 $ cat b.txt # b.txt 不受影响 第一行 第二行 $ rm b.txt # 链接数 → 0数据释放3.4 限制不能跨文件系统不同分区/磁盘不能链接目录Linux 禁止防止环路目标必须已存在3.5 硬链接 vs 复制复制cp硬链接ln数据实体两份独立同一份改一个影响另一个不影响互相影响磁盘占用翻倍几乎不额外占空间四、WSL 场景速查场景做法原因WSL 访问 Windows 文件夹ln -s /mnt/c/目标 ~/链接软链接即可两边同步频繁读写小文件放 WSL 原生~/不要放/mnt/c/跨 FS 性能差9p 协议Windows 访问 WSL 文件资源管理器 →\\wsl$\发行版不需要链接五、速查卡我想……命令创建软链接ln -s /path/to/target linkname强制覆盖已有链接ln -sf /path/to/target linkname替换指向目录的软链接本身ln -snf /path/to/target linkname删除软链接文件rm linkname删除软链接目录rm -r linkname不要末尾加/创建硬链接ln existing_file new_name查看链接数及 inodels -li