是否有一种可移植、方便的方法来规范化相对路径?

是否有一种可移植、方便的方法来规范化相对路径?

在这里,“规范化”基本上是指将文件路径转换为其最简单或“规范”形式的过程。例如, 的规范形式/foo/.//bar/../baz//foo/baz

对于绝对路径,zsh 的:a修饰符在这方面做得很好:

% printf -- '%s\n%s\n' "${WILDABSPATH}" "${WILDABSPATH:a}"
/foo/.//bar/../baz/
/foo/baz

不幸的是,对于相对文件路径,:a修饰符的作用太多,因为它将文件路径转换为绝对路径。

% printf -- '%s\n%s\n' "${WILDRELPATH}" "${WILDRELPATH:a}"
./foo/.//bar/../baz/
/tmp/foo/baz

使用最后一个例子,有没有好的方法可以转换${WILDRELPATH}foo/baz


我想我的问题的一个答案可能是这样的

[[ ${ORIGINAL} == /* ]] \
  && CANONICAL=${ORIGINAL:a} \
  || CANONICAL=${${ORIGINAL:a}#$PWD/}

有没有更简单的?

答案1

我相信可以使用 来解决这个问题realpath

您可以执行以下操作...

realpath -m --relative-to=./ ./foo/.//bar/../baz/ # Outputs foo/baz
# or
realpath -m /foo/.//bar/../baz/ # Outputs /foo/baz

相关内容