我有一个格式如下的文件:
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)