使用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脚本执行此操作的最简单方法是什么?
答案 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
表示您使用新的所需目标重新创建。