是否有一个命令来检索给定相对路径的绝对路径?

例如,我想要$line包含dir ./etc/中每个文件的绝对路径

find ./ -type f | while read line; do
   echo $line
done

当前回答

我认为这是最便携的:

abspath() {                                               
    cd "$(dirname "$1")"
    printf "%s/%s\n" "$(pwd)" "$(basename "$1")"
    cd "$OLDPWD"
}

但是,如果路径不存在,它将失败。

其他回答

他们说,除了找到$PWD或(在bash中)找到~+更方便一些。

蓝光:

cd $relative_path ; pwd

这里有一个POSIX兼容的解释(我认为),所以它应该在任何平台上工作。

当然,这是可编写脚本的,但我认为分解它可能会使一些人更容易理解/修改特定的用例。

你可以使用which, locate, find,全路径等等。

x = your_file_name

$ x="nvi" 

文件容易指示符号链接

$ file -h `which $x`
/usr/local/bin/nvi: symbolic link to ../Cellar/nvi/1.81.6_5/bin/nvi

接下来,稍微改变一下输出,这样我们就得到了一个“完整的”相对路径。 在这个例子中,我们只需要去掉中间的部分。

注意大写Y和小写x。可能有更简洁的方法。

$ Y=$(file -h `which $x` | sed "s/$x: symbolic link to //")


$ echo $Y
/usr/local/bin/../Cellar/nvi/1.81.6_5/bin/nvi

使用dirname,我们只得到路径部分。CD给它,名字就会自己清理干净。

$ cd `dirname $Y` ; pwd
/usr/local/Cellar/nvi/1.81.6_5/bin

这将我们引向UNIX的老技巧,即通过在括号/子shell中执行所有操作来“幽灵巡视”目录。这将有效地将我们返回到当前目录。

为了完整起见,我们可以将实际的文件名粘回末尾。

Ls甚至确保绝对路径是有效的,这是额外的加分。

$ ( cd `dirname ${Y}` ; ls `pwd`/${x} )
/usr/local/Cellar/nvi/1.81.6_5/bin/nvi

所以/usr/local/bin/nvi实际上是/usr/local/Cellar/nvi/1.81.6_5/bin/nvi

快速“转换”路径的简化示例:

$ (cd /usr/local/bin/../Cellar/nvi/1.81.6_5/bin ; pwd)
/usr/local/Cellar/nvi/1.81.6_5/bin

https://pubs.opengroup.org/onlinepubs/9699919799/utilities/file.html https://pubs.opengroup.org/onlinepubs/9699919799/utilities/dirname.html

echo "mydir/doc/ mydir/usoe ./mydir/usm" |  awk '{ split($0,array," "); for(i in array){ system("cd "array[i]" && echo $PWD") } }'

use:

find "$(pwd)"/ -type f

获取所有文件或

echo "$(pwd)/$line"

显示完整路径(如果相对路径关系到)

恕我直言,最好的解决方案是在这里发布的:https://stackoverflow.com/a/3373298/9724628。

它确实需要python才能工作,但它似乎涵盖了所有或大部分边缘情况,是非常可移植的解决方案。

通过解析符号链接:

python -c "import os,sys; print(os.path.realpath(sys.argv[1]))" path/to/file

或者没有它:

python -c "import os,sys; print(os.path.abspath(sys.argv[1]))" path/to/file