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

    HanLP的一个很大的好处是离线开源工具包,换而言之,它不仅提供免费的代码免费下载,而且将辛苦收集的词典也对外公开啦,此诚乃一大无私之举.我在安装的时候,主要参照这份博客: blog.csdn.net ...

  2. ML: 聚类算法R包-层次聚类

    层次聚类 stats::hclust stats::dist    R使用dist()函数来计算距离,Usage: dist(x, method = "euclidean", di ...

  3. MySQL测试报告

    硬件配置: 3台服务器:192.168.23.168,  192.168.23.169,  192.168.23.170 硬盘:230G 内存:16G Linux内核:Linux geoserver. ...

  4. Micro QR 和QR码

    QRcode.com 什么是QR码 QR码的种类 如何导入 QR码的成功之路 常见问题解答 咨询 Language   Micro QR码 返回 QR码的种类 首页 二维码上只有一个定位图案,这就是M ...

  5. Maven Docker部署

    镜像构建方式 docker-maven-plugin插件构建docker镜像有两种方式: 1. 指定参数,由docker-maven-plugin插件根据这些参数来制作镜像: 2. 指定Dockerf ...

  6. c#读取Sybase中文乱码的解决办法

    最近需要从Sybase数据库中获取数据.用Sybase.Data.AseClient连接的话比较简单,但中文数据会有乱码.用Sybase自带的工具SQL Advantage设置好编码和语言,是可以正常 ...

  7. java经典5种 FlowLayout 、BorderLayout、GridLayout、GridBagLayout、CardLayout布局

    Java 程序通过jvm可以很好的移植到其他平台上,但是java 生成的图形界面样式,在不使用布局的情况下,往往需要重新设定大小,才能在新的平台上调整到最佳样式.这是由于组件的最佳大小 往往是与平台相 ...

  8. Java 中统计文件中出现单词的次数练习

    统计英文article.txt文件中出现hello这个单词的次数 这个是article.txt文件内容 { hello The Royal Navy is trying hello to play h ...

  9. 黄聪:C#如何使用fiddlercoreCapture监控手机APP

    1.去下载Fiddler:https://www.telerik.com/download/fiddler 2.安装Fiddler,按下图所示导出证书,导出后在桌面得到:FiddlerRoot.cer ...

  10. vue之过滤器

    在vue2.0以前的版本中vue内置的过滤器,但是因为缺乏纯JavaScript的灵活性,现在vue2.0版本中已经删除了内置过滤器,所以需要自己注册过滤器,我们可以定义本地(在某一个template ...