1.背景
假设有这样一种情况,我们利用手机或相机拍了很多好看的照片,但是照片的命名很不规律,我们想把它统一为自己想要的风格。
在我的Linux下中,有很多我拍摄的照片,如下。
# 创建测试样本,可以使用以下命令 for name in {1..1000}; do touch 2022-04-18-yunweizeichuan-${name}-test.jpg; done
2.最小化解决办法
解决一个大问题,往往是从解决一个最小单元着手,如果想为单个文件进行重命名,可以使用mv命令,比如:
mv 2022-04-18-yunweizeichuan-1-test.jpg 2022-04-18-yunweizeichuan-1.jpg
这样执行后,就能获得我们想要的结果。
我的思路是:
1.对单个文件进行重命名2.对单个文件通过变量的形式重命名3.对多个文件通过变量的形式重命名
对单个文件进行重命名,也就是使用mv命令,那对单个文件通过变量的形式重命名,则需要用到shell字串的知识。
${变量} 返回变量值 ${#变量} 返回变量长度,字符长度 ${变量:start} 返回变量offset数值之后的字符 ${变量:start:length} 提取offset之后的length限制的字符 ${变量#word} 从变量开头删除最短匹配的word子串 ${变量##start} 从变量开头删除最长匹配的word子串 ${变量%word} 从变量结尾删除最短匹配的word子串 ${变量%%word} 从变量结尾删除最长匹配的word子串 ${变量/pattern/string} 用string代替第一个匹配的pattern ${变量//pattern/string} 用string代替所有匹配的pattern
很显然,这里会用到替换的知识,也就是"用string代替第一个匹配的pattern"。我们换种方法,采用变量的方式对文件进行重命名:
filename=`ls 2022-04-18-yunweizeichuan-2-test.jpg` mv $filename ${filename/-test/}
这里的string使用空格代替,表示2022-04-18-yunweizeichuan-2-test.jpg文件名将"-test"代替为空格,输出2022-04-18-yunweizeichuan-2.jpg
单个文件采用变量的形式重命名成功了,那如何把所有的文件都传递给变量使用呢?这里使用for循环。
for filename in `ls *test.jpg`;do echo $filename; done
这不就全部赋值给变量了吗?再结合一下单个文件变量重命名的方法:
for filename in `ls *test.jpg`;do mv $filename ${filename/-test/}; done
执行完成后,再次查看,发现所有文件都已经正确命名了。