【问题标题】:Bash: eliminating redundant path components?Bash:消除冗余路径组件?
【发布时间】:2016-07-25 17:42:47
【问题描述】:

如何消除路径中的冗余组件?

比如我想改造

/foo/../foo/bar

/foo/bar

【问题讨论】:

  • 请注意,在支持符号链接的类 Unix 系统上,'/X/../Y' 并不总是与 '/Y' 相同。在这个问题的例子中,如果你有目录'/bar/foo/bar'和'/bar/qux/bar',并且'/foo'是'/bar/qux'的符号链接,那么'/foo/ ../foo/bar' 实际上是 '/bar/foo/bar' 而 '/foo/bar' 实际上是 '/bar/qux/bar'。所有仅在路径上进行文本替换的尝试解决方案都是错误的。 (但在 Windows 上做这种事情是可以的,因为 '..' 在那里意味着不同的东西。)

标签: linux bash path sh


【解决方案1】:

使用gnu realpath

p='/foo/../foo/bar'

realpath -m "$p"

输出:

/foo/bar

根据realpath --help

-m, --canonicalize-missing   no components of the path need exist

您还可以使用更常用的readlink(感谢@pjh):

readlink -m "$p"

【讨论】:

  • 这个答案很好,但请注意readlink 做同样的事情并且更常见。
  • 谢谢@pjh,我已将其添加到我的答案中。
  • 如果你按照我的建议使用-m 选项,那么它不会检查路径/链接是否存在
【解决方案2】:

您可能会通过类似管道:sed 's-/../foo/-/-g' 来替换路径名中的向上/向下引用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 2020-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多