歡迎您光臨本站 註冊首頁

用Linux shell腳本批量轉換java源文件編碼(支持命令行選項)

←手機掃碼閱讀     火星人 @ 2014-03-09 , reply:0

最近在用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. dirname=""; #源文件目錄
  23. superdir=""; #源文件目錄上級目錄
  24. dirbasename=""; #源文件目錄名
  25. newdirbasename=""i; #目標目錄目錄名
  26. cutlength=1; #源文件目錄絕對路徑字元串長度
  27. encodeform=""; #源文件編碼
  28. encodeto=""; #目標文件編碼
  29. filtername=""; #過濾源文件的字元串
  30. while getopts :f:t:d:n:h name #獲取命令行參數;getopts命令,要求選項有值的話,選項後面要跟:,第一個:表示getopts會區分invalid option錯誤和miss option argument錯誤
  31. do
  32. case $name in
  33. f)
  34. fflag=1; #參數存在的標記
  35. encodefrom=$OPTARG;;

  36. t)
  37. tflag=1; #參數存在的標記
  38. encodeto=$OPTARG;;
  39. d)
  40. dflag=1; #參數存在的標記
  41. dirnameval=$OPTARG;;
  42. n)
  43. nflag=1; #參數存在的標記
  44. filtername=$OPTARG;;
  45. h)
  46. hflag=1;; #參數存在的標記
  47. esac;
  48. done;
  49. if [ ! -z $hflag ] #如果存在 -h 選項則列印出幫助信息並退出腳本
  50. then
  51. echo ;
  52. echo "iconvs --help";
  53. echo " -d --dir-source the dir of -d option will be coverted";
  54. echo " -f --encoding-from the value of -f option is the encoding of sourcefile";
  55. echo " -t --encoding-to the value of -t option is the encoding of destfile";
  56. echo " -n --string-filter it will filter the sourcefile by the value of -n option from sourcedir";
  57. echo ;
  58. exit 1;
  59. fi
  60. if [ -z $fflag ] #默認源文件編碼為gbk
  61. then
  62. encodefrom="GBK";
  63. fi
  64. if [ -z $tflag ] #默認目標文件編碼為utf-8
  65. then
  66. encodeto="UTF-8";
  67. fi
  68. if [ -z $filtername ] #默認源文件過濾字元串為 .java
  69. then
  70. filtername=".java";
  71. fi
  72. if [ ! -z $dflag ] #分析源文件目錄,合成絕對路徑
  73. then
  74. if [ "${dirnameval:0:1}" = "/" ] #截取從索引0開始的1個長度的字元
  75. then
  76. dirname="$dirnameval";
  77. else
  78. dirname="`pwd`/$dirnameval";
  79. fi
  80. else
  81. dirname="`pwd`";
  82. fi;
  83. dirbasename=`basename "$dirname"`; #等價於dirbasename=${basename

    "$dirname"};
  84. newdirbasename="${dirbasename}-${encodeto}";
  85. dirname=${dirname%/};
  86. superdir="${dirname%/*}"; #大括弧的擴展參數用法,%表示去除右邊最小範圍的匹配,這裡匹配的是/*,%%表示去除右邊最大範圍的匹配,#和##用法相同,#去除的是左邊的匹配
  87. cutlength=$((${#superdir} ${#dirbasename} 2));
  88. echo "from dir:$dirname";
  89. echo "to dir:${superdir}/${newdirbasename}";
  90. echo "from encode:${encodefrom}";
  91. echo "to encode:${encodeto}";
  92. echo '********************************************************************************';
  93. item "$dirname"; #在這裡進行遞歸遍歷轉碼
  94. 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次圍觀

http://coctec.com/docs/linux/show-post-47576.html