|
在增量发版博文里,自动识别目标文件路径是采用了标记目录特征。当部署环境多变时,会多有不便。这个替换程序,在使用时需要手动输入目标目录。当需要进一步自动化时,可以与 fint 配合使用。
|
程序目录结构
. ├── bin │ ├── mTime # 暂未启用 │ └── screensize # 获取终端宽度、高度,一个C语言程序 ├── lib │ ├── displayHeader # 设计用来打印程序头部格式,未启用 │ ├── doReplace # 库文件,提供替换文件的函数 │ ├── findObjectFile # 在目标路径中,寻找新文件的路径,处理多个文件的交互选择 │ ├── getscreensize # 处理bin下C语言程序的返回结构 │ ├── printObject # 把替换的对应关系输出到终端 │ └── progressBar # 打印一个进度条,暂缓程序执行 └── Replace # 主程序
主程序 Replace:
1 #!/bin/bash 2 # Replace-1.3 3 # The author: donatello 4 # 5 chkdep() { 6 [ -z $1 ] && echo "Directory ?" 7 [ -z $1 ] && exit 4 8 [ ! -d $1 ] && echo "Without directory, please again." 9 [ ! -d $1 ] && exit 6 10 [ -d $1 ] && baseDirectory=$1 11 } 12 chkdep $1 13 # Format the "baseDirectory". 14 declare -g baseDirectory="$(dirname $baseDirectory)"/"$(basename $baseDirectory)" 15 declare -g fileName=$(ls -1R .) 16 declare -g -a objectFileName 17 declare -g -i obj=1 18 declare -gr father="${DONATELLO_HOME}/bin" 19 echo $father 20 21 clear 22 # Call the functions. 23 #. displayHeader 24 . ${father}/lib/findObjectFile 25 . ${father}/lib/printObject 26 . ${father}/lib/doReplace 27 28 # Define count function. 29 # Count the number of array elements. 30 count_objectFileName() { 31 local -i k=${#objectFileName[@]} 32 [ 1 -ge $k ] && echo -e "\t\fCheck for new files" && return 33 33 return 0 34 } 35 # 36 findFile 37 #count_objectFileName && [ 33 -eq $? ] && exit 33 38 count_objectFileName 39 [ 33 -eq $? ] && exit 33 40 printOjectFileDirName 41 replaceFile 42 echo -e '\nShell script ends.' 43 # Shell script over.
寻找目标文件 findObjectFile
1 #!/bin/bash 2 # The command that will replace the file if exists. 3 MV="$(which --skip-alias mv) -v" 4 5 # Check input by user when there are many file directory will be confirm. 6 confirmInfo() { 7 #echo "k=$k" 8 while true; do 9 # Print files there are same name. 10 if [ 1 -lt $k ]; then 11 echo -e "file of the same name:\f<< $i >>" 12 for((i=1; i<=k; i++)); do 13 # name=$(env basename ${file[$i]}) 14 # echo -e "\tNo.$i ${name}\n" 15 echo -e "\tNo.$i ${file[$i]}\n" 16 done 17 fi 18 19 # Confirm file. 20 while true; do 21 read -p "Please confirm the path of the file that will be replace. No.-> " -N 1 confirm 1>/dev/null && echo "" 22 if [ $confirm -ge 1 ] && [ $confirm -le $k ]; then 23 break 24 else 25 echo "No's error." 26 fi 27 done 28 29 # Reconfirm file. 30 read -p "Do you confirm you choice ? (yY/nN)... " -N 1 reconfirm && echo "" 31 if [ 'y' = $reconfirm ]; then 32 clear 33 break 34 elif [ 'n' = $reconfirm ]; then 35 echo "Please confirm again." 36 else 37 echo "Char's invalid." 38 fi 39 done 40 #printf "Good luck, the file is %s.\n" "file[$confirm]" 41 return $confirm 42 } 43 44 # Find the file that will be replaced. 45 findFile() { 46 local -a file 47 local -i k=1 48 local -i confirm=0 49 local -l reconfirm=n 50 51 for i in $(echo $fileName); do # cycle: A file is looped once. 52 [ ! -f $i ] && continue 53 54 objectFileName=$(find $baseDirectory -name $i -print) 55 for item in $(echo "${objectFileName}"); do 56 #echo "item $k: $item" 57 file[$k]=${item} 58 let k=k+1 59 done 60 k=${#file[@]} 61 #echo $i $k 62 63 # There is no file with the same name, direct replacement. 64 if [ 1 -eq $k ]; then 65 objectFileName[$obj]=${file[$k]} 66 let obj=obj+1 67 fi 68 # When the same file name exist, the user is required 69 # to confirm the correct file path. 70 71 # Call local function: confirmInfo 72 if [ 1 -lt $k ]; then 73 confirmInfo 74 k=$? 75 #echo "The file is ${file[${answer}]}" 76 objectFileName[$obj]=${file[$k]} 77 let obj=obj+1 78 fi 79 80 # sleep 1 81 # variable reset. 82 k=1 83 unset file 84 # over 85 done 86 } 87 88 echo "Will find files..." 89 # Over
打印输出替换对应关系 printObject
1 #!/bin/bash 2 3 BASENAME=$(which --skip-alias basename) 4 5 printOjectFileDirName() { 6 clear 7 #. displayHeader 8 echo "Print object files..." 9 local -i k=${#objectFileName[@]} 10 #echo "length, k=$k" 11 for((i=1; i<k; i++)); do 12 echo "Will move $(${BASENAME} ${objectFileName[$i]}) --->> ${objectFileName[$i]}" 13 done 14 15 . ${father}/lib/progressBar 16 } 17 # Over
打印对象后,调用了进度条效果 progressBar
1 #!/bin/bash 2 # 3 declare -i cycle=1 4 declare -i length=15 5 declare -i k=0 6 #echo -n '-------------------------------------------------------' 7 8 printBar(){ 9 for((i=0; i<length; i++)); do 10 echo -n '-' 11 done 12 13 printf "\r" 14 for((i=0; i<cycle*length; i++)); do 15 echo -n '-' && sleep 0.05 16 echo -e -n '\b\' && sleep 0.05 17 echo -e -n '\b-' && sleep 0.05 18 echo -e -n '\b/' && sleep 0.05 19 echo -e -n '\b*' && sleep 0.3 20 echo -e -n '\b-' 21 22 let k=k+1 23 if [ $k -eq $length ] 24 then 25 k=0 26 printf "\r" 27 fi 28 done 29 } 30 printBar
替换文件 doReplace:
1 #!/bin/bash 2 MV="$(which --skip-alias mv) -v" 3 BASENAME=$(which --skip-alias basename) 4 5 replaceFile() { 6 clear 7 echo "Replace object files..." 8 local -i k=${#objectFileName[@]} 9 for((i=1; i<k; i++)); do 10 $MV $(${BASENAME} ${objectFileName[$i]}) ${objectFileName[$i]} 11 done 12 } 13 # do it 14 # Over
这个例子,没有遇到重复命名的文件。运行效果:(运行过程中,会有几次清屏,需要翻动混动条,才能看到完整下边的内容)
[view@payqa1 1130task]$ Replace /opt/view/release/task/ Will find files... Print object files... Will move MemberTimeTask.class --->> /opt/view/release/task/WEB-INF/classes/com/zhaocai/task/MemberTimeTask.class Will move MemberTimeTransaction$1.class --->> /opt/view/release/task/WEB-INF/classes/com/zhaocai/task/MemberTimeTransaction$1.class Will move MemberTimeTransaction.class --->> /opt/view/release/task/WEB-INF/classes/com/zhaocai/task/MemberTimeTransaction.class --------------- Replace object files... `MemberTimeTask.class' -> `/opt/view/release/task/WEB-INF/classes/com/zhaocai/task/MemberTimeTask.class' removed `MemberTimeTask.class' `MemberTimeTransaction$1.class' -> `/opt/view/release/task/WEB-INF/classes/com/zhaocai/task/MemberTimeTransaction$1.class' removed `MemberTimeTransaction$1.class' `MemberTimeTransaction.class' -> `/opt/view/release/task/WEB-INF/classes/com/zhaocai/task/MemberTimeTransaction.class' removed `MemberTimeTransaction.class' Shell script ends.
一切代码都是为了生活,一切生活都是调剂
浙公网安备 33010602011771号