Linux 中文乱码文件批量重命名

xiyoukeke 2012-02-05

借助 find 命令,获取文件的索引编号,Linux下每个文件都有一个编号, 通过 ls -i  可以同时列出文件名和索引编号,

比如,下载了一个壁纸包,里面的壁纸都是乱码,在windows下应该是正常的。

ls-i一下,可以看到:

查看到的文件有乱码,输出的每一行有一个index编号,就是每一个linux下文件都有的编号。现在用awk来构造新的名字,去掉其中的乱码字符只留下数字:

ls-i|awk'{gsub(/[\(\)]/,"",$3);print$3}'

#注:这里$0是整个索引编号加文件名,而$1就是索引编号,$2为中文乱码名,我猜想中文名中有空格,如果你的中文乱码不是这里的,就要做相应的修改,可以自己定义一个变量i,然后i++即可!$3为括号加数字,这里我用gsub过滤掉所有括号,只留下数字,现在看看打印出来的效果!

太长了就省略掉其他部分

现在利用find重命名功能:

比如知道一个文件的索引编号,可以这样写:

find.-inum492635-execmv{}newfilename\;

find命令网络上很多,点号表示当前目录,find.-inum后跟你需要重命名的索引编号,因为这个编号是唯一的,所以只会查出来一个文件,不会有多个文件重复问题,后面的-exec表示找到文件后,执行的命令,这里执行shell的mv,移动命令,{}代表找出来的文件名,然后是你需要重命名的新文件名,最后是\;前面有一个空格。

现在用awk来批量构造出这一个命令吧!

ls-i|awk'{gsub(/[\(\)]/,"",$3);print"find.-inum",$1,"-execmv{}",$3,"\;"}'

注意:截图中漏掉了find.后面那个横杠一定要有!

awk已经构造出了每一个文件重命名的语句,现在只需要把这条语句再通过管道转接给shell就可以搞定啦!直接在后面加上|sh即可!

ls-i|awk'{gsub(/[\(\)]/,"",$3);print"find.-inum",$1,"-execmv{}",$3,"\;"}'|sh

运行,然后ls一下看看。

ok,现在所有文件都正常了,而且,没有搞乱原来的顺序哦,因为原来的编号还在,

当然有些文件是没有编号的,而且是不可以直接分割出来编号的,这个时候,可以通过自定义一个变量i或者使用awk内部变量NR(当前处理的行号)来实现。

比如:

ls-i|awk'{printf("find.-inum%s-execmv{}%03d.jpg\;\n",$1,NR)}'

或者使用

ls-i|awk'{printf("find.-inum%s-execmv{}%03d.jpg\;\n",$1,++i)}'

效果一样,注意,awk使用变量无须定义,直接++i,awk会自动将i初始化为0,这样++i第一行得到的是1,

后面跟随的是文件扩展名jpg,如果你的文件扩展名是不固定的,可以利用gsub提取出扩展名然后追加上去,效果一样,最后来一条通用的批量重命名:

文件名宽度是三位数字,不足的前补0.

ls-i|awk'{filename=$0;gsub(/.+\./,"",filename);printf("find.-inum%s-execmv{}%03d.%s\;\n",$1,NR,filename)}'

这句命令的意思,把$0即整个文件名和索引编号,赋值给filename,然后通过gsub过滤掉.号之前的任意字符,即filename只剩下扩展名,当然如果有多个扩展名的话,比如,.tar.gz这类,就需要小心了。

看到生成的语句都很正常,下一步只需要添加|sh就可以完成命令功能了!

ls-i|awk'{filename=$0;gsub(/.+\./,"",filename);printf("find.-inum%s-execmv{}%03d.%s\;\n",$1,NR,filename)}'|sh

相关推荐