【发布时间】:2014-06-03 10:42:13
【问题描述】:
假设我有一个文件/from/here/to/there.txt,并且只想获取其目录名的最后一部分to 而不是/from/here/to,我该怎么办?
【问题讨论】:
假设我有一个文件/from/here/to/there.txt,并且只想获取其目录名的最后一部分to 而不是/from/here/to,我该怎么办?
【问题讨论】:
您可以使用basename,即使它不是文件。用dirname去掉文件名,然后用basename得到字符串的最后一个元素:
dir="/from/here/to/there.txt"
dir="$(dirname $dir)" # Returns "/from/here/to"
dir="$(basename $dir)" # Returns just "to"
【讨论】:
dir 前面放美元。
dirname 的反义词是basename:
basename "$(dirname "/from/here/to/there.txt")"
【讨论】:
使用bash字符串函数:
$ s="/from/here/to/there.txt"
$ s="${s%/*}" && echo "${s##*/}"
to
【讨论】:
使用 Bash parameter expansion,您可以这样做:
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
【讨论】:
. 将不起作用。如果目录有点. 将不起作用。保持简单并使用斜杠/ 作为分隔符。
awk 的做法是:
awk -F'/' '{print $(NF-1)}' <<< "/from/here/to/there.txt"
说明:
-F'/' 将字段分隔符设置为“/”$(NF-1)
<<< 使用它之后的任何内容作为标准输入
(wiki explanation)【讨论】:
另一种方法
IFS=/ read -ra x <<<"/from/here/to/there.txt" && printf "%s\n" "${x[-2]}"
【讨论】:
printf "%s\n" "${x[-2]}".
这个问题类似于THIS。
为了解决你可以做的:
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
【讨论】: