DIRNAME="/a/b/c/d/e"
D2=$(dirname "$DIRNAME")
DIRNAME2=$(basename "$D2")/$(basename "$DIRNAME")
或者,在一行中(但要小心所有双引号 - 当它分开时会更容易):
DIRNAME2=$(basename "$(dirname "$DIRNAME")")/$(basename "$DIRNAME")
除非您非常沉迷于受虐狂,否则不要尝试使用反引号的游戏。如果路径中可能有空格,请在变量名称两边使用双引号。
这几乎适用于任何 shell Korn Shell 以及 Bash。在bash
,还有其他可用的机制 - 其他答案说明了许多选项中的一些,但expr
也是一个老式的解决方案(它也出现在第七版 Unix 中)。这段使用反引号的代码也适用于 Bash 和 Korn shell,但不适用于 Heirloom Shell(类似于 Unix System V Release 2/3/4 shell,IIRC)。
DIRNAME2=`basename "\`dirname \\"$DIRNAME\\"\`"`/`basename "$DIRNAME"`
(两层嵌套并不算太糟糕,但非常糟糕;三层嵌套真的很棘手!)
Testing
当测试应该在路径名中的空格中保留的路径名操作时,值得使用包含双空格(而不是或同时包含单空格)的名称进行测试。例如:
DIRNAME="/a b/ c d / ee ff / gg hh "
echo "DIRNAME=[[$DIRNAME]]"
echo "basename1=[[$(basename "$DIRNAME")]]"
echo "basename2=[[`basename \"$DIRNAME\"`]]"
echo
D2=$(dirname "$DIRNAME")
echo "D2=[[$D2]]"
DIRNAME2=$(basename "$D2")/$(basename "$DIRNAME")
echo "DIRNAME2=[[$DIRNAME2]]"
echo
DIRNAME3=$(basename "$(dirname "$DIRNAME")")/$(basename "$DIRNAME")
echo "DIRNAME3=[[$DIRNAME3]]"
DIRNAME4=`basename "\`dirname \\"$DIRNAME\\"\`"`/`basename "$DIRNAME"`
echo "DIRNAME4=[[$DIRNAME2]]"
其输出是:
DIRNAME=[[/a b/ c d / ee ff / gg hh ]]
basename1=[[ gg hh ]]
basename2=[[ gg hh ]]
D2=[[/a b/ c d / ee ff ]]
DIRNAME2=[[ ee ff / gg hh ]]
DIRNAME3=[[ ee ff / gg hh ]]
DIRNAME4=[[ ee ff / gg hh ]]