最近在用ant給java項目打jar包,但是程序運行出來之後,全部亂碼,於是想到用Linux的iconv命令給java源文件轉碼,但是總不能一個一個地轉吧,效率太低下了,於是便寫了個Linux shell腳本方便以後給項目轉碼.
小編剛接觸Linux shell腳本編程,代碼看起來粗糙的話別見怪,還望多多指教,呵呵,什麼也不說了,先貼出源代碼:
- #!/bin/bash
- #遞歸遍歷源文件目錄進行編碼轉換
- function item(){
- for path in $1/*
- do
- if [ -f $path ]
- then
- basename=`basename "$path"`;
- if echo "begin convert:$basename" | grep "${filtername}"
- then
- lastpath=${path:$cutlength};
- newfilename="${superdir}/${newdirbasename}/${lastpath}";
- newfiledirname=${newfilename%/*};
- mkdir -p "$newfiledirname";#創建目標文件所在目錄
- iconv -f $encodefrom -t $encodeto "${path}" >
"${newfilename}"; - fi
- else
- item $path;
- fi
- done;
- }
- dirname=""; #源文件目錄
- superdir=""; #源文件目錄上級目錄
- dirbasename=""; #源文件目錄名
- newdirbasename=""i; #目標目錄目錄名
- cutlength=1; #源文件目錄絕對路徑字元串長度
- encodeform=""; #源文件編碼
- encodeto=""; #目標文件編碼
- filtername=""; #過濾源文件的字元串
- while getopts :f:t:d:n:h name #獲取命令行參數;getopts命令,要求選項有值的話,選項後面要跟:,第一個:表示getopts會區分invalid option錯誤和miss option argument錯誤
- do
- case $name in
- f)
- fflag=1; #參數存在的標記
- encodefrom=$OPTARG;;
- t)
- tflag=1; #參數存在的標記
- encodeto=$OPTARG;;
- d)
- dflag=1; #參數存在的標記
- dirnameval=$OPTARG;;
- n)
- nflag=1; #參數存在的標記
- filtername=$OPTARG;;
- h)
- hflag=1;; #參數存在的標記
- esac;
- done;
- if [ ! -z $hflag ] #如果存在 -h 選項則列印出幫助信息並退出腳本
- then
- echo ;
- echo "iconvs --help";
- echo " -d --dir-source the dir of -d option will be coverted";
- echo " -f --encoding-from the value of -f option is the encoding of sourcefile";
- echo " -t --encoding-to the value of -t option is the encoding of destfile";
- echo " -n --string-filter it will filter the sourcefile by the value of -n option from sourcedir";
- echo ;
- exit 1;
- fi
- if [ -z $fflag ] #默認源文件編碼為gbk
then - encodefrom="GBK";
- fi
- if [ -z $tflag ] #默認目標文件編碼為utf-8
- then
- encodeto="UTF-8";
- fi
- if [ -z $filtername ] #默認源文件過濾字元串為 .java
- then
- filtername=".java";
- fi
- if [ ! -z $dflag ] #分析源文件目錄,合成絕對路徑
- then
- if [ "${dirnameval:0:1}" = "/" ] #截取從索引0開始的1個長度的字元
- then
- dirname="$dirnameval";
- else
- dirname="`pwd`/$dirnameval";
- fi
- else
- dirname="`pwd`";
- fi;
- dirbasename=`basename "$dirname"`; #等價於dirbasename=${basename
"$dirname"}; - newdirbasename="${dirbasename}-${encodeto}";
- dirname=${dirname%/};
- superdir="${dirname%/*}"; #大括弧的擴展參數用法,%表示去除右邊最小範圍的匹配,這裡匹配的是/*,%%表示去除右邊最大範圍的匹配,#和##用法相同,#去除的是左邊的匹配
- cutlength=$((${#superdir} ${#dirbasename} 2));
- echo "from dir:$dirname";
- echo "to dir:${superdir}/${newdirbasename}";
- echo "from encode:${encodefrom}";
- echo "to encode:${encodeto}";
- echo '********************************************************************************';
- item "$dirname"; #在這裡進行遞歸遍歷轉碼
- 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文件夾中
本文出自 「荊棘」 博客,謝絕轉載!
[火星人 ] 用Linux shell腳本批量轉換java源文件編碼(支持命令行選項)已經有489次圍觀