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

1027

有没有简单的方法可以打印出file.txt的完整路径?

file.txt = /nfs/an/disks/jj/home/dir/file.txt

<command>元素

dir> <command> file.txt  

应该打印出来

/nfs/an/disks/jj/home/dir/file.txt
36个回答

1671

使用 readlink 命令:

readlink -f file.txt

13
请参见 https://dev59.com/UnNA5IYBdhLWcg3wL62x。 - filmor
7
在10.9.2系统上进行了测试,运行正常。 which readlink命令的输出为/usr/local/opt/coreutils/libexec/gnubin/readlink。 readlink --version的输出为readlink (GNU coreutils) 8.22。 - J0hnG4lt
12
那是因为你使用Homebrew安装了coreutils,并更改了PATH以指向未经前缀的二进制文件。如果只安装coreutils而不更改PATH,并使用"greadlink"命令,也可以实现同样效果。 - Tim Smith
60
在MAC上:先安装Homebrew,然后运行brew install coreutils,最后运行greadlink -f file.txt来获取文件的绝对路径。 - To Kra
15
readlink 的 man 手册中可以看到:注意,realpath 是首选的用于规范化功能的命令。 - Huntro
显示剩余10条评论

397

我猜你正在使用Linux。

我在coreutils 8.15中找到一个叫做realpath的实用程序。

realpath -s file.txt
/data/ail_data/transformed_binaries/coreutils/test_folder_realpath/file.txt

由于问题是关于如何获取文件的完整/绝对路径而不是关于如何获取符号链接的目标 (请参见此处),因此请使用-s--no-symlinks选项,这意味着不要展开符号链接。

根据@styrofoam-fly和@arch-standton的评论,单独使用realpath无法检查文件是否存在,为解决此问题,请添加e参数:realpath -e file


2
realpath 函数于2011年底被提交到了 coreutils 仓库,版本8.15在2012年1月发布。我在2011年3月回答了这个问题(提出了readlink的建议):) - filmor
2
realpath 不会检查文件是否存在,它只是解析路径。请求一个不存在的文件的完整路径应该导致错误。 - styrofoam fly
11
如果实参不存在,realpath -e会打印出一个错误。 - Arch Stanton
2
这比readlink更好,因为你可以获取文件和文件夹的完整路径! - aerijman
2
添加 -s 选项以不扩展符号链接。 - Robin A. Meade
显示剩余2条评论

102

通常以下代码可以解决问题:

 echo "$(cd "$(dirname "$1")" && pwd -P)/$(basename "$1")"

你好。我发现这个答案是最符合我的需求的。你能解释一下如何使用本地变量而不是命令行参数(即$1)吗? - deeJ
1
LOCAL_VARIABLE="filename.txt" && echo $(cd $(dirname "$LOCAL_VARIABLE") && pwd -P)/$(basename "$LOCAL_VARIABLE") - stiemannkj1
10
因为readlink在文件是符号链接时无法正常工作,所以它会显示符号链接的目标而不是符号链接本身。 - qwertzguy
2
我喜欢这个,因为readlink会带我回到符号链接生成的父目录,但是这个命令会忽略它。 - Sukhi
设置.. && 回显$(cd $(dirname "$1") && pwd -P)/$(basename "$1")

输出:/home/ravi/..

- Tom Hale
1
我认为这应该是被接受的答案,因为它具有可移植性。 - rubynorails

51

我知道有比这更简单的方法,但是我找不到...

jcomeau@intrepid:~$ python -c 'import os; print(os.path.abspath("cat.wav"))'
/home/jcomeau/cat.wav

jcomeau@intrepid:~$ ls $PWD/cat.wav
/home/jcomeau/cat.wav

46

在Windows上:

  • 在Windows资源管理器中,按住Shift键然后右击文件,会出现一个名为复制路径的选项。选择该选项可以将文件的完整路径复制到剪贴板。

在Linux上:

  • 您可以使用命令realpath yourfile来获取文件的完整路径,这是其他人推荐的方法。

36
find $PWD -type f | grep "filename"
或者
find $PWD -type f -name "*filename*"

1
对我来说,在 Mac 上,这个方法可行 - 用 find \pwd` -type file -name *.dmp` 替代 $pwd。 - mrwaim
谢谢!这激发了我使用更简单的 find $PWD,在只有几个文件时完美地运作。 - Neithan Max

27

如果您与文件在同一目录中:

ls "`pwd`/file.txt"

用你的目标文件名替换 file.txt


17
你也可以执行 echo $(pwd)/file.txt 命令。 - Alex

7

11
这个答案太具体了,OP并不是在寻找命令。 - A.L

6
你可以使用 fpn(完整路径名) 脚本:
% pwd
/Users/adamatan/bins/scripts/fpn

% ls
LICENSE   README.md fpn.py

% fpn *
/Users/adamatan/bins/scripts/fpn/LICENSE
/Users/adamatan/bins/scripts/fpn/README.md
/Users/adamatan/bins/scripts/fpn/fpn.py

fpn不是标准的Linux软件包,但它是一个免费且开放的Github项目,你可以在一分钟内设置好它


1
通常情况下,在Linux和大多数其他类Unix操作系统环境中,单独运行pwd命令应该是没有问题的。 - karolus

4

适用于Mac、Linux和*nix操作系统:

以下命令将为您提供当前目录中所有文件的带引号csv格式:

ls | xargs -I {} echo "$(pwd -P)/{}" | xargs | sed 's/ /","/g'

这可以轻松地复制到Python列表或任何类似的数据结构中。

打印当前pwd路径 - san1512
是的,列出当前目录下所有文件的逗号分隔完整路径,对于一个文件,只需使用'ls' '文件名'而不是仅仅使用'ls'。 - Bhargav Srinivasan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接