如何从k shell中的路径中提取最后的X个文件夹

时间:2015-12-03 21:40:54

标签: shell sed ksh csh

假设我有一个路径名/server/user/folderA/folderB/folderC,我将如何提取(到变量)最后几个文件夹?我正在寻找能够灵活地给我folderCfolderB/folderCfolderA/folderB/folderC等的内容。

我试图使用sed,但我不确定这是最好的方法。

这必须是ksh或csh(遗憾的是我们机器上没有bash)

3 个答案:

答案 0 :(得分:1)

这将帮助您入门:

arr=( $(echo "/server/user/folderA/folderB/folderC" | sed 's#/# #g') )

echo ${#arr[*]}
echo ${arr[*]}
echo ${arr[3]}
echo "${arr[2]}/${arr[3]}/${arr[4]}"

<强>输出

 5
 server user folderA folderB folderC
 folderB
 folderA/folderB/folderC

IHTH

答案 1 :(得分:1)

你可以使用数组,但是ksh88(至少是我在Solaris 8上测试的那个)使用了set -A的旧Korn Shell语法,它也没有(( i++ )),所以这看起来比当代ksh93或mksh代码更加巴洛克式。另一方面,我也给你一个提取最后 n 项的功能;)

p=/server/user/folderA/folderB/folderC
saveIFS=$IFS
IFS=/
set -A fullpath -- $p
echo all: "${fullpath[*]}"
unset fullpath[0] # leading slash
unset fullpath[1]
unset fullpath[2]
echo all but first two: "${fullpath[*]}"
IFS=$saveIFS

# example function to get the last n:
function pathlast {
        typeset saveIFS parr i=0 n

        saveIFS=$IFS
        IFS=/
        set -A parr -- $2
        (( n = ${#parr[*]} - $1 ))
        while (( i < n )); do
                unset parr[i]
                (( i += 1 ))
        done
        echo "${parr[*]}"
        IFS=$saveIFS
}

for lst in 1 2 3; do
        echo all but last $lst: $(pathlast $lst "$p")
done

输出:

tg@stinky:~ $ /bin/ksh x
all: /server/user/folderA/folderB/folderC
all but first two: folderA/folderB/folderC
all but last 1: folderC
all but last 2: folderB/folderC
all but last 3: folderA/folderB/folderC

除第一行设置$p外,您只需复制功能部分即可。

答案 2 :(得分:0)

如果你已经得到它,可以用perl完成:

$ path=/server/user/folderA/folderB/folderC
$ X=3
$ echo $path|perl -F/ -ane '{print join "/",@F[(@F-'$X')..(@F-1)]}'
folderA/folderB/folderC