convmv - converts filenames from one encoding to another
将文件名由一种编码转换为另一种编码
apt-get install convmv
新的linux系统通常由原来的gbk编码转而支持utf8编码,可用如下命令转换
convmv -f GBK -t utf8 --notest *
命令的用法与 iconv(1)(*) 类似。
-f ENCODING
specify the current encoding of the filename(s) from which should be converted 原文件的文件名编码
-t ENCODING
specify the encoding to which the filename(s) should be converted 目标文件的文件名编码
-r
recursively go through directories 递归地处理子目录
--list
list all available encodings. To get support for more Chinese or Japanese encodings install the Perl HanExtra or JIS2K Encode packages. 列出已知的编码。要支持更多的中文或日文编码,安装 Perl-HanExtra
--nosmart
by default convmv will detect if a filename is already UTF8 encoded and will skip this file if conversion from some charset to UTF8 should be performed. --nosmart will also force conversion to UTF-8 for such files, which might result in ``double encoded UTF-8'' (see section below). 如果文件名已经是 utf-8 那么 convmv 会自动探测出来,不做处理,但是如果不想让 convmv 自动探测,就使用这个选项
--help
print a short summary of available options 输出帮助信息
设想这样的场景
1. 你以前用过 redhat 9 甚至更老的系统,你的系统中默认编码是 gb2312,你的文件名有不少是中文的。然后你跟随 fedora 的脚步,升级到了最新的 fedora core,默认编码是 utf8。你发现过去留下来那些文件的文件名都变成了乱码,或者“非法的 utf-8 序列”
2. 你全新安装了最新的 fedora core 3 系统,然后按照网上各种各样的说法,在安装 fcitx 的时候把默认编码从 utf8 改成了 gb2312 或者 gbk 甚至是 gb18030,这种改动真的是非常简单,并且在 mount 的时候要多一句 mount -o iocharset=cp936 (命令行真是长得太过分了)。然后突然有一天,你不得不换用其他语言登录系统。和上面一样,所有中文的文件名都变成了“非法的 utf-8 序列”
3. 你用着 utf-8 默认编码。然后,你开了一个 ftp,让大家上传些东西;或者你用着古老的 samba 2.x 版本。你会发现别人上传的文件名是中文的文件都变成了问号。还有,如果不是用版上那位可敬的同志修改的 gftp 下载文件,那么下载到的东西凡是中文文件名就都不可识别了,“非法的 utf-8 序列”
convmv is meant to help convert a single filename, a directory tree and the contained files or a whole filesystem into a different encoding. It just converts the filenames, not the content of the files. A special feature of convmv is that it also takes care of symlinks, also converts the symlink target pointer in case the symlink target is being converted, too.
convmv 可以处理单个文件,某个目录树以及其中的文件,甚至整个文件系统,将其中的文件名和目录名转为另一种编码。它只对文件名进行操作,而不修改文件内容。它会正确处理链接,将链接目标指向转换后的文件。如果某个目录中只有一部分文件名是 utf-8,而另外一部分是传统的编码, convmv 也可以处理这种情况——它会自动判断编码类型,只转换需要的那一些。
如果某些文件名已经是 utf-8 编码了,你却禁止 convmv 自动判断编码类型,导致这些文件名也被转换了一次,那么可以用 convmv 来将它们恢复原状,只要将 -f 和 -t 反过来用就可以了。
--qfrom 选项十分有用,它的意思是处理过程中不要输出原文件名。因为这些文件名在你当前的终端中是乱码,它会把终端搞得一团糟。
参见 locale(1) utf-8(7) charsets(7)
作者 Bjoern JACKE (Send mail to bjoern [at] j3e.de for bug reports and suggestions.)
(*)
iconv(1) 用于将一个文件的内容由一种编码转换为另一种编码,例如,假如某个文档 input.txt 是从 windows 中编辑的,是 gb2312 编码。在默认编码为 utf8 的 fc3 环境中,如果使用 gedit 打开,那么 gedit 会自动识别;但是如果使用 vi 打开,那么就会看到乱码了,这时候就应该先用 iconv 来将文件转码再打开。-f 是 from,是原文件的编码;-t 是 to,是转换目标文件的编码;-o 是输出文件名,注意千万不要输出到原文件里
代码:
iconv -f gb2312 -t utf8 input.txt -o output.txt
这时用 vi output.txt 就可以顺利打开了
阅读(1690) | 评论(0) | 转发(0) |