4. 重命名
场景 :需要把某个目录下的文件进行重命名。
首先生成一批后缀为 jpg 的文件:
touch ustc-{1..6}.jpg
4.1. mv
1for f in /data6/fong/shell/*.jpg
2do
3 echo $f
4 mv $f ${f}-new
5done
或者写成一行:
for f in /data6/fong/shell/*.jpg; do mv $f ${f}-new; done
mv $f ${f}-new
在文件名后面加了 -new
。
4.2. awk
ls *.jpg | awk -F "jpg" '{print "mv " $0,$1"JPG"}' | bash
awk -F "jpg"
将文件名进行切分,分隔符是 jpg
;$0
表示原字符串,$1
是分割后的第一段字符串。
fong@GK40:/data6/fong/shell$ ls *.jpg | awk -F "jpg" '{print $0,$1"JPG"}'
ustc-1.jpg ustc-1.JPG
ustc-2.jpg ustc-2.JPG
ustc-3.jpg ustc-3.JPG
ustc-4.jpg ustc-4.JPG
ustc-5.jpg ustc-5.JPG
ustc-6.jpg ustc-6.JPG
4.3. rename
man rename
可以查看使用手册,这里使用 perl 版本的正则表达式。
rename [ -v ] [ -n ] [ -f ] perlexpr [ files ]
参数:
- -v
显示修改成功的文件名;
- -n
不执行任何操作,用来测试 rename 过程,并不直接运行,可以查看测试效果后,然后再运行;
- -f
强制修改,会覆盖存在的文件。
小写转换成大写:
fong@GK40:/data6/fong/shell$ rename -n 'y/a-z/A-Z/' *.jpg
rename(ustc-1.jpg, USTC-1.JPG)
rename(ustc-2.jpg, USTC-2.JPG)
rename(ustc-3.jpg, USTC-3.JPG)
rename(ustc-4.jpg, USTC-4.JPG)
rename(ustc-5.jpg, USTC-5.JPG)
rename(ustc-6.jpg, USTC-6.JPG)
后缀从 .jpg 改成 .JPG:
fong@GK40:/data6/fong/shell$ rename -n 's/\.jpg/.JPG/g' *.jpg
rename(ustc-1.jpg, ustc-1.JPG)
rename(ustc-2.jpg, ustc-2.JPG)
rename(ustc-3.jpg, ustc-3.JPG)
rename(ustc-4.jpg, ustc-4.JPG)
rename(ustc-5.jpg, ustc-5.JPG)
rename(ustc-6.jpg, ustc-6.JPG)
s
表示替换,g
表示替换行内所有匹配到的字符串,去掉 g
则只替换匹配到的第一个字符串。
注意:\.
是对 .
的转义,.
在正则中会匹配任意一个字符。
错误的结果:
fong@GK40:/data6/fong/shell$ rename -n 's/.jpg/.JPG/' ustcjpg.jpg
rename(ustcjpg.jpg, ust.JPG.jpg)
fong@GK40:/data6/fong/shell$ rename -n 's/.jpg/.JPG/g' ustcjpg.jpg
rename(ustcjpg.jpg, ust.JPG.JPG)