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

文件替换(交互式)Replace的更多相关文章

  1. JS字符串替换函数:Replace(“字符串1″, “字符串2″),

    JS字符串替换函数:Replace(“字符串1″, “字符串2″), 1.我们都知道JS中字符串替换函数是Replace(“字符串1″, “字符串2″),但是这个函数只能将第一次出现的字符串1替换掉, ...

  2. [转]MSI安装程序中的文件替换

    原文链接:http://teach.hanzify.org/article/652-1233562028.html 前言 最近有汉化朋友问起如何不重新制作MSI文件,而直接用汉化好的文件替换MSI安装 ...

  3. Visual Studio 2010 实用功能:使用web.config发布文件替换功能

    当建立ASP.NET Web应用程序项目后,默认除了生成web.config外,还生成了web.debug.config与Web.Release.config.顾名思义,根据它们的命名我可以推测到他们 ...

  4. sql server 字符串替换函数REPLACE

    sql server 字符串替换函数REPLACE函数的使用 <pre name="code" class="sql">--参数1:需要替换字符的母 ...

  5. Msi中文件替换

    转自https://blog.csdn.net/davidhsing/article/details/9962377 ※说明:目前可以用于MSI编辑的软件很多,但是有些软件在保存时会在MSI文件中写入 ...

  6. 【原创】DOTNET动态调试破解Spoon,及MSI安装包文件替换技术

    提到Spoon可能大家还会感到陌生,但是如果提及XenoCode那么研究过DOTNET的人应该都知道吧.Spoon的前身就是XenoCode,虽然没有了PostBuild这个混淆软件,但是虚拟化技术仍 ...

  7. mysql 替换函数replace()实现mysql 替换字符串

    mysql 替换字符串的实现方法:mysql中replace函数直接替换mysql数据库中某字段中的特定字符串,不再需要自己写函数去替换,用起来非常的方便,mysql 替换函数replace()Upd ...

  8. mysql 替换函数replace()实现mysql替换指定字段中的字符串

    mysql 替换字符串的实现方法: mysql中replace函数直接替换mysql数据库中某字段中的特定字符串,不再需要自己写函数去替换,用起来非常的方便. mysql 替换函数replace() ...

  9. 【原创】JS文件替换神器--Chrome ReRes插件

    本文仅供学习交流使用,如侵立删! JS文件替换神器--Chrome ReRes插件 ReRes插件安装配置 ReRes项目官方地址:https://github.com/annnhan/ReRes 谷 ...

随机推荐

  1. Spring Boot 监控与管理

    在微服务架构中,我们将原本庞大的单体系统拆分为多个提供不同服务的应用,虽然,各个应用的内部逻辑因分解而简化,但由于部署的应用数量成倍增长,使得系统的维护复杂度大大提升,为了让运维系统能够获取各个为服务 ...

  2. java小程序(课堂作业06)

    编写一个程序,此程序在运行时要求用户输入一个 整数,代表某门课的考试成绩,程序接着给出“不及格”.“及格”.“中”.“良”.“优”的结论. 要求程序必须具备足够的健壮性,不管用户输入什 么样的内容,都 ...

  3. 字节数组与String类型的转换

    还是本着上篇文章的原则,只不过在Delphi中string有点特殊! 先了解一下Delphi中的string 1. string = AnsiString = 长字符串,理论上长度不受限制,但其实受限 ...

  4. WPF Demo17 数据绑定

    实例一:以资源的形式实现 namespace 数据绑定1 { public class Student { public int Id { get; set; } public string Name ...

  5. 安装node.msi 格式的文件失败

    in10 安装node.msi格式的文件,出现2503 2502 错误码, win+x 打开 在命令提示符窗口中输入: msiexec /package "安装msi格式的文件的全路径&qu ...

  6. 模拟a标签click,弹出新页面

    $("<a>").attr("href", url).attr("target", "_blank")[0] ...

  7. 关于dubbo通信协议之对比

    对dubbo的协议的学习,可以知道目前主流RPC通信大概是什么情况, dubbo共支持如下几种通信协议: dubbo:// rmi:// hessian:// http:// webservice:/ ...

  8. 不同三级域名与二级域名之间互相共享Cookie

    当你在项目中遇到这样一个问题,有多个站点在多个二级级域名如果要实现各域名站点下的登录状态共享,那么最简单的方法就是共享Cookie. 首先声明几个概念,域名怎么去区分. 顶级域名:.com,.cn,. ...

  9. P2670扫雷

    链接 这是一个并不像搜索的题(其实它是个循环) 对于输入的a数组,一个一个遍历下来,如果a[i][j]是雷,那(i,j)周围8个点对应的位置雷数就+1(用b数组记录),注意不能超出边界,输出时,如果a ...

  10. 将 GitHub 的某人的特定仓库复制到自己的账户下 的方法

    访问仓库页面,点击 Fork 按钮创建自己的仓库 Fork 就是将 GitHub 的某个特定仓库复制到自己的账户下. Fork 出的仓库与原仓库是两个不同的仓库,开发者可以随意编辑. 新建的仓库名为& ...