如何获得链接目标的完整路径


13

如果我使用/var/opt/foo创建了符号链接ln -fs /path/to/target/dir foo。如何在仅看到链接的脚本中获取/path/to/target/dir

我要在脚本中实现的目标是rm -rf /path/to/target/dir在实现之前ln -fs /path/to/another/dir foo

Answers:


30
link=/var/opt/foo

target=$(readlink "$link")

$target 现在是链接的目标,与存储在文件系统中的链接完全相同。

但是,符号链接可以是相对的,因此对于正常使用来说会更好:

target=$(readlink -f "$link")

请注意,这是readlink来自GNU Coreutils的,在BSD和其他系统中可能不存在。

编辑: readlink -f只要链接目标存在,就可以在BSD上使用。realpath是另一种仅以BSD运行的工具,其工作方式类似。


1
readlink()自4.2BSD以来,BSD就有了系统调用。当前的BSD readlink 实用程序随FreeBSD 4.10一起发布。它被(重新)实现为stat命令的硬链接(MacOS X手册页 FreeBSD 9手册页)。请注意,它没有-m选项。
JdeBP 2011年

@JdeBP:谢谢。它确实具有-f,并且readlink -f效果也一样(假设链接目标存在)。在BSD中,realpath似乎是的另一种选择readlink -m
2011年

0

一种方法是(我希望有一个更好的版本)

olddir=$(pwd)
cd /var/opt/foo
deleteme=$(pwd)
cd $olddir
rm -rf "$olddir"

4
readlink是你的朋友。
JdeBP 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.