如何在Bash中获取文件名的通配符部分

时间:2013-12-18 21:42:56

标签: bash

这个问题可能已经被问过了,但我不知道怎么说得好。我是bash脚本的新手......

假设我在目录中有一堆文件,其名称如下:

file1_pre.ext
file2_pre.ext
file3_pre.ext
different_tmp.ext

我可以使用通配符来过滤感兴趣的文件:

for f in *_pre.ext
do
   echo $f
done

但是我如何解析/提取前缀以便我可以将字符串file1file2等用作其他内容的文件名?

1 个答案:

答案 0 :(得分:3)

${f%_pre.ext}将扩展为f的值,并删除最终_pre.ext

使用${varname<SomeOperator>args}进行参数扩展时,可以执行多种字符串操作。 %运算符删除尾随字符串。它需要一个通配符参数,因此您可以执行${f%_*}之类的操作来删除下划线后的所有内容。如果你将%翻倍,就像${f%%_*}一样,它会删除最长的匹配,所以你会在第一个下划线后杀死所有内容。单%执行最短匹配,因此它会删除 last 下划线后的所有内容。使用%_pre.ext因为我们正在寻找完全匹配,所以它没有什么区别。

###运算符类似于%%%,但是在字符串的开头而不是结尾处工作。

另一个常用示例是:-运算符,如果变量为空,则替换默认值。

另外,没有运算符的${foo}是写$foo的另一种方式,但是当你想在变量的值之后立即放置一些文本时,它可以帮助你:

echo $foobar   # oops, looks for variable called "foobar"
echo ${foo}bar # the value of variable "foo" then literal "bar"

有关完整列表,请参阅任何shell手册页的“参数扩展”部分。