用shell批量编码转换

来源:互联网 发布:centos 7.2安装选项 编辑:程序博客网 时间:2024/06/03 20:41

-------------------------------------文件内容转换:iconv--------------------------------------

通常,从其他平台拷贝过来(Linux)的文件,比如mac或win,打开后都是有编码错误的,尤其是中文编码。

这里主要是纯文本文件,pdf或者office文件不谈,他们只存在文件名的乱码,不存在文件内容的乱码(因为他门本来就没有编码)。 

造成的原因很简单,因为前两个系统上的文本文件都是默认gbk编码格式的,gbk是个主要为中文字体服务的编码,其中也包含英文字母和数字,因此对于中国用户来说,gbk编码就能写一切的文本了。

但是Linux平台世界统一utf8,这就麻烦了,Linux的文本编辑器或查看器都默认用utf8打开文本文件,并且午饭判断文件的原编码方式!!!(这点不懂的留言)

iconv命令

iconv命令是个很方便的文件编码转换命令:

Usage: iconv [OPTION...] [FILE...]

 主要的用法参数:
  -f, --from-code=NAME       encoding of original text
  -t, --to-code=NAME         encoding for output

所以通常-f是gbk,-t是utf8

输出的话,既可以--output也可以输出重定向‘>’到文件

但是,想要批量的修改文件编码,结合find命令和他的-exec选项是个不错的选择:

比如:find . -type f  -exec iconv {} -f gbk -t utf8 --output ./new/{} \;

就是将目录下的所有文件转化成utf8复制到新的目录下。

--------------------------------------文件名转换------------------------------------------

但是,如果想解决文件名乱码的问题(注意不是文件内容而是文件名),需要另一条命令:convmv

  从linux往windows拷贝文件或者从windows往Linux拷贝文件,有时会出现中文文件名乱码的情况,出现这种问题的原因是因为,windows的文件名 中文编码默认为GBK,而Linux中默认文件名编码为UTF8,由于编码不一致,所以导致了文件名乱码的问题,解决这个问题需要对文件名进行转码。
    在Linux中专门提供了一种工具convmv进行文件名编码的转换,可以将文件名从GBK转换成UTF-8编码,或者从UTF-8转换到GBK。

    1、先看一下你的系统上是否安装了convmv,如果没安装的话在终端输入下面的命令安装:
       sudo yum -y install convmv

    2、下面看一下convmv的具体用法:
       convmv -f 源编码 -t 新编码 [选项] 文件名
       常用参数:
          -r 递归处理子文件夹
          --notest 真正进行操作,请注意在默认情况下是不对文件进行真实操作的,而只是试验。
          --list 显示所有支持的编码
          --unescap 可以做一下转义,比如把%20变成空格
    比如我们有一个utf8编码的文件名,转换成GBK编码,命令如下:
    convmv -f UTF-8 -t GBK --notest utf8编码的文件名

    这样转换以后"utf8编码的文件名"会被转换成GBK编码(只是文件名编码的转换,文件内容不会发生变化)