zoukankan      html  css  js  c++  java
  • Linux下如何批量转码iconv

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

  • 相关阅读:
    【leetcode】二叉搜索树的最近公共祖先
    052-12
    052-11
    052-10
    052-9
    052-8
    052-6
    052-5
    052-3
    052-2
  • 原文地址:https://www.cnblogs.com/google4y/p/3392852.html
Copyright © 2011-2022 走看看