来源: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的更多相关文章

  1. linux下怎样批量更改文件后缀名

    今天又有同学问linux下怎样批量更改文件后缀名,这个问题被别人问到三次了,所以这里给出几个解决方法 一.rename解决 1.  Ubuntu系统下 rename 's//.c//.h/'  ./* ...

  2. linux下如何批量杀JAVA进程或某个进程方法

    linux下如何批量杀JAVA进程或某个进程方法 在工作中经常需要停止JAVA进程,停止时间也比较长,那么有时候因为一些情况,需要把 linux 下JAVA所有进程 kill 掉,又不能用killal ...

  3. linux下获取软件源码包 centos/redhat, debian/ubuntu

    linux下获取软件源码包 centos/redhat, debian/ubuntu centos下: 1. yum install yum-utils 主要为了获取yumdownloader 2. ...

  4. Linux下编译Qt源码,一定要下载tar.gz版本,否则会报权限不足

    首先下载qt-everywhere-opensource-src-4.8.1源码,下载地址: ftp://ftp.qt-project.org/qt/source/ 在Linux下编译一定要下载qt- ...

  5. linux下sed批量替换文件内容

    在linux超级终端下编辑文档是件比较麻烦的事情,下面简单介绍一下如何在linux下批量替换文件内容 linuxsed 批量替换多个文件中的字符串 格式: sed -i "s/查找字段/替换 ...

  6. Linux下编译安装源码包软件 configure ,make, make install, make test/check, make clean

    http://www.360doc7.net/wxarticlenew/541275971.html 一.什么是源码包软件? 顾名思义,源码包就是源代码的可见的软件包,基于Linux和BSD系统的软件 ...

  7. Windows,linux下编译qt源码(比较简单)

    一.linux下静态编译qt源码 1.取到qt源码并解压到文件夹 2.cd到qt目录下 3.使用configure生成makefile ./configure–prefix /opt/qtstatic ...

  8. Linux下编译安装源码包软件 configure ,make, make install, make test/check, make clean 假目标

    http://www.360doc7.net/wxarticlenew/541275971.html 一.程序的组成部分 Linux下程序大都是由以下几部分组成: 二进制文件:也就是可以运行的程序文件 ...

  9. (转)linux下如何批量杀JAVA进程或某个进程方法

    在工作中经常需要停止JAVA进程,停止时间也比较长,那么有时候因为一些情况,需要把 linux 下JAVA所有进程 kill 掉,又不能用killall 直接杀掉某一进程名称包含的所有运行中进程(我们 ...

随机推荐

  1. 微信小程序—setTimeOut定时器的坑

    原文地址: http://fanjiajia.cn/2018/06/27/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F%E2%80%94setTimeOu ...

  2. el-table中操作一栏怎么根据当前行的信息显示编辑、删除、编辑完成按钮

    对每个按钮是否显示,使用v-show绑定变量,因为每一行的v-show绑定的变量必须是唯一的(不然的话操作此行,其他行的状态也会跟着变化),所以不可能提前在.ts中对变量进行初始化,只能使用本行的字段 ...

  3. 从pthread 到QThread

    该文出自:http://www.civilnet.cn/bbs/topicno/78430 使用线程技术进行应用编程的意义在gemfield的文章<从进程到线程>中已经介绍过了,我们就直奔 ...

  4. feof问题

    feof()函数是我们C语言中操作文件常见的函数,也是我们最容易出错的函数 这个函数用来表示文件指针是否已经到了文件末尾的下一个位置.这个函数是通用的 可以用在文本文件和二进制文件 (EOF是文件结束 ...

  5. jloi2017(shoi2017?)六省联考酱油记

    Day -n 听说了4.22.4.23的省选,而且还是六省联考. 压力山大. 尽管我只是一名高一的simple OIer,在省选到来之前,心里还是很紧张的. 毕竟自己也知道南方dalao们都是神犇,像 ...

  6. Luogu3953 NOIP2017逛公园(最短路+拓扑排序+动态规划)

    跑一遍dij根据最短路DAG进行拓扑排序,按拓扑序dp即可.wa了三发感觉非常凉. #include<iostream> #include<cstdio> #include&l ...

  7. 【题解】[USACO12JAN]视频游戏的连击Video Game Combos

    好久没有写博客了,好惭愧啊……虽然这是一道弱题但还是写一下吧. 这道题目的思路应该说是很容易形成:字符串+最大值?自然联想到学过的AC自动机与DP.对于给定的字符串建立出AC自动机,dp状态dp[i] ...

  8. [BZOJ2090/2089] [Poi2010]Monotonicity 2/Monotonicity 树状数组优化dp

    这个dp乍看不科学,仔细一看更不科学,所以作为一个执着BOY,我决定要造数据卡死波兰人民,但是我造着造着就......证出来了......... 这个就是把 < > =分开讨论每次找到f[ ...

  9. 【bzoj3224】Tyvj 1728 普通平衡树 01Trie姿势+平衡树的四种姿势 :splay,旋转Treap,非旋转Treap,替罪羊树

    直接上代码 正所谓 人傻自带大常数 平衡树的几种姿势:  AVL Red&Black_Tree 码量爆炸,不常用:SBT 出于各种原因,不常用. 常用: Treap 旋转 基于旋转操作和随机数 ...

  10. 原生ajax方法封装

    /** * @function ajax request * @fields ajaxName:请求名称,method:请求方法,headers:setRequestHeader自定义部分,url:接 ...