文件替换(交互式)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 谷 ...
随机推荐
- ASP.NET AJAX入门系列(5):使用UpdatePanel控件(二) UpdatePanel
UpdatePanel可以用来创建丰富的局部更新Web应用程序,它是ASP.NET 2.0 AJAX Extensions中很重要的一个控件,其强大之处在于不用编写任何客户端脚本,只要在一个页面上添加 ...
- Video to SDI Tx Bridge模块video_data(SD-SDI)处理过程
Video to SDI Tx Bridge模块video_data(SD-SDI)处理过程 1.Top Level Block Diagram of Video to SDI TX Bridge V ...
- Vivado HLS初识---阅读《vivado design suite tutorial-high-level synthesis》(2)
Vivado HLS初识---阅读<vivado design suite tutorial-high-level synthesis>(2) 1.实验目的 2.启动命令行 将命令行切换 ...
- Set up an SSH key with Sourcetree on macOS
1. 打开 sourcetree,进入设置-账户: 2. 选择添加账户,托管主机选择 Bitbucket(或Github),再连接账号,登录已有的 Bitbucket 账号(或 Github 账号), ...
- TStrings (TStringList)很有功能
用 TStrings的Object 保存类的方式,来保存除了Items以外的值. 今天才发现,原来,TStrings下,还有 Items,Values,Items.Names,Items.Values ...
- ckeditor_4.5.10_full,ckfinder_aspnet_2.6.2,插件使用
1.ckfinder文件上传的权限: public override bool CheckAuthentication() { // WARNING : DO NOT simply return &q ...
- P2670扫雷
链接 这是一个并不像搜索的题(其实它是个循环) 对于输入的a数组,一个一个遍历下来,如果a[i][j]是雷,那(i,j)周围8个点对应的位置雷数就+1(用b数组记录),注意不能超出边界,输出时,如果a ...
- 峰Redis学习(5)Redis 数据结构(Set的操作)
第五节:Redis 数据结构之Set 类型 存储Set,这里的Set是无序的: 和List类型不同的是,Set集合中不允许出现重复的元素 Set可包含的最大元素数量是4294967295 存储 ...
- Java学习——多线程例子:李四王五
package cys; public class Example9_2 { public static void main(String[] args) { // TODO Auto-generat ...
- Rstdio 中print中文乱码
在Consol中输入 Sys.setlocale("LC_ALL","Chinese") 即可