一:Rename命令
rename命令用字符串替换的方式批量改变文件名。rename命令有两个版本,一个是c语言版本的,一个是perl语言版本的,判断方法:
vim `which rename`
- C语言版本的是一个二进制文件,打开后是乱码。
- perl语言的你会明显看到 #!/usr/bin/perl -w
两种版本的使用方法有差别,如下:
- C语言版本格式:rename 原字符串 新字符串 文件名
- Perl语言版本格式:rename 's/原字符串/新字符串/' 文件名
参数解读:
- 原字符串:文件名需要替换的字符串
- 新字符串:将文件名中含有的原字符替换成新字符串
- 文件名: 匹配要替换的文件
Perl 语言版本支持正则表达式,使用方法如下:
- 字母的替换rename "s/AA/aa/" * 把文件名中的AA替换成aa
- 修改文件的后缀rename "s//.py//.sh/" * 把.py 后缀的改成 .sh后缀
- 批量添加文件后缀rename "s/$//.sh/" * //把所有的文件名都以.sh结尾
- 批量删除文件名rename "s//.sh//" * //把所有以.sh结尾的文件名的.sh删掉
二:mv 命令结合while循环
在文件夹shell下创建10个文件,touch test_{1..10}.txt
现在有个需求是将刚刚创建的10个文件的文件名中的 "_ " 改为 “-“,修改命令如下:
find ./ -name "*_*" | while read filename; do mv $filename ${filename/_/-}; done
以上命令的逻辑是,先用find 命令找出含有 “_” 的文件,然后通过管道发给while 进行循环更改。 ${filename/_/-} 是linux shell 中 ${ } 的用法。
${ }用于变量替换,一般情况下,$var 与${var} 并没有啥不一样。但是用 ${ } 会比较精确的界定变量名称的范围。但是${ }的功能远不止于此,非常强大!用法如下:
- 最短左删除:${变量#关键词} 若变量内容从头部开始的数据符合【关键词】,则将符合的最短数据删除。
- 最长左删除:${变量##关键词} 若变量内容从头部开始的数据符合【关键词】,则将符合的最长数据删除。
- 最短右删除:${变量%关键词} 若变量内容从尾向前的数据符合【关键词】,则将符合的最短数据删除。
- 最长左删除:${变量%%关键词} 若变量内容从尾向前的数据符合【关键词】,则将符合的最长数据删除。
- 首次替换:${变量/旧字符串/新字符串} 将字符串【变量】中的第一个【旧字符串】替换为【新字符串】。
- 全部替换:${变量//旧字符串/新字符串} 将字符串【变量】中的所有出现的【旧字符串】全部替换为【新字符串】.