在不解析符号链接的情况下获取完整路径?

时间:2017-01-27 19:47:10

标签: bash

如何在不将其解析为原始文件路径的情况下获取符号链接的完整路径?

例如,如果我的目录设置如下:

~$ tree analysis_results/
analysis_results/
`-- Sample1
    `-- bar.txt -> /Users/me/foo.txt

如果我尝试获取bar.txt的完整路径,我最终会找到foo.txt的路径:

~$ readlink -f analysis_results/Sample1/bar.txt
/Users/me/foo.txt

但我真正想要的是:

/Users/me/analysis_results/Sample1/bar.txt

有一种简单的方法可以实现这一目标吗?看起来我没有realpath可用,不确定该程序是否这样做,或者是否有其他命令可以这样工作。

pwd类似于:

时,事情变得更加复杂
/Users/me/analysis/peaks/workflow/code

但我想阅读符号链接的完整路径,如:

/Users/me/analysis/alignment/results/Sample1/bar.txt

4 个答案:

答案 0 :(得分:4)

使用GNU realpath

$ touch foo
$ ln -s foo bar
$ realpath --no-symlinks bar
/path/to/bar

答案 1 :(得分:1)

echo "$(readlink -f analysis_results/Sample1)/bar.txt"

仅解析目录,然后将文件名附加到结果中。

答案 2 :(得分:1)

您希望解析任何中间符号链接的完整路径吗?

从"另一种方式来做到这一点" category:你的pwd命令可能有一个" -P"用于打印目录的物理路径的选项。因此,您可以在cd中包含pwd()以获得类似

的内容
user@host[/tmp]
$ mkdir test
user@host[/tmp]
$ ln -s test linkdir
user@host[/tmp]
$ (cd /tmp/linkdir; pwd -P)
/tmp/test

因此,您所做的只是cd $(dirname $yourfile),然后运行pwd -P以获取父目录的物理路径。它在示例中包含在parens中,因此它创建了一个子shell并且不会影响当前的工作目录。

答案 3 :(得分:0)

实际例子

要获取 bash 脚本文件夹的父路径,

  • ...很高兴忽略它的文件夹实际上是来自其他地方的符号链接...

这种 parameter substitution、内壳和实路径的组合起到了作用:

例如,“包含”../something。内部 cd 超出范围,后面跟着反引号。

echo $(realpath --no-symlinks `cd ..; echo $(pwd)`)
source $parentDir/helper-library.sh