Linux下如何批量转码iconv

摘要:
我使用的Ubuntu Linux的默认编码是UTF8,这使得使用grep和其他命令很不方便,并且需要代码转换--帮助显示此帮助列表--用法提供简短的使用信息--V。--版本显示程序版本号。通常,iconv-c-fgbk-tutf8XXX.txt-oXXX-u8.txt就足够了。-c选项非常有用。如果遇到错误/bin/bash#convertxtfilesincurrentdirfrogbtout8#outputsavedtothedir`pwd`_uPWD=`pwd `UDIR=“$pwd”_umkdir$UDIRforiin`ls-l*,您可以继续而不退出。txt|cut-c51-120|tr[:空白:]_`;Doiconv-c-fgbk-tutf8“${i//_/}”-o“$UDIR/$i”done首先使用cut和tr转换空格,以便变量i可以正确赋值,然后在调用时通过字符替换切换回来。

来源: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)

免责声明:文章转载自《Linux下如何批量转码iconv》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Requests库详解Thymeleaf 模板的使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

linux定时任务cron 安装配置

名词解释: cron是服务名称,crond是后台进程,crontab则是定制好的计划任务表。 软件包安装: 要使用cron服务,先要安装vixie-cron软件包和crontabs软件包,两个软件包作用如下: vixie-cron软件包是cron的主程序。crontabs软件包是用来安装、卸装、或列举用来驱动 cron 守护进程的表格的程序。查看是否安装了...

深信服EDR远程命令执行复现

先用fofa找到一个有漏洞的链接 body="终端检测响应平台" 漏洞利用 https://xxx.xxx.xx.xx/tool/log/c.php?strip_slashes=system&host=id 修改id值为执行的命令 使用whoami查询当前用户权限 使用pwd查询当前所在目录   查看当前目录有哪些文件或目录  ...

linux处理僵尸进程

由来 在linux下,如果一个进程终止,内核会释放该进程使用的所有存储区,关闭所有文件句柄等,但是,内核会为每个终止子进程保留一定量的信息。这些信息至少包括进程ID,进程的终止状态,以及该进程使用的CPU时间。当终止子进程的父进程调用wait或waitpid时就可以得到这些信息 僵尸进程指:一个进程退出后,而其父进程并没有为它收尸(调用wait或waitp...

linux下jcmd无法获取jvmdump

现象: 前两天在linux上的服务出现莫名其妙的内存溢出.却发现无法用jcmd连接jvm获取dump.现象: [root@host-12.131.14.15 bin]# ./jcmd 19652 GC.heap_dump  19652: com.sun.tools.attach.AttachNotSupportedException: Unable to...

linux下tomcat无法访问问题(换一种说法:无法访问8080端口)

有时候linux下的tomcat其他机器无法访问,比如主机无法访问linux虚拟机的tomcat,这是因为tocat的端口,linux没有对外开放,所以只能localhost访问,但是别的机器访问不了;解决方法如下 编辑linux的iptables文件:vi /etc/sysconfig/iptables 复制一句:已经开放22端口的命令改为8080就好:...

Linux 下安装 MATLAB

MATLAB是美国MathWorks公司出品的商业数学软件,主要用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,是一款优秀而又强大的数学软件。 本文基于 Deepin 15.5 进行 MATLAB2016b 的安装,其他操作系统及 MATLAB 版本类似。 一、下载“Crack”和”ISO”文件 下载地址如下所示:http:/...