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

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

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

当前回答

如果你已经安装了coreutils包,你通常可以使用readlink -f relative_file_name来检索绝对符号链接(解析所有符号链接)。

其他回答

realpath试试。

~ $ sudo apt-get install realpath  # may already be installed
~ $ realpath .bashrc
/home/username/.bashrc

要避免扩展符号链接,请使用realpath -s。

答案来自“bash/fish命令打印文件的绝对路径”。

不管怎样,我投票给了被选中的答案,但我想分享一个解决方案。缺点是,它只适用于Linux——在出现堆栈溢出之前,我花了大约5分钟的时间试图找到OSX的等效版本。但我相信它就在那里。

在Linux上,可以将readlink -e与dirname结合使用。

$(dirname $(readlink -e ../../../../etc/passwd))

收益率

/etc/

然后你用dirname的姐妹,basename 文件名

$(basename ../../../../../passwd)

收益率

passwd

把它们放在一起…

F=../../../../../etc/passwd
echo "$(dirname $(readlink -e $F))/$(basename $F)"

收益率

/etc/passwd

如果目标目录是安全的,basename将不会返回任何内容 在最终输出中,你只会得到双斜杠。

#! /bin/sh
echo "$(cd "$(dirname "$1")"; pwd)/$(basename "$1")"

一些解释

这个脚本获取相对路径作为参数"$1" 然后我们得到该路径的dirname部分(你可以将dir或file传递给这个脚本): 然后我们将“$(dirname“$1”)cd到这个相对目录中,并通过运行pwd shell命令获得它的绝对路径 在此之后,我们将basename附加到绝对路径: 作为最后一步,我们重复它

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

欧根的回答对我来说不太管用,但这个却管用:

    absolute="$(cd $(dirname \"$file\"); pwd)/$(basename \"$file\")"

旁注,当前工作目录不受影响。