平时整理照片、下载文件或者处理项目文档时,总会遇到一堆名字乱七八糟的文件。一个个手动改名太费时间,这时候用shell命令批量重命名就能省下大把功夫。
基础rename命令
Linux和macOS系统中,rename命令是批量处理文件名的利器。比如你从相机导出了一堆照片,名字全是DCIM_001.jpg、DCIM_002.jpg这种,想改成vacation_001.jpg这样更直观的:
rename 's/DCIM/vacation/' *.jpg
这条命令的意思是:把当前目录下所有以.jpg结尾的文件,把文件名中的“DCIM”替换成“vacation”。
统一添加前缀或后缀
有时候需要给一组配置文件统一加个备份标记,比如把app.conf、db.conf都改成app.conf.bak:
rename '$.=".bak"' *.conf
这行代码会在所有.conf文件名末尾加上.bak。反过来,如果想在前面加前缀,比如给所有脚本加一个“old_”表示旧版本:
rename 's/^/old_/' *.sh
去掉空格或特殊字符
从Windows复制过来的文件常带空格或括号,放在脚本里容易出错。可以用rename把空格换成下划线:
rename 's/ /_/g' *.*
这里的g表示全局替换,避免只替换第一个空格。如果还想删掉括号:
rename 's/[()]//g' *.mp4
数字编号重命名
下载的系列教程可能叫lesson1.mp4、lessona.mp4、lessonb.mp4,顺序混乱。可以先按字母排序再重命名成标准数字格式:
i=1; for file in lesson*.mp4; do mv "$file" "lesson$(printf '%03d' $i).mp4"; i=$((i+1)); done
这段shell循环会把匹配的文件依次重命名为lesson001.mp4、lesson002.mp4……%03d确保数字三位对齐,排序不会乱。
小心使用,先预览再操作
rename功能强大,但一旦写错正则表达式可能误伤文件。建议先用echo模拟一下效果:
for file in *.txt; do echo rename "$file" to "new_$file"; done
确认输出是你想要的结果,再去掉echo执行真实命令。
掌握这几个shell技巧,以后面对几十上百个文件也不用手忙脚乱了。几分钟搞定的事,没必要拖半天。