如何在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"
使用bash
string函数:
$ 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)
这是因为没有使用外部命令,所以效率更高。