重命名的批量操作是我们经常会碰到的一个操作,我们利用特定的前缀或者后缀,或者连续的数字对其进行重命名,BASH命令是否可以直接做到?
或者将文件名包含某些特定部分的文件进行移动到指定的文件夹中,如何利用BASH命令直接做到呢?
rename 命令利用Perl正则表达式修改文件名,使用find rename,mv可以完成很多的操作
我们可以利用一个脚本来获取目录下的所有图像文件,并且对其进行批量的修改
#!/bin/bash
count=1; for img in *.log do new=log-$count.${img##*.} mv “$img” “$new” 2> /dev/null if [ $? -eq 0 ]; then echo “Renaming $img to $new” let count++ fi done |
我们将目录下所有的jpg和png文件重命名了,新文件名字的格式为image-1.png,image-2.png等,以此类推
我们利用了for循环对所有扩展名为jpg,png的文件进行了跌打,利用通配符进行匹配,如果不好的话,可以将.jpg改为[jJ][pP][gG]来不区分大小写
为了追踪,图像编号,我们将初始化变量count=1,下一步用于mv命令重命名文件,因此需要构建出新的文件名,${img##*.}对处于当前循环中的文件名进行解析并且获取文件扩展名
let count++在每次循环中增加了文件编号
并且利用 2> 操作符将mv命令的错误重定向到/dev/null
因为在 *.jps没有匹配到文件的时候,会将其作为一个字符串去使用,那么必然会报错,
然后我们将其进行了重定向的打印
并且在下面使用了 $? 来检验执行是否出错,如果是出错了,返回非0值,那么计数不会增加
我们还有些其他的执行重命名的操作
将 *.JPG改为 *.jpg
rename *.JPG *.jpg
将文件中的空格改为字符”_”
rename ‘s/ / _/g’ *
转换文件的大小写
rename ‘y/A-Z/a-z/’ *
rename ‘y/a-z/A-Z/’ *
将所有的文件移入给定的目录,可以使用
find path -type f -name “*.mp3” -exec mv{} target_dir \;
find path -type f -exec rename ‘s/ / -/g’ {} \;