小实验---采用iconv命令对目录文件进行递归式字符编码转换的shell脚本

        前面提到了中文编码文件在vim中显示乱码问题的解决办法,但是经过代码编译运行后发现,调试过程中的输出也会乱码,上面解决办法没有从根本上解决问题。看来还是要进行编码的转换。

         查了下,字符编码转换在linux下有命令iconv,可以方便的从指定的编码方式转到另一个编码方式,c语言有相应的函数进行转码。

          但是我们在网上下载的源码学习时,往往有很多目录,每个目录下有多个文件,并且目录下面也可能有目录呢。如果要是在模拟终端中调试代码时一个一个转,那得多麻烦啊。想想前面我学过shell脚本的东西,正好这里自己可以捣鼓一个shell脚本完成这个工作。

          其实这个问题主要要解决目录遍历啦,应该可以用递归函数来解决。但是想想递归的话似乎会用到栈,实现起来应该挺占系统资源的,记得用到的好几个命令,rm,cp,等都有-R选项,即递归地操作,也不知道这些程序中是怎么比较好地来进行目录遍历的,现在想不到什么比较好的办法,那就先用递归函数来作吧!

          下面是经过几个小时,其中包含相关命令复习和调试后的成果(无奈对命令不是很熟,花了太多时间):

#!/bin/bash
# usage: fconv type1 type2 dir
# this script is used to convert file coding from type1 to type2
function handleFile(){
    echo "i am in handlefile!"
    nameparts[1]=`echo $1 | cut -d '.' -f 1`
        nameparts[2]=`echo $1 | cut -d '.' -f 2`
    echo ${nameparts[1]}
    echo ${nameparts[2]}
    tname="${nameparts[1]}_$totype.${nameparts[2]}"
    iconv -f $fromtype -t $totype $1 -o $tname
    rm $1
}

function handleDir(){

    nmlist=`ls -l $1 | awk '{print $9}'`
    if [ -d $1 ]; then
        cd $1
    fi

    for fname in $nmlist
        do
        echo $fname
        if [ -f "$fname" ]; then
        echo "i will enter into handlefile!"
            handleFile $fname

        elif [ -d "$fname" ]; then
        echo "i will enter into handledir"
            handleDir $fname
        else
        echo "something must be wrong!"
        fi
        
    done
    cd ..
}

export fromtype=$1
export totype=$2
dir=$3
if [ -e $3 ]; then
    handleDir $3
else
    echo "input dir or file do not exist!"
    exit 0
fi
其中主要采用了ls -l 命令结合awk命令,取第9个字段,获得当前文件夹下的文件(或子目录)名称。

然后是编码转换后的输出文件名,我才用了在原文件名的基础上添加"_utf-8"的形式,并且采用文件名中的 "."作为区分标志。因为多数为编程的源代码,如果直接加上后缀的话,容易导致编译器不能识别,所以想了这个办法,其实在前面添加也应该可以,并且处理还简单。这里就用cut命令将文件名称做分割。

最后实验结果用在vim里面用:set fileencoding检测成功。

对了,还有一个问题,遍历目录时要记得cd , 否则因为找不到该文件或者目录而出错。

使用时,输入三个参数,type1, type2, dir(或者单个文件),如 gb2312 utf-8 somepath

对了,由于近期还有其他事情,可能测试还是不是十分彻底。

你可能感兴趣的:(linux,shell,脚本,编码)