来源: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. java正则表达式 3 -- 查找

    用正则表达式执行查找命令,则需要用正则对象,其规则和执行顺序如下: 指定为字符串的正则表达式必须首先被便以为此类的实例.然后,可将得到的正则对象匹配任意的字符串用于创建Mather对象,执行匹配所涉及 ...

  2. 会话描述协议(SDP)介绍

    1.SDP的引入 SDP最初用于Mbone(组播骨干网)上的多媒体会议.Mbone 是Internet 的一部分,它的主要特征是对IP组播技术的使用.IP组播技术比较适合实现多方会话. 基于组播的会议 ...

  3. [转] UnityVS(Visual Studio Tools For Unity)的安装与使用

    一些废话 Unity 的开发者们,尤其是微软系的Unity开发者们,用Mono是不是烦死了?你是不是跟我一样,用vs来写代码,用Mono来跟踪调试?好麻烦啊好麻烦. 也许你会说,傻逼你不会用Unity ...

  4. Redis数据类型及操作详解

    Redis数据库,是nosql的一种.与传统关系型数据库(如mysql.sqlserver等)相比,他在处理大数据量上相当有优势,扩展性和可用性高,这是传统型数据库所达不到的. Redis是一个key ...

  5. [bzoj4860] [BeiJing2017]树的难题

    Description 给你一棵 n 个点的无根树.树上的每条边具有颜色. 一共有 m 种颜色,编号为 1 到 m.第 i 种颜色的权值为 ci.对于一条树上的简单路径,路径上经过的所有边按顺序组成一 ...

  6. [51nod1791] 合法括号子段 DP

    ---题面--- 题解: 首先我们需要发现一个性质,在括号序列不变的情况下,括号匹配是不会变的,因此不论子串怎么取,括号匹配的关系是不会变化的.这是一个很容易发现的性质,然而我太弱,没发现. 于是可以 ...

  7. [Leetcode] Remove duplicates from sorted list 从已排序的链表中删除重复元素

    Given a sorted linked list, delete all duplicates such that each element appear only once. For examp ...

  8. 洛谷 P1268 树的重量 解题报告

    P1268 树的重量 题目描述 树可以用来表示物种之间的进化关系.一棵"进化树"是一个带边权的树,其叶节点表示一个物种,两个叶节点之间的距离表示两个物种的差异.现在,一个重要的问题 ...

  9. makefile使用笔记(一)入门

    By francis_hao    Mar 2,2017 makefile makefile一个很简单的例子如下,该实例完成在执行make时,将main.c编译成可执行文件main的功能. 各项的含义 ...

  10. 移动端H5滚动穿透解决方案

    最近遇到一个很 巨恶心的问题  ios10下面 页面弹窗有滚动穿透问题 各种google 终于找到了答案,但是体验还不是很好,基本能忍受 废话不多说,上方法 最后终于想到一个处理方案,就是第一种方案的 ...