如何在bash中获取文件的完整路径?

39 bash command-line

我想要一种简单的方法来获取文件的完整路径。我目前输入这个:

echo `pwd`/file.ext
Run Code Online (Sandbox Code Playgroud)

为了缩短它,我做了一个 bash 别名:

alias fp='echo `pwd`/'
Run Code Online (Sandbox Code Playgroud)

但是现在如果我输入fp file.ext,在/和之间会出现一个空格file.ext

这样的命令是否已经存在,而我错过了它?如果没有,我将如何在 bash 中创建这样的别名或函数?

Dou*_*ris 54

在 linux 系统上,您应该readlink从 GNU coreutils 项目安装并且可以执行以下操作:

readlink -f file.ext
Run Code Online (Sandbox Code Playgroud)

Debian/ubuntu 系统可能安装了realpath实用程序,它“提供/bin/readlink -f与 coreutils 包中的功能大致相同”。

  • 仅供参考:在 macosx 上不起作用。 (11认同)
  • 在我的 Mac 上,我已经使用 [homebrew](https://brew.sh) 安装了 coreutils,它包括 `realpath`。 (4认同)

Gil*_*il' 9

代替pwd命令,使用PWD变量(它也在 POSIX 中):

fp () {
  case "$1" in
    /*) printf '%s\n' "$1";;
    *) printf '%s\n' "$PWD/$1";;
  esac
}
Run Code Online (Sandbox Code Playgroud)

如果您需要支持 Windows,则识别绝对路径会更加复杂,因为 unix 工具的每个端口都有自己的转换文件路径的规则。对于 Cygwin,使用该cygpath实用程序。


cYr*_*rus 8

您可以使用:

realpath file.ext
Run Code Online (Sandbox Code Playgroud)


小智 6

来自/sf/answers/274079431/

这是我唯一可以接受的方式。不扩展像 realpath 和 readlink 这样的链接,是我见过的经典方法。

#! /bin/sh
echo "$(cd "$(dirname "$1")"; pwd -P)/$(basename "$1")"
Run Code Online (Sandbox Code Playgroud)

  • 当 $1 可以是相对路径或绝对路径时,这是要走的路 (2认同)