如何在Bash中从绝对路径创建相对路径?

4

我在这个目录中:

/home/michal/project/test/my-utils/rel/0.1.0

我想在Linux shell中获取相对于/home/michal/project/的路径:

../../..

我用sed尝试了一些事情,但是我没有成功创建正则表达式。例如其中的一个尝试:

pwd | sed -e "s/.*project\///g" | sed -e "s/[^\/]+/../g"

有什么技巧可以做到这一点吗?


也许只需要 sed 's,^/[^/]*/[^/]*/[^/]*,../../..,' - Wiktor Stribiżew
@WiktorStribiżew 它的工作方式不如预期: $ pwd | sed 's,^/[^/]/[^/]/[^/]*,../../..,' ../../../project/test/my-utils/rel/0.1.0 我想要一个相对路径到/home/michal/project/目录。不需要知道我有多少个子目录。 - Michal Špondr
所以更像是“确定我需要爬回目录树多远,直到我到达所需的文件夹,这个数字就是我需要连接的../数量,作为我的答案”。 - JNevill
1
这似乎有点像 XY 问题;直接使用绝对路径 /home/michal/project 有什么问题吗?您可以使用 ${path%%/test/*} 获取该路径。(我假设您知道 test 是“根”子目录。) - chepner
请尝试使用以下命令:awk -F/ '{f=0;for(i=2; i<=NF; i++) {if($i!="project" && f==0) {printf "../"} else {if (f==0) {printf "../";f=1} else {printf $i "/"}}}}' <<< "${PWD}" - Wiktor Stribiżew
@kvantour 是的,这可能是一个重复的问题。有趣的是,我至少花了10分钟的时间试图找到类似的东西,因为这个基本问题必须在某个地方得到解答。 - Michal Špondr
1个回答

10

您可以使用命令 realpath

realpath --relative-to=${PWD} /home/michal/project/

来自帮助页面:

--relative-to=FILE 将解析后的路径打印为相对于 FILE 的路径


+1 学会了新的命令,本可以在 man readlink 的“see also”中找到,但应该知道我们可以使用它来处理相对路径。 - Nahuel Fouilleul
就这样,没有正则表达式!谢谢! - Michal Špondr

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