给定一个字符串文件路径,例如/foo/fizzbuzz。酒吧,我如何使用bash提取只是fizzbuzz部分说的字符串?


当前回答

看看basename命令:

NAME="$(basename /foo/fizzbuzz.bar .bar)"

指示它删除后缀.bar,结果是NAME=fizzbuzz

其他回答

如果您想只保留带扩展名的文件名并删除文件路径

$ x="myfile/hello/foo/fizzbuzz.bar"
$ echo ${x##*/}
$ fizzbuzz.bar

Bash手册中的解释,请参见${parameter##word}

你可以使用

mv *<PATTERN>.jar "$(basename *<PATTERN>.jar <PATTERN>.jar).jar"

例如:-我想从我的文件名中删除- snapshot。用于下面的命令

 mv *-SNAPSHOT.jar "$(basename *-SNAPSHOT.jar -SNAPSHOT.jar).jar"

basename和dirname函数是你需要的:

mystring=/foo/fizzbuzz.bar
echo basename: $(basename "${mystring}")
echo basename + remove .bar: $(basename "${mystring}" .bar)
echo dirname: $(dirname "${mystring}")

输出:

basename: fizzbuzz.bar
basename + remove .bar: fizzbuzz
dirname: /foo

除了这个答案中使用的POSIX符合语法外,

basename string [suffix]

就像在

basename /foo/fizzbuzz.bar .bar

GNU basename支持另一种语法:

basename -s .bar /foo/fizzbuzz.bar

同样的结果。区别和优势在于-s意味着-a,它支持多个参数:

$ basename -s .bar /foo/fizzbuzz.bar /baz/foobar.bar
fizzbuzz
foobar

这甚至可以通过使用-z选项将输出与NUL字节分开来实现文件名安全,例如对于这些包含空格,换行符和glob字符(由ls引用)的文件:

$ ls has*
'has'$'\n''newline.bar'  'has space.bar'  'has*.bar'

读入数组:

$ readarray -d $'\0' arr < <(basename -zs .bar has*)
$ declare -p arr
declare -a arr=([0]=$'has\nnewline' [1]="has space" [2]="has*")

readarray -d要求Bash 4.4或更新版本。对于旧版本,我们必须循环:

while IFS= read -r -d '' fname; do arr+=("$fname"); done < <(basename -zs .bar has*)

将排名第一的答案与排名第二的答案结合起来,得到没有完整路径的文件名:

$ x="/foo/fizzbuzz.bar.quux"
$ y=(`basename ${x%%.*}`)
$ echo $y
fizzbuzz