`
clark1231
  • 浏览: 247084 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

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

阅读更多

借助 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 . -inum 492635 -exec mv {} newfilename \; 

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

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

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

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


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

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


运行,然后ls一下看看。



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

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

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





或者使用 

ls -i | awk '{printf("find . -inum %s -exec mv {} %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 -exec mv {} %03d.%s \;\n", $1, NR, filename)}' 


这句命令的意思,把 $0 即整个文件名和索引编号,赋值给 filename , 然后通过 gsub过滤掉.号之前的任意字符,即filename只剩下扩展名,当然如果有多个扩展名的话,比如,.tar.gz 这类,就需要小心了。
看到生成的语句都很正常,下一步只需要添加  | sh  就可以完成命令功能了!
ls -i | awk '{filename=$0; gsub(/.+\./,"", filename); printf("find . -inum %s -exec mv {} %03d.%s \;\n", $1, NR, filename)}'  | sh
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics