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


23

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

echo `pwd`/file.ext

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

alias fp='echo `pwd`/'

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

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

Answers:


31

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

readlink -f file.ext

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


readlink -f(或realpath,它是为保持兼容性而保留的较早的实用程序)将另外扩展所有符号链接,这不一定是所希望的。
吉尔斯(Gilles)'所以

8
Fyi:在macosx上不起作用。
akira 2010年

在我的Mac上,我使用homebrew安装了coreutils ,其中包括realpath
道格·哈里斯

7

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

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

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


也许这是您的选择,但是此功能不会输出新行。
cyrus

这种方法的优点是仅使用shell-builtins,这比调用外部二进制文件快。您应该使这一事实更加清楚。
akira

4

用您现在使用的内容回答您的问题:

别名会在您现在输入的位置扩展。您输入:

% fp<SPACE>file.ext

这变成

% echo `pwd`<SPACE>file.exe

您可以使用函数来避免这种情况:

function fp() {
    echo `pwd`/"$1"
}

您可以照常使用:

% fp file.ext

您需要在变量和命令替换echo "`pwd`/$1"
两边

@吉尔斯:在什么情况下?
akira

2
@akira:除非要将扩展结果视为通配符模式并且将通配符结果分割成单词,否则请始终使用双引号。在这里,您正在构建一个文件名,因此需要双引号(尝试*在包含其他文件的目录中的文件中调用函数)。
吉尔斯(Gilles)'所以

' '被外壳(在我的情况下为zsh)包围,并在它们到达函数之前进行了扩展。fp *产率/tmp/4cc3ea0c1b34b,因为这就是该函数的第一paramete。其他参数将是目录中的其他文件。一旦我有了一个名为' '的文件,该功能仍会按预期运行,并用“ *”或*或*进行调用
akira 2010年

bash在这里看起来是“坏”的东西,bash会产生您所指的东西。
akira

3

您可以使用:

realpath file.ext

我没有那个。那是哪里来的
frabjous

@frabjous:它特定于Debian及其衍生产品,仅在您需要它或依赖于它的软件包时才安装。
吉尔斯(Gilles)'所以

我正在使用Arch。那不是基于Debian的,但是无论如何在AUR中都有一个软件包。如果我已经有了readlink,则不确定是否值得安装。
frabjous

好吧,这是一个选择。或者您可以考虑使用功能,请参见Gilles的答案。无论如何,这取决于您要使用的实际用途(我很好奇)。
cyrus

@frabjous:您没有指定正在使用的系统,但是如果它使用基于Aptitude的软件包管理器(Debian,Ubuntu,Mint等),则可以键入apt-cache search realpath以显示coreutils和普通ol'realpath软件包都包含它。然后,您可以输入sudo apt-get install realpath(或coreutils)进行安装。
Michael Scheper '18

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.