您的位置:首页 > 运维架构 > Linux

Linux中如何批量截短文件名

2017-01-24 16:03 197 查看
iamlaosong文

工作中需要批量将一批文件名改短,改短部分为随机按时间生成的,没什么规律,无法简单的用rename命令修改,那个什么正则表达式又不会写,幸好在网上找到一种方法,成功的用脚本实现了文件名截短。

原文件名如下:

20170101_340000_1_HK_BCF_201701122132_2060.txt

20170101_340000_1_LY_BCF_201701122132_2059.txt

20170101_340000_1_NBCLCK_BCF_201701122132_2064.txt

20170101_340000_1_NBCLJK_BCF_201701122132_2063.txt

20170101_340000_1_TD_BCF_201701122132_2061.txt

20170101_340000_1_ZY_BCF_201701122132_2062.txt

要求将BCF后面的都截掉,保留.txt既可,shell脚本如下:

for file in *.txt
do
short=${file%BCF*.txt}
echo ${short}BCF.txt
mv ${file} ${short}BCF.txt
done
执行结果如下:

20170101_340000_1_HK_BCF.txt

20170101_340000_1_LY_BCF.txt

20170101_340000_1_NBCLCK_BCF.txt

20170101_340000_1_NBCLJK_BCF.txt

20170101_340000_1_TD_BCF.txt

20170101_340000_1_ZY_BCF.txt

为了保持文件名的一致性,需要将其中部分文件名中的NBCL去掉,这可以用rename命令完成,即:

rename _NBCL _ *BCF.txt

执行结果如下:

20170101_340000_1_HK_BCF.txt

20170101_340000_1_LY_BCF.txt

20170101_340000_1_CK_BCF.txt

20170101_340000_1_JK_BCF.txt

20170101_340000_1_TD_BCF.txt

20170101_340000_1_ZY_BCF.txt

========================================

很好的方法吧,注意其中通配符的用法,其实关键就在于参数替换的运用,下面总结一下:

${param:-default}如果param为空,整个式子的值就等于default
${#param}整个式子的值为param的长度
${param%word}从param尾部开始删除与word匹配的最小部分,返回剩余部分
${param%%word}从param尾部开始删除与word匹配的最长部分,返回剩余部分
${param#word}从param头部开始删除与word匹配的最小部分,返回剩余部分
${param##word}从param头部开始删除与word匹配的最长部分,返回剩余部分
所谓最小部分就是第一次匹配,而最长部分就是最后一次匹配,例如:

假定aa=iamlaosongsongdc

则echo ${aa%song*} 显示:iamlaosong

而echo ${aa%%song*} 显示:iamlao
如果不用通配符,echo ${aa%%song} 显示:iamlaosongsongdc,因为没有匹配上。

再补充几个用法

${param:=bar}检查param是否为空,若不为空,则返回其值;否则将param赋值为bar,然后返回这个值
${param:?bar}若param为空或不存在,则输出param:bar并异常终止脚本
${param:+bar}param存在且不为空的情况下才返回param,否则返回空(貌似bar在这里没用)
${param:m:n}从param左起第m个字符开始(0表示第一个),向后取n个字符,如省略n,则取其后所有字符
${param:0-m:n}从param右起第m个字符开始(0-m相当于负值),向后取n个字符,如省略n,则取其后所有字符
${param:m}从param左起第m个字符开始(0表示第一个),向后取所有字符
参见:点击打开链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux