相信大家不管是程序员还是其他行业白领人员,在使用电脑办公时,都会遇到一种需求,就是对大量名字有一定规律的文件进行重命名。
对于程序员来说,在 Linux 环境下,我们可以使用一些命令行工具就可以完成这个需求。
例如,有如下日志文件
root@linux:~/test# ls test-*
test-10.log test-1.log test-2.log test-3.log test-4.log test-5.log test-6.log test-7.log test-8.log test-9.log
我们需要将这些文件的后缀由 log 改为 txt,那么我们可以使用 rename 命令:
rename -v 's/\.log$/\.txt/' test*.log
效果如下:
其中 -v 参数作用是 打印成功重命名的文件名称,实际是输出处理的过程记录,可供我们核查重命名处理是否符合需求。's/\.log$/\.txt/' 是 Perl 正则表达式,意思是将字符串中以 .log 结尾的部分替换为 .txt。
或者可以使用 mv 命令结合 for 循环的方式去处理:
for name in `ls test*.log`; do mv $name ${name%.log}.txt ; done
命令效果如下:
在循环体里,我们使用 ${name%.log} 这种字符串处理方式,表示从 name 尾部开始删除与 .log 匹配的最小部分,并返回剩余部分;之后,再加上 .txt 后缀。通过这种操作,我们就可以将文件名后缀从 .log 改为 .txt。最后我们用 mv 命令将这个文件真正重命名。
如果我们遇到如下这些文件:
root@linux:~/test# ls test-*
test-10-0eb22520 test-2-09e36680 test-4-0b189764 test-6-0c4bd416 test-8-0d7ebb96
test-1-0949b5c6 test-3-0a7d3e36 test-5-0bb2609c test-7-0ce5454c test-9-0e189874
需要将最后一个横线 - 及其之后的字符(这里是8个字符)都去掉,那么我们需要使用 sed 结合 for 循环的方式去处理:
for file in `ls test-*`; do
newname=$(echo $file | sed 's/.\{9\}$//')
mv $file $newname
done
命令效果如下:
对于使用 Windows 系统办公的人来说,也可以使用命令工具去进行批量重命名处理。例如在 C 盘下的 test 目录下有许多 jpeg 格式的图片,
需要将文件名后缀重命名为 jpg ,我们可以打开 cmd 窗口,
cd \
cd test
ren *.jpeg *.jpg
执行后效果如下:
在 cmd 窗口,我们可以使用命令 help ren 或者 ren /? 来查看用法提示。
参考:
1 https://manpages.org/rename
2 https://blog.csdn.net/csdnnews/article/details/87927567
3 https://manpages.org/sed
PS:
本文首发于公众号: 程序熵, 更多精彩文章请点击关注 code-shang