最近在用ant给java项目打jar包,但是程序运行出来之后,全部乱码,于是想到用Linux的iconv命令给java源文件转码,但是总不能一个一个地转吧,效率太低下了,于是便写了个Linux shell脚本方便以后给项目转码。
 

       小编刚接触Linux shell脚本编程,代码看起来粗糙的话别见怪,还望多多指教,呵呵,什么也不说了,先贴出源代码:

 
  
  1. #!/bin/bash
  2. #递归遍历源文件目录进行编码转换  
  3. function item(){  
  4. for path in $1/*  
  5.   do  
  6.     if [ -f $path ]  
  7.       then 
  8.     basename=`basename "$path"`;  
  9.     if echo "begin convert:$basename" | grep "${filtername}"   
  10.        then 
  11.        lastpath=${path:$cutlength};  
  12.            newfilename="${superdir}/${newdirbasename}/${lastpath}";  
  13.        newfiledirname=${newfilename%/*};  
  14.            mkdir -p "$newfiledirname";#创建目标文件所在目录  
  15.            iconv -f $encodefrom -t $encodeto "${path}" > "${newfilename}";  
  16.     fi  
  17.      else 
  18.     item $path;  
  19.       fi  
  20.   done;  
  21. }  
  22.  
  23. dirname="";  #源文件目录
  24. superdir="";  #源文件目录上级目录
  25. dirbasename="";  #源文件目录名
  26. newdirbasename=""i;  #目标目录目录名
  27. cutlength=1;  #源文件目录绝对路径字符串长度
  28. encodeform="";  #源文件编码
  29. encodeto="";  #目标文件编码
  30. filtername="";  #过滤源文件的字符串
  31.  
  32.  
  33. while getopts :f:t:d:n:h name #获取命令行参数;getopts命令,要求选项有值的话,选项后面要跟:,第一个:表示getopts会区分invalid option错误和miss option argument错误
  34.   do  
  35.     case $name in 
  36.          f)   
  37.           fflag=1;  #参数存在的标记
  38.           encodefrom=$OPTARG;;  
  39.          t)  
  40.           tflag=1;  #参数存在的标记
  41.           encodeto=$OPTARG;;  
  42.          d)  
  43.           dflag=1;  #参数存在的标记
  44.           dirnameval=$OPTARG;;  
  45.          n)  
  46.           nflag=1;  #参数存在的标记
  47.           filtername=$OPTARG;;  
  48.          h)  
  49.           hflag=1;;  #参数存在的标记
  50.     esac;  
  51.   done;  
  52. if [ ! -z $hflag ]  #如果存在 -h 选项则打印出帮助信息并退出脚本
  53.    then 
  54.    echo ;  
  55.    echo "iconvs --help";  
  56.    echo "            -d  --dir-source        the dir of -d option will be coverted";  
  57.    echo "            -f  --encoding-from     the value of -f option is the encoding of sourcefile";  
  58.    echo "            -t  --encoding-to       the value of -t option is the encoding of destfile";  
  59.    echo "            -n  --string-filter     it will filter the sourcefile by the value of -n option from sourcedir";  
  60.    echo ;  
  61.    exit 1;  
  62. fi  
  63. if [ -z $fflag ]  #默认源文件编码为gbk
  64.    then 
  65.    encodefrom="GBK";  
  66. fi  
  67. if [ -z $tflag ]  #默认目标文件编码为utf-8
  68.    then 
  69.    encodeto="UTF-8";  
  70. fi  
  71. if [ -z $filtername ]  #默认源文件过滤字符串为 .java
  72.    then 
  73.    filtername=".java";  
  74. fi  
  75. if [ ! -z $dflag ]  #分析源文件目录,合成绝对路径
  76.   then 
  77.     if [ "${dirnameval:0:1}" = "/" ]  #截取从索引0开始的1个长度的字符
  78.        then 
  79.          dirname="$dirnameval";  
  80.        else 
  81.          dirname="`pwd`/$dirnameval";  
  82.        fi  
  83.   else 
  84.     dirname="`pwd`";  
  85. fi;  
  86. dirbasename=`basename "$dirname"`;  #等价于dirbasename=${basename "$dirname"};
  87. newdirbasename="${dirbasename}-${encodeto}";  
  88. dirname=${dirname%/};  
  89. superdir="${dirname%/*}"; #大括号的扩展参数用法,%表示去除右边最小范围的匹配,这里匹配的是/*,%%表示去除右边最大范围的匹配,#和##用法相同,#去除的是左边的匹配
  90. cutlength=$((${#superdir}+${#dirbasename}+2));  
  91. echo "from    dir:$dirname";  
  92. echo "to      dir:${superdir}/${newdirbasename}";  
  93. echo "from encode:${encodefrom}";  
  94. echo "to   encode:${encodeto}";  
  95. echo '********************************************************************************';  
  96. item "$dirname";  #在这里进行递归遍历转码
  97. echo '********************************************************************************';  

用vi编写以上脚本,保存为iconvs.sh(当然你也可以用别的名字),假设保存位置为:/opt/iconvs.sh,接下来

       cd  /opt

       chmod 755 iconvs.sh

       bash iconvs.sh -d 源文件目录 -t 源文件编码 -f  目标文件编码 -n  过滤源文件(与grep命令匹配格式相同)

例:

bash iconvs.sh -d /opt/src -t gbk -f  utf-8 -n .java

该命令会把你的/opt/src目录下的所有包含.java的文件从gbk编码转换为utf8编码,并把转换后的文件按源目录结构存放在/opt/src-utf-8文件夹中