如何规范化 Bash 中的文件路径?

新手上路,请多包涵

我想将 /foo/bar/.. 转换为 /foo

是否有执行此操作的 bash 命令?


编辑:在我的实际情况下,该目录确实存在。

原文由 Fabien 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 950
2 个回答

如果你想从路径中选择文件名的一部分,“dirname”和“basename”是你的朋友,“realpath”也很方便。

 dirname /foo/bar/baz
# /foo/bar
basename /foo/bar/baz
# baz
dirname $( dirname  /foo/bar/baz  )
# /foo
realpath ../foo
# ../foo: No such file or directory
realpath /tmp/../tmp/../tmp
# /tmp

realpath 替代品

如果你的shell不支持 realpath ,你可以试试

readlink -f /path/here/..

readlink -m /path/there/../../

工作方式与

realpath -s /path/here/../../

因为路径不需要存在就可以标准化。

原文由 Kent Fredric 发布,翻译遵循 CC BY-SA 4.0 许可协议

我不知道是否有直接的 bash 命令来执行此操作,但我通常会这样做

normalDir="`cd "${dirToNormalize}";pwd`"
echo "${normalDir}"

它运作良好。

原文由 Tim Whitcomb 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题