LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1152|回复: 9

求一脚本:把某一文件夹(含多层子文件夹)下所有的文件名后缀为.txt的非gbk编码的文档转

[复制链接]
发表于 2005-3-9 21:44:38 | 显示全部楼层 |阅读模式
谢谢各位高人相助先……
:thank  :thank  :thank  :thank  :thank
发表于 2005-3-9 22:30:41 | 显示全部楼层
改名这点容易做到,但怎么检测文档编码应该怎么做?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-9 22:34:23 | 显示全部楼层
就是感觉有难度,才请教高人的啊,请DX们再想想办法啊……
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-12 14:30:00 | 显示全部楼层
降低一下问题的难度,假定文件夹及子多层文件夹下所有的后缀名为.txt的文本文件编码都是UTF-8.
转换单个文件的命令如下:

  1. mkdir temp
  2. iconv file_name.txt -f=UTF-8 -t=GBK -o temp/file_name.txt
复制代码

但是如何遍历整个文件夹(含多层子目录),并进行依此转换,最后删除旧文件,并把新产生的文件移动到原由文件位置,最后清除临时目录temp。
请兄弟们再帮忙想想……给个思路也好啊?!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-12 17:35:03 | 显示全部楼层
Post by kiron
改名这点容易做到,但怎么检测文档编码应该怎么做?


我想到一个检测文件编码的办法:
最简单的一个命令==》file
进行如下测试:
建立了一个大尺寸、多行的一个UTF-8编码的test1.txt,
使用iconv命令转换为GBK编码的test2.txt,
直接建立一个GBK编码的test3.txt

  1. file test1.txt
  2. test1.txt: UTF-8 Unicode text

  3. file test2.txt
  4. test2.txt: ISO-8859 C++ program text, with very long lines

  5. file test3.txt
  6. test3.txt: ISO-8859 text
复制代码


不知道为什么,file命令始终无法确认我的GBK编码格式。
可是iconv -l | grep GBK没有问题。
我的locale全部是zh_CN.gbk
回复 支持 反对

使用道具 举报

发表于 2005-3-12 18:51:09 | 显示全部楼层
我想的思路是:将脚本名命名为change
ls *.txt列出当前目录下所有的.txt文件用for对其处理,
处理的步骤包括了检测是否为gbk格式,是则忽略继续循环,不是则对其转换。
再用ls -l|grep '^d'|awk '{print $NF}'查出当前目录下的所有子目录并用for对其处理
处理的步骤比较简单,进入该子目录并调用脚本本身,即change对本目录进行处理
处理完毕就退出脚本。

这样写的脚本运行应该比较缓慢,因为用了递归的思想。

重点就在于:如何检测文件的编码?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-12 19:28:46 | 显示全部楼层
Post by kiron

重点就在于:如何检测文件的编码?

斑竹大人哦,检测编码不能用file么??
回复 支持 反对

使用道具 举报

发表于 2005-3-12 20:35:14 | 显示全部楼层
file的思想是依据常识来对文件进行一般性的推测,作为一个检测不可能全部是正确的
就像上面兄弟提到的gbk编码被检测为ISO-8859编码。如果在一个限定的范围内,比如你要处理的文件确切知道不会是ISO-8859编码的,那就可以用iconv来转换成GBK编码,在用file来检测的时候只要是非ISO-8859编码的就转换成GBK,若是文件还是比较重要的话,我认为还是再讨论讨论,看其他兄弟有没有更好的办法?
回复 支持 反对

使用道具 举报

发表于 2005-3-15 14:20:28 | 显示全部楼层
Post by longwu9t

但是如何遍历整个文件夹(含多层子目录),并进行依此转换,最后删除旧文件,并把新产生的文件移动到原由文件位置,最后清除临时目录temp。
请兄弟们再帮忙想想……给个思路也好啊?!


为何不用find遍历?

先写个检测并转换单个文件的脚本,然后find
find . -name '*.txt' -exec script.sh {} \;
回复 支持 反对

使用道具 举报

发表于 2005-3-19 00:26:13 | 显示全部楼层
cat /big5.php | perl encode.pl > /utf8.php

source code:

encode.pl

#! /usr/bin/perl
use Encode (decode);

while($line = <STDIN>)
{
    print decode("big5", $line);
}

exit 0;
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表