如何使用bash确定链接指向哪个目录

时间:2010-08-26 17:16:24

标签: bash shell symlink

使用Bash脚本,有没有办法确定链接指向哪个目录,然后根据结果将其切换到另一个目录?

例如,假设我有以下两个目录:

/var/data/1//var/data/2/

我有一个链接指向其中一个,例如data_link,目前它与/var/data/1/

相关联

当脚本被触发时,我希望它将链接交换为/var/data/2/(即ln -s /var/data/2/ /somepath/data_link)。

当再次触发脚本时,会发生相反的情况(即ln -s /var/data/1/ /somepath/data_link),依此类推。通过Bash脚本执行此操作的最简单方法是什么?

2 个答案:

答案 0 :(得分:4)

不幸的是,标准的unix实用程序集不包含对readlink系统调用的轻松访问。某些系统包含readlink命令。如果它可用,则readlink foo很可能打印符号链接foo的目标。如果您觉得有诱惑使用选项,请注意此命令的多个版本会浮动;即使在Linux发行版之间也不会获得可移植性。

如果您有可用的perl,perl -e 'print readlink $ARGV[0]' mylink会打印mylink的目标。

如果你需要一种可移植的方式并且没有Perl或其他任何理智,你可以解析ls -l mylink的输出。

如果您有一个指向您有权更改的目录的符号链接,那么$(cd mylink && command -p pwd)是该链接最终目标的绝对路径。例如,如果foo/var/tmp/bar的符号链接,则bar/var/tmp中的目录,/var/tmp/tmp的符号链接,此命令产生/tmp/bar

答案 1 :(得分:1)

使用readlink命令获取链接的内容:

$TARGET=$(readlink "$LINK")

然后使用标准if检查当前值,rm将其删除,并使用ln表示您使用新的所需目标重新创建。