是否有一种简单的方法可以打印file.txt的完整路径?

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

<命令>

dir> <command> file.txt  

应该打印

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

当前回答

这将适用于文件和文件夹:

getAbsolutePath(){
    [[ -d $1 ]] && { cd "$1"; echo "$(pwd -P)"; } || 
    { cd "$(dirname "$1")" || exit 1; echo "$(pwd -P)/$(basename "$1")"; }
}

其他回答

find $PWD -type f | grep "filename"

or

find $PWD -type f -name "*filename*"

除了"readlink -f",还有一个常用的命令:

$find /the/long/path/but/I/can/use/TAB/to/auto/it/to/ -name myfile /the/long/path/but/I/can/use/TAB/to/auto/it/to/myfile $

这也给出了控制台的完整路径和文件名

跑题:这种方法只给出相对链接,而不是绝对链接。readlink -f命令是正确的。

这个解决方案使用的命令存在于Ubuntu 22.04上,但通常存在于大多数其他Linux发行版上,除非它们只是为了s'mores而硬核。

在Linux或Mac上获取文件完整路径的最短方法是使用ls命令和PWD环境变量。

<0.o> touch afile
<0.o> pwd
/adir
<0.o> ls $PWD/afile
/adir/afile

你可以用你自己的目录变量d做同样的事情。

<0.o> touch afile
<0.o> d=/adir
<0.o> ls $d/afile
/adir/afile

注意,如果没有标记,ls <FILE>和echo <FILE>是等效的(对于当前目录中的有效文件名称),所以如果你使用echo,如果你愿意,你可以使用ls代替。

如果情况相反,您有完整的路径并想要文件名,只需使用basename命令。

<0.o> touch afile
<0.o> basename $PWD/afile
afile

您可以使用此功能。如果给出的文件名没有相对路径,则假定它在当前工作目录中:

abspath() { old=`pwd`;new=$(dirname "$1");if [ "$new" != "." ]; then cd $new; fi;file=`pwd`/$(basename "$1");cd $old;echo $file; }

用法:

$ abspath file.txt
/I/am/in/present/dir/file.txt

使用相对路径:

$ abspath ../../some/dir/some-file.txt
/I/am/in/some/dir/some-file.txt

文件名中有空格:

$ abspath "../../some/dir/another file.txt"
/I/am/in/some/dir/another file.txt

我喜欢已经给出的许多答案,但我发现这真的很有用,特别是在脚本中获得文件的完整路径,包括遵循符号链接和相对引用,例如。和. .

dirname `readlink -e relative/path/to/file`

它将返回从根路径开始的文件的完整路径。 这可以在脚本中使用,以便脚本知道它是从哪个路径运行的,这对于可能位于机器上任何位置的存储库克隆非常有用。

basePath=`dirname \`readlink -e $0\``

然后我可以在我的脚本中使用${basePath}变量来直接引用其他脚本。

希望这能有所帮助,

Dave