如何在 Bash 中获取文件的绝对目录?

新手上路,请多包涵

我编写了一个 Bash 脚本,它将输入文件作为参数并读取它。

此文件包含一些到其他文件的路径(相对于其位置)。

我希望脚本转到包含输入文件的文件夹,以执行进一步的命令。

在 Linux 中, 如何从输入文件中获取文件夹(仅是文件夹)?

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

阅读 711
2 个回答

要获得完整路径,请使用:

 readlink -f relative/path/to/file

要获取文件的目录:

 dirname relative/path/to/file

您也可以将两者结合起来:

 dirname $(readlink -f relative/path/to/file)

如果 readlink -f 在您的系统上不可用,您可以使用这个* :

 function myreadlink() {
  (
  cd "$(dirname $1)"         # or  cd "${1%/*}"
  echo "$PWD/$(basename $1)" # or  echo "$PWD/${1##*/}"
  )
}

请注意,如果您只需要移动到指定为相对路径的文件的目录,则不需要知道绝对路径,相对路径是完全合法的,因此只需使用:

 cd $(dirname relative/path/to/file)

如果您希望(在脚本运行时)返回到原始路径,请在完成后使用 pushd 而不是 cdpopd


* 虽然 myreadlink 以上在这个问题的上下文中已经足够好了,但它相对于 readlink 上面建议的工具有一些限制。例如,它没有正确地跟随指向具有不同 basename 的文件的链接。

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

看看 realpathGNU/LinuxFreeBSDNetBSD 上可用,但在 OpenBSD 6.8 上不可用。我使用类似的东西:

 CONTAININGDIR=$(realpath ${FILEPATH%/*})

做你想做的事。

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

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