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脚本如下:
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
========================================
很好的方法吧,注意其中通配符的用法,其实关键就在于参数替换的运用,下面总结一下:
所谓最小部分就是第一次匹配,而最长部分就是最后一次匹配,例如:
假定aa=iamlaosongsongdc
则echo ${aa%song*} 显示:iamlaosong
而echo ${aa%%song*} 显示:iamlao
如果不用通配符,echo ${aa%%song} 显示:iamlaosongsongdc,因为没有匹配上。
再补充几个用法
参见:点击打开链接
工作中需要批量将一批文件名改短,改短部分为随机按时间生成的,没什么规律,无法简单的用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中如何批量截短文件名?
- linux -- 批量重命名文件名
- linux下如何批量创建用户
- Linux 下如何复制文件并修改文件名添加当前时间在里面
- Linux系统如何显示中文目录和文件名
- Linux下如何获取当前可执行文件的文件名
- windows的BAT或者linux的VI下批量更改替换文件名的脚本
- Linux下批量更改文件名
- linux下面如何将文件编码批量转化
- Linux如何查找某种格式的文件或文件名中包括什么字符的文件
- Linux 系统批量管理工具介绍,如何实现对一万台服务器的同时批量管理?
- linux下如何删除文件名是乱码的文件
- 如何批量或者全部删除Linux的系统邮件?
- linux 批量命名乱码文件名
- 在linux下批量更改目录下的所有文件名
- 如何批量复制文件名
- 如何让Linux Apache支持中文文件名访问?
- Linux如何批量检测端口连通性、端口是否开放
- Linux中如何批量注释和反注释?
- Linux 下当前可执行文件如何获取自身文件名与全路径<转>