文件替换(交互式)Replace
|
在增量发版博文里,自动识别目标文件路径是采用了标记目录特征。当部署环境多变时,会多有不便。这个替换程序,在使用时需要手动输入目标目录。当需要进一步自动化时,可以与 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的更多相关文章
- JS字符串替换函数:Replace(“字符串1″, “字符串2″),
JS字符串替换函数:Replace(“字符串1″, “字符串2″), 1.我们都知道JS中字符串替换函数是Replace(“字符串1″, “字符串2″),但是这个函数只能将第一次出现的字符串1替换掉, ...
- [转]MSI安装程序中的文件替换
原文链接:http://teach.hanzify.org/article/652-1233562028.html 前言 最近有汉化朋友问起如何不重新制作MSI文件,而直接用汉化好的文件替换MSI安装 ...
- Visual Studio 2010 实用功能:使用web.config发布文件替换功能
当建立ASP.NET Web应用程序项目后,默认除了生成web.config外,还生成了web.debug.config与Web.Release.config.顾名思义,根据它们的命名我可以推测到他们 ...
- sql server 字符串替换函数REPLACE
sql server 字符串替换函数REPLACE函数的使用 <pre name="code" class="sql">--参数1:需要替换字符的母 ...
- Msi中文件替换
转自https://blog.csdn.net/davidhsing/article/details/9962377 ※说明:目前可以用于MSI编辑的软件很多,但是有些软件在保存时会在MSI文件中写入 ...
- 【原创】DOTNET动态调试破解Spoon,及MSI安装包文件替换技术
提到Spoon可能大家还会感到陌生,但是如果提及XenoCode那么研究过DOTNET的人应该都知道吧.Spoon的前身就是XenoCode,虽然没有了PostBuild这个混淆软件,但是虚拟化技术仍 ...
- mysql 替换函数replace()实现mysql 替换字符串
mysql 替换字符串的实现方法:mysql中replace函数直接替换mysql数据库中某字段中的特定字符串,不再需要自己写函数去替换,用起来非常的方便,mysql 替换函数replace()Upd ...
- mysql 替换函数replace()实现mysql替换指定字段中的字符串
mysql 替换字符串的实现方法: mysql中replace函数直接替换mysql数据库中某字段中的特定字符串,不再需要自己写函数去替换,用起来非常的方便. mysql 替换函数replace() ...
- 【原创】JS文件替换神器--Chrome ReRes插件
本文仅供学习交流使用,如侵立删! JS文件替换神器--Chrome ReRes插件 ReRes插件安装配置 ReRes项目官方地址:https://github.com/annnhan/ReRes 谷 ...
随机推荐
- subversion与TortoiseSVN的使用
Subversion是一个自由开源的版本控制系统.在Subversion管理下,文件和目录可以超越时空.Subversion将文件存放在中心版本库里,这个版本库很像一个普通的文件服务器,不同的是,它可 ...
- ML: 降维算法-LLE
局部线性嵌入 (Locally linear embedding)是一种非线性降维算法,它能够使降维后的数据较好地保持原有 流形结构 .LLE可以说是流形学习方法最经典的工作之一.很多后续的流形学习. ...
- linux进程监控和简单的重启&服务的创建 参考自http://blog.csdn.net/lockheed_hong/article/details/73549837
脚本文件 该脚本实现了一个检测进程是否存在,不存在的情况下重启进程并且记录日志. #! /bin/sh proc_name="console/queue/gift.php" # 进 ...
- overflow标签
有时父标签设置了固定的宽高,但子标签把父标签给撑开了,就要在父标签里加一个overflow标签,等于hidden超出的地方隐藏,等于auto超出的地方隐藏,并且多个滚动条 <div style= ...
- 可用于在 Microsoft.NET Framework 4.0 中的 ASP.NET 浏览器定义文件的修补程序
http://support.microsoft.com/kb/2600088 此修补程序为 Internet Explorer 和 Mozilla Firefox 在浏览器定义文件引入了更新的定义. ...
- IDEA创建一个Mybatis逆向工程
Mybatis逆向工程简介: MyBatis Generator (MBG) 是一个Mybatis的代码生成器 MyBatis 和 iBATIS. 他可以生成Mybatis各个版本的代码,和iBATI ...
- 【ZZ】Linux常用指令
linux常用指令 - 个人文章 - SegmentFault 思否 https://segmentfault.com/a/1190000011068772 查看目录下有什么文件信息 ls //lis ...
- 在CentOS6的上安装Windows2012R2的KVM虚拟机
在CentOS6的上安装Windows2012R2的KVM虚拟机 1:上传cn_windows_server_2012_r2_vl_with_update_x64_dvd_6052729.iso下载驱 ...
- [UE4]Datasmith
Datasmith 是帮助您将内容导入到虚幻引擎4中的一组工具和插件. 作为虚幻工作室产品的部分,Datasmith设计用于解决非游戏行业人士所面临的独特挑战,例如建筑.工程.建造.制造.实时培训等行 ...
- [UE4]RepNotify,更新通知
“复制”: 1.Replicated:复制更新 2.RepNotify:更新通知.选择这个选项,会自动生成一个通知函数(如上图所示的“OnRep_Health”),当这个变量的值有变化的时候,这个函数 ...