在增量发版博文里,自动识别目标文件路径是采用了标记目录特征。当部署环境多变时,会多有不便。这个替换程序,在使用时需要手动输入目标目录。当需要进一步自动化时,可以与 fint 配合使用。

  程序发布时,需要借助一个环境变量(DONATELLO_HOME),以保证函数调用的正常。

  程序目录结构

.
├── bin
│ ├── mTime # 暂未启用
│ └── screensize # 获取终端宽度、高度,一个C语言程序
├── lib
│ ├── displayHeader # 设计用来打印程序头部格式,未启用
│ ├── doReplace # 库文件,提供替换文件的函数
│ ├── findObjectFile # 在目标路径中,寻找新文件的路径,处理多个文件的交互选择
│ ├── getscreensize # 处理bin下C语言程序的返回结构
│ ├── printObject # 把替换的对应关系输出到终端
│ └── progressBar # 打印一个进度条,暂缓程序执行
└── Replace # 主程序

  主程序 Replace:

 #!/bin/bash
# Replace-1.3
# The author: donatello
#
chkdep() {
[ -z $ ] && echo "Directory ?"
[ -z $ ] && exit
[ ! -d $ ] && echo "Without directory, please again."
[ ! -d $ ] && exit
[ -d $ ] && baseDirectory=$
}
chkdep $
# Format the "baseDirectory".
declare -g baseDirectory="$(dirname $baseDirectory)"/"$(basename $baseDirectory)"
declare -g fileName=$(ls -1R .)
declare -g -a objectFileName
declare -g -i obj=
declare -gr father="${DONATELLO_HOME}/bin"
echo $father clear
# Call the functions.
#. displayHeader
. ${father}/lib/findObjectFile
. ${father}/lib/printObject
. ${father}/lib/doReplace # Define count function.
# Count the number of array elements.
count_objectFileName() {
local -i k=${#objectFileName[@]}
[ -ge $k ] && echo -e "\t\fCheck for new files" && return
return
}
#
findFile
#count_objectFileName && [ -eq $? ] && exit
count_objectFileName
[ -eq $? ] && exit
printOjectFileDirName
replaceFile
echo -e '\nShell script ends.'
# Shell script over.

  寻找目标文件 findObjectFile

 #!/bin/bash
# The command that will replace the file if exists.
MV="$(which --skip-alias mv) -v" # Check input by user when there are many file directory will be confirm.
confirmInfo() {
#echo "k=$k"
while true; do
# Print files there are same name.
if [ -lt $k ]; then
echo -e "file of the same name:\f<< $i >>"
for((i=; i<=k; i++)); do
# name=$(env basename ${file[$i]})
# echo -e "\tNo.$i ${name}\n"
echo -e "\tNo.$i ${file[$i]}\n"
done
fi # Confirm file.
while true; do
read -p "Please confirm the path of the file that will be replace. No.-> " -N confirm >/dev/null && echo ""
if [ $confirm -ge ] && [ $confirm -le $k ]; then
break
else
echo "No's error."
fi
done # Reconfirm file.
read -p "Do you confirm you choice ? (yY/nN)... " -N reconfirm && echo ""
if [ 'y' = $reconfirm ]; then
clear
break
elif [ 'n' = $reconfirm ]; then
echo "Please confirm again."
else
echo "Char's invalid."
fi
done
#printf "Good luck, the file is %s.\n" "file[$confirm]"
return $confirm
} # Find the file that will be replaced.
findFile() {
local -a file
local -i k=
local -i confirm=
local -l reconfirm=n for i in $(echo $fileName); do # cycle: A file is looped once.
[ ! -f $i ] && continue objectFileName=$(find $baseDirectory -name $i -print)
for item in $(echo "${objectFileName}"); do
#echo "item $k: $item"
file[$k]=${item}
let k=k+
done
k=${#file[@]}
#echo $i $k # There is no file with the same name, direct replacement.
if [ -eq $k ]; then
objectFileName[$obj]=${file[$k]}
let obj=obj+
fi
# When the same file name exist, the user is required
# to confirm the correct file path. # Call local function: confirmInfo
if [ -lt $k ]; then
confirmInfo
k=$?
#echo "The file is ${file[${answer}]}"
objectFileName[$obj]=${file[$k]}
let obj=obj+
fi # sleep
# variable reset.
k=
unset file
# over
done
} echo "Will find files..."
# Over

  打印输出替换对应关系 printObject

 #!/bin/bash

 BASENAME=$(which --skip-alias basename)

 printOjectFileDirName() {
clear
#. displayHeader
echo "Print object files..."
local -i k=${#objectFileName[@]}
#echo "length, k=$k"
for((i=; i<k; i++)); do
echo "Will move $(${BASENAME} ${objectFileName[$i]}) --->> ${objectFileName[$i]}"
done . ${father}/lib/progressBar
}
# Over

  打印对象后,调用了进度条效果 progressBar

 #!/bin/bash
#
declare -i cycle=
declare -i length=
declare -i k=
#echo -n '-------------------------------------------------------' printBar(){
for((i=; i<length; i++)); do
echo -n '-'
done printf "\r"
for((i=; i<cycle*length; i++)); do
echo -n '-' && sleep 0.05
echo -e -n '\b\' && sleep 0.05
echo -e -n '\b-' && sleep 0.05
echo -e -n '\b/' && sleep 0.05
echo -e -n '\b*' && sleep 0.3
echo -e -n '\b-' let k=k+
if [ $k -eq $length ]
then
k=
printf "\r"
fi
done
}
printBar

  替换文件 doReplace:

 #!/bin/bash
MV="$(which --skip-alias mv) -v"
BASENAME=$(which --skip-alias basename) replaceFile() {
clear
echo "Replace object files..."
local -i k=${#objectFileName[@]}
for((i=; i<k; i++)); do
$MV $(${BASENAME} ${objectFileName[$i]}) ${objectFileName[$i]}
done
}
# do it
# 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$.class --->> /opt/view/release/task/WEB-INF/classes/com/zhaocai/task/MemberTimeTransaction$.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$.class' -> `/opt/view/release/task/WEB-INF/classes/com/zhaocai/task/MemberTimeTransaction$1.class'
removed `MemberTimeTransaction$.class'
`MemberTimeTransaction.class' -> `/opt/view/release/task/WEB-INF/classes/com/zhaocai/task/MemberTimeTransaction.class'
removed `MemberTimeTransaction.class' Shell script ends.

最新文章

  1. Intellij Idea 14 使用jetty-maven-plugin配置运行web工程
  2. js中的延迟执行和定时执行
  3. 对Java内存模型即JMM的理解
  4. Dependency Injection in ASP.NET Core
  5. vi 使用
  6. jdbc 得到表结构、主键
  7. JS获取客户端电脑信息(转)
  8. yii2源码学习笔记(五)
  9. UVA - 699The Falling Leaves(递归先序二叉树)
  10. iOS 视图控制器生命周期
  11. 移动端js调取手机相册和拍照功能
  12. 基于jwt的用户登录认证
  13. MyBatis 配制文件层次表
  14. 关于java中死锁的总结
  15. AGC 016C.+/- Rectangle(思路 构造)
  16. Odoo小数精度及货币精度详解
  17. Java虚拟机--Java内存区域的划分和异常
  18. PAT B1017 A除以B (20 分)
  19. Android_设置全屏的方法
  20. python解析Nginx访问日志

热门文章

  1. Intellj(IDEA)创建java webapp
  2. java远程调用linux的命令或者脚本
  3. sourceInsight与IAR的同步
  4. 一加3刷不了官方recoery
  5. Fiddler的学习之路
  6. 研究js特效巩固JavaScript知识
  7. 黄聪:微信小程序(应用号)资源汇总整理(转)
  8. PAT 乙级 1072 开学寄语(20 分)
  9. mysql查询优化之二:查询优化器的局限性
  10. Jmeter(三)Test-Plan、Thread-Group