假设我有一个文件/from/here/to/there.txt
,并且只想获取其目录名的最后一部分to
而不是/from/here/to
,该怎么办?
Answers:
basename
即使它不是文件,也可以使用。使用剥离文件名dirname
,然后使用basename
来获取字符串的最后一个元素:
dir="/from/here/to/there.txt"
dir="$(dirname $dir)" # Returns "/from/here/to"
dir="$(basename $dir)" # Returns just "to"
dir
设置美元时,我不应该在美元前面。
使用bash
字符串函数:
$ s="/from/here/to/there.txt"
$ s="${s%/*}" && echo "${s##*/}"
to
使用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)
由于不使用任何外部命令,因此效率更高。
纯BASH方式:
s="/from/here/to/there.txt"
[[ "$s" =~ ([^/]+)/[^/]+$ ]] && echo "${BASH_REMATCH[1]}"
to
.
。如果目录中包含dot,则将不起作用.
。保持简单,并使用斜杠/
作为分隔符。
另一种方式
IFS=/ read -ra x <<<"/from/here/to/there.txt" && printf "%s\n" "${x[-2]}"
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"`
为了获得路径的任何部分,您可以执行以下操作:
echo "/from/here/to/there.txt" | awk -F/ '{ print $2 }'
OR
echo "/from/here/to/there.txt" | awk -F/ '{ print $3 }'
OR
etc
最高答案对于所提问题绝对正确。在更通用的情况下,所需的目录位于长路径的中间,这种方法会导致代码难以阅读。例如 :
dir="/very/long/path/where/THIS/needs/to/be/extracted/text.txt"
dir="$(dirname $dir)"
dir="$(dirname $dir)"
dir="$(dirname $dir)"
dir="$(dirname $dir)"
dir="$(dirname $dir)"
dir="$(basename $dir)"
在这种情况下,可以使用:
IFS=/; set -- "/very/long/path/where/THIS/needs/to/be/extracted/text.txt"; set $1; echo $6
THIS