我有一个格式如下的文件:
XXX XXXX XXX-6VwvOkZvzuI.description
Run Code Online (Sandbox Code Playgroud)
我怎样才能得到文件名XXX XXXX XXX
?我试过了:
for file in $(ls .d*)
do
fname="${file%*-}"
ext="${filename%.*}"
done
Run Code Online (Sandbox Code Playgroud)
不要解析输出ls
(参见例如Why *not* parse `ls`(以及该怎么做)?)。您遇到的问题是,您的循环变量 ,file
将在将文件名全部连接成一个长字符串后取值,然后在空格上拆分(以及在任何拆分单词之后)通配模式已扩展)。你会得到你的循环的三个迭代的文件名XXX XXXX XXX-6VwvOkZvzuI.description
,例如,每一个的价值观XXX
,XXXX
和XXX-6VwvOkZvzuI.description
。
遍历名称中带有破折号的所有文件,然后是.description
使用的文件名后缀
for name in *-*.description; do ...; done
Run Code Online (Sandbox Code Playgroud)
要挑选-
in之前的部分$name
,请使用标准参数扩展,删除-
字符串中第一个之后的所有内容:
prefix=${name%%-*}
Run Code Online (Sandbox Code Playgroud)
using%%
和%
here的区别在于删除%%
了最长匹配的尾字符串。如果-
任何名称中碰巧有多个字符,这很重要。
你的循环然后变成
for name in *-*.description; do
prefix=${name%%-*}
done
Run Code Online (Sandbox Code Playgroud)
文件名后缀是已知的 ( .description
),但您可以-
使用
infix=${name#"$prefix"}
infix=${infix%.description}
Run Code Online (Sandbox Code Playgroud)
最后,使用类似的脚本
#!/bin/sh
suffix=.description
for name in *-*"$suffix"; do
prefix=${name%%-*}
infix=${name#"$prefix"}
infix=${infix%.description}
printf 'prefix="%s", infix="%s", suffix="%s"\n' \
"$prefix" "$infix" "$suffix"
done
Run Code Online (Sandbox Code Playgroud)
你会得到
$ ls
XXX XXXX XXX-6VwvOkZvzuI.description XXX XXXX XXX-6VwvOkZvzuK.description
XXX XXXX XXX-6VwvOkZvzuJ.description script
Run Code Online (Sandbox Code Playgroud)
$ ./script
prefix="XXX XXXX XXX", infix="-6VwvOkZvzuI", suffix=".description"
prefix="XXX XXXX XXX", infix="-6VwvOkZvzuJ", suffix=".description"
prefix="XXX XXXX XXX", infix="-6VwvOkZvzuK", suffix=".description"
Run Code Online (Sandbox Code Playgroud)