当前路径、父目录和根目录的路径

3

我需要在UNIX中打印当前、父级和根目录的路径。我可以使用命令或shell脚本。我已经成功地为当前目录和父级目录打印了路径,但是我不知道如何为根目录打印路径。

这是我已经完成的部分:

  • 当前目录: pwd
  • 父级目录: echo $(pwd) | sed -e s/\\/[^\\/]*$//

你能提供一个示例路径并说明你要寻找的根目录是什么吗? - Grokify
例如在 /usr/home/dir 中,根目录是 /usr。 - dd1714
3个回答

3

gnu sed

echo $(pwd) | sed -r -e 'p; :a; s#(.*)/.*#\1#; H; ta; x' | sed '/^$/d'  

这将打印从当前目录到根目录的所有目录。它使用贪婪搜索'/'来保留左侧部分,将其附加在保持空间中。如果有替换条件分支ta,则会跳转到:a。最后,x将保持空间交换到模式空间。
最后一个sed命令是用于清除空行。

这个不起作用。我得到了一些错误,然后当前目录的路径打印了两次。 - dd1714
操作系统是什么?sed的版本是多少?这一行被复制/粘贴了吗?在这里它可以工作 :) - josifoski
2
BSD的sed在使用标签分号时不会终止命令,就像GNU sed一样。尝试pwd | sed -n -e ':a' -e '/./p; s#/[^/]*$##; ta'。请注意,每次使用标签名称时,-e选项都会结束。 - Wintermute
@josifoski 仅使用 -e 是不够的。重要的是在每次使用标签名称后拆分 sed 代码,否则 BSD sed 将把其余代码视为标签名称的一部分。您可以使用 -e 'p; :a' -e 's#....'。根据 FreeBSD 的版本,您还需要使用 -E 而不是 -r - Wintermute
再次感谢,唯一的建议是使用GNU SED,它足够强大(而且还很可爱),可以处理这些问题。 - josifoski
显示剩余4条评论

1

我认为使用awk更容易实现这个:

echo $(pwd) | awk 'BEGIN {FS=OFS="/"} {l=NF; while (i++<l-1) {print; NF--}}'

解释

这将从当前目录打印所有目录 --> 根目录。它通过打印行并递减NF,字段数量来实现此目的。请注意,我已将输入和输出字段分隔符都设置为/


1

和 @josifoski 的想法相同

pwd | sed ':a;\#/\(.*\)/[^/]*# {p;s##/\1#;ba}'

打印并循环,直到只剩下第一个文件夹名称,每次循环都删除路径的最后一个文件夹


这里有一些新的想法,需要解释(学习),为什么它以“#”+1开头。 - josifoski
使用除默认分隔符“/”之外的其他分隔符(通常是作为模式的一部分),转义第一个字符,指定该字符为下一个模式的新分隔符,在这种情况下为“#”,使用s###中的s操作即可实现相同的想法,无需转义。 - NeronLeVelu
对我来说新的是,地址引用中可以标记组。 - josifoski
实际上,像s//这样的空搜索模式意味着使用上一个模式(不是正则表达式的内容,而是正则表达式本身)。因此,对于带有foo/./ s//t/;s//z/,将更改为too,最终变为zoo,更改第一个字母(从ft的下一个字母)。 - NeronLeVelu
你抓住我了!我曾经不好意思问为什么使用空模式的s##/\1#,现在我明白了! - josifoski

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