readlink -f 是获取软链接最终绝对路径最可靠的方式,自动解析多层跳转并验证存在性;不加 -f 仅输出原始字符串,不可直接用作路径;硬链接不适用 readlink 或 ls -l 的箭头语法。

直接用 readlink -f 获取最终绝对路径
这是最可靠的方式:它会自动解析所有中间跳转(比如 A → B → C),并返回真实存在的、完整的绝对路径。不加 -f 时,readlink 只输出链接文件里存的原始字符串,可能是相对路径、空路径,甚至根本不存在的路径,容易误判。
-
readlink -f /etc/nginx/conf.d/default.conf→ 输出类似/usr/share/nginx/html/index.html - 目标文件被删了?
readlink -f会返回空,而不是报错——这点比ls -l更安静、更适合脚本判断 - 如果只想看原始存储值(不解析跳转),用
readlink不带参数;但日常排查几乎没这个需求
ls -l 快速浏览,但别信最后一列直接当路径用
ls -l 输出里的 -> 右边确实是目标路径,但它不验证是否存在,也不做路径补全。尤其当链接里写的是相对路径(比如 ../lib/foo.so),你得手动拼接当前目录才能知道它实际指向哪。
-
ls -l /opt/myapp/bin/start.sh可能输出:lrwxrwxrwx 1 root root 12 Jun 10 14:22 start.sh -> ../lib/run.sh - 这个
../lib/run.sh是相对于/opt/myapp/bin/的,不是相对于当前 shell 路径 - 想快速提取箭头后内容?
ls -l path | awk '{print $NF}'可以,但结果仍需人工确认上下文
批量查整个目录下所有软链接的目标
用 find 配合 -exec readlink -f 最省心,尤其当你不确定软链接在哪一层目录时。
-
find /etc -type l -exec readlink -f {} \;:每行输出一个最终目标路径 - 如果某些链接目标已失效,加
2>/dev/null避免中断:find /var -type l -exec readlink -f {} \; 2>/dev/null - GNU find 支持更高效的内建格式:
find /usr -type l -printf "%p → %l\n",但%l不解析多层跳转,只显示原始目标
注意硬链接根本不能用这些命令查目标
readlink 和 ls -l 中的 -> 对硬链接完全无效。硬链接和原文件共享同一个 inode,没有“指向”关系。想确认是不是硬链接,看 ls -li 输出第二列数字(硬链接数),或用 find -inum 查所有同 inode 文件。
真正容易被忽略的点是:软链接可以跨文件系统、指向不存在的路径;硬链接不行,且删除原文件不影响硬链接访问——但这两类链接在查看方式上必须严格区分,混用命令只会得到空结果或报错。











