linux java转码_用Linux shell脚本批量转换java源文件编码(支持命令行选项)
最近在用ant給java項目打jar包,但是程序運行出來之后,全部亂碼,于是想到用Linux的iconv命令給java源文件轉碼,但是總不能一個一個地轉吧,效率太低下了,于是便寫了個Linux shell腳本方便以后給項目轉碼。
小編剛接觸Linux shell腳本編程,代碼看起來粗糙的話別見怪,還望多多指教,呵呵,什么也不說了,先貼出源代碼:
#!/bin/bash
#遞歸遍歷源文件目錄進行編碼轉換
functionitem(){
forpathin$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:hname#獲取命令行參數;getopts命令,要求選項有值的話,選項后面要跟:,第一個:表示getopts會區分invalid option錯誤和miss option argument錯誤
do
case$namein
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文件夾中
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的linux java转码_用Linux shell脚本批量转换java源文件编码(支持命令行选项)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: xsd java引用_web.xml文件
- 下一篇: arcgis飞行轨迹动画_高德地图,百度