如何在Bash中获得dirname的最后部分

假设我有一个文件/from/here/to/there.txt ,并且只想得到它的dirname的最后部分而不是/from/here/to ,我该怎么办?

即使不是文件,也可以使用basename 。 使用dirname去除文件名,然后使用basename来获取string的最后一个元素:

 dir="/from/here/to/there.txt" dir="$(dirname $dir)" # Returns "/from/hear/to" dir="$(basename $dir)" # Returns just "to" 

使用bashstring函数:

 $ s="/from/here/to/there.txt" $ s="${s%/*}" && echo "${s##*/}" to 

dirname的对面是basename

 basename "$(dirname "/from/here/to/there.txt")" 

纯BASH方式:

 s="/from/here/to/there.txt" [[ "$s" =~ ([^/]+)/[^/]+$ ]] && echo "${BASH_REMATCH[1]}" to 

还有一种方法

 IFS=/ read -ra x <<<"/from/here/to/there.txt" && printf "%s\n" "${x[-2]}" 

这个问题就像这样。

为了解决这个问题,你可以做:

 DirPath="/from/here/to/there.txt" DirPath="$(dirname $DirPath)" DirPath="$(basename $DirPath)" echo "$DirPath" 

正如我的朋友所说,这也是可能的:

 basename `dirname "/from/here/to/there.txt"` 

为了得到你的path的任何部分,你可以做:

 echo "/from/here/to/there.txt" | awk -F/ '{ print $2 }' OR echo "/from/here/to/there.txt" | awk -F/ '{ print $3 }' OR etc 

一个awk方法是:

 awk -F'/' '{print $(NF-1)}' <<< "/from/here/to/there.txt" 

说明:

  • -F'/'将字段分隔符设置为“/”
  • 打印第二个最后一个字段$(NF-1)
  • <<<使用任何东西作为标准input( 维基解释 )

使用Bash 参数扩展 ,你可以这样做:

 path="/from/here/to/there.txt" dir="${path%/*}" # sets dir to '/from/here/to' (equivalent of dirname) last_dir="${dir##*/}" # sets last_dir to 'to' (equivalent of basename) 

这是因为没有使用外部命令,所以效率更高。