我确实在寻找一个通用的解决方案,但为了举例说明,假设我正在寻找最深层的2路径中的目录。例如:给定一个路径/home/someone/foo/bar
,如何使用 sed (或 awk) 来获取foo/bar
如果路径的第一部分始终相同,那将会很简单,但就我而言,我正在寻找一种适用于任意路径的表达式,理想情况下,适用于任何深度n
。
如果路径的级别少于n
(在本例中为 2 个),则命令的行为并不重要。
我今天去做了这件事,发现它很棘手。我开始编写一个循环来代替它,但我无法摆脱这种感觉,即这必须用一个命令就可以实现。我可能错了。有什么想法吗?
答案1
echo "/your/directory/here/bla" | awk -F"/" '{ print "/"$(NF-1)"/"$NF }'
应该可以找到,我没有尝试,但是像这样的东西应该可以工作:
find /yourfolder/structure -type d | awk -F"/" '{ print "/"$(NF-1)"/"$NF }'
仅供参考,$NF 是在 awk 中发现的最新字段,$(NF-1) 是前一个字段。
答案2
在 awk 中,将字段分隔符更改为斜线:
$ echo /home/someone/foo/bar | awk -F / -v OFS=/ '{ print $(NF-1), $NF }'
foo/bar
这会将输入字段分隔符和输出字段分隔符都设置为斜线,然后打印倒数第二个字段值、字段分隔符,然后打印最后一个字段值。
n 值解决方案
$ echo /home/someone/foo/bar | awk -F / -v n=3 '
{ o = $NF; for (f=1; f<n; f++) o = $(NF-f) "/" o; print o }
'
someone/foo/bar
这使用循环来提取所需数量的目录。