是否有一个命令来检索给定相对路径的绝对路径?

例如,我想要$line包含dir ./etc/中每个文件的绝对路径

find ./ -type f | while read line; do
   echo $line
done

当前回答

恕我直言,最好的解决方案是在这里发布的:https://stackoverflow.com/a/3373298/9724628。

它确实需要python才能工作,但它似乎涵盖了所有或大部分边缘情况,是非常可移植的解决方案。

通过解析符号链接:

python -c "import os,sys; print(os.path.realpath(sys.argv[1]))" path/to/file

或者没有它:

python -c "import os,sys; print(os.path.abspath(sys.argv[1]))" path/to/file

其他回答

不管怎样,我投票给了被选中的答案,但我想分享一个解决方案。缺点是,它只适用于Linux——在出现堆栈溢出之前,我花了大约5分钟的时间试图找到OSX的等效版本。但我相信它就在那里。

在Linux上,可以将readlink -e与dirname结合使用。

$(dirname $(readlink -e ../../../../etc/passwd))

收益率

/etc/

然后你用dirname的姐妹,basename 文件名

$(basename ../../../../../passwd)

收益率

passwd

把它们放在一起…

F=../../../../../etc/passwd
echo "$(dirname $(readlink -e $F))/$(basename $F)"

收益率

/etc/passwd

如果目标目录是安全的,basename将不会返回任何内容 在最终输出中,你只会得到双斜杠。

欧根的回答对我来说不太管用,但这个却管用:

    absolute="$(cd $(dirname \"$file\"); pwd)/$(basename \"$file\")"

旁注,当前工作目录不受影响。

如果你已经安装了coreutils包,你通常可以使用readlink -f relative_file_name来检索绝对符号链接(解析所有符号链接)。

我认为这是最便携的:

abspath() {                                               
    cd "$(dirname "$1")"
    printf "%s/%s\n" "$(pwd)" "$(basename "$1")"
    cd "$OLDPWD"
}

但是,如果路径不存在,它将失败。

对@ernest-a相当不错的版本的改进:

absolute_path() {
    cd "$(dirname "$1")"
    case $(basename $1) in
        ..) echo "$(dirname $(pwd))";;
        .)  echo "$(pwd)";;
        *)  echo "$(pwd)/$(basename $1)";;
    esac
}

这正确地处理了路径的最后一个元素是..,在这种情况下,@ernest-a的答案中的“$(pwd)/$(basename“$1”)”将通过作为accurate_sub_path/spurious_subdirectory/…