重命名的批量操作是我们经常会碰到的一个操作,我们利用特定的前缀或者后缀,或者连续的数字对其进行重命名,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’ {} \;

发表评论

邮箱地址不会被公开。 必填项已用*标注