日期:2014-05-16  浏览次数:20612 次

Linux下如何批量转码txt

来源:http://hi.baidu.com/curioz/blog/item/2555863514f9491d90ef390d.html

?

下载了不少文本txt,如verycd上的致纯书苑,解压看看是GBK编码。我用的Ubuntu Linux默认编码用UTF8(估计大部分Linux发行版都是),这样用grep等命令就很不方便,需要转码。

有iconv可用:

用法: iconv [选项...] [FILE...]
转换给出文件的编码从一种到另外一种.

输入/输出格式规范
-f, --from-code=NAME 原始文本编码
-t, --to-code=NAME 输出编码

信息
-l, --list 列出所有已知编码字符集

输出控制:
-c 忽略输出中的无效字符
-o, --output=FILE 输出文件
-s, --silent suppress warnings
--verbose 打印进程信息

-?, --help 显示此帮助列表
--usage 提供简短的使用信息
-V, --version 显示程序版本号

一般 iconv -c -fgbk -tutf8 XXX.txt -o XXX-u8.txt就可以了,-c选项很有用,遇到错误还可以继续而不是退出。

问题是现在文件有成千上万,试图用for循环完成这个任务:
for i in `ls *.txt` ; do iconv -c -fgbk -tutf8 $i -o u$i ;done
但事与愿违,检查了下发现是因为有写文件名带有空格,导致变量i赋值不对,比如对文件“十二楼 清 李渔.txt”,i被赋值三次,得到如下出错信息
iconv: 无法打开输入文件'十二楼': 没有该文件或目录
iconv: 无法打开输入文件'清': 没有该文件或目录
iconv: 无法打开输入文件'李渔.txt': 没有该文件或目录

研究了下,想到一个办法可以勉强完成任务,源码如下:

#! /bin/bash

# convert txt files in current dir fro gbk to utf8
# output saved to the dir `pwd`_u

PWD=`pwd`
UDIR="$PWD"_u
mkdir $UDIR
for i in `ls -l *.txt|cut -c51-120 |tr [:blank:] _` ; do
iconv -c -fgbk -tutf8 "${i//_/ }" -o "$UDIR/$i"
done

上面用到cut和tr先将空格转换,以便变量i正确赋值,调用时再通过字符替换(${i//_/ })转回来。效果是将本目录下的所有txt文件从GBK转码为UTF8的同名文件(如文件名有空格则被下划线替换),如当前目录为mydir/test/,则转换后的文件放在mydir/test_u/下面。

还没想好如何处理当前目录下的子目录,估计要用find命令,关键是先建立一个与当前目录结构相同的平行目录。如果你有好办法,请留言。

_____________________
updated in 05/13/2010
1. google了下,发现处理带空格文件名不用这么麻烦,用 for i in *.txt 就可以了,上面用for i in `ls *.txt`是画蛇添足了。(cf: http://blog.csdn.net/sabalol/archive/2009/11/12/4804607.aspx)

2. 复制目录结构用find和-exec就可实现,如在当前test目录下执行:
find . -type d -exec mkdir -p ../test_u/{} \; (cf: http://showmealone.blog.sohu.com/138666105.html)

See also:
从新浪读书下载纯文本格式书籍(附bash代码)