argor

   :: 首页  :: 新随笔  :: 联系 ::  :: 管理

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


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

  程序目录结构

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

 

  主程序 Replace:

 1 #!/bin/bash
 2 # Replace-1.3
 3 # The author: donatello
 4 # 
 5 chkdep() {
 6     [ -z $1 ] && echo "Directory ?"
 7     [ -z $1 ] && exit 4
 8     [ ! -d $1 ] && echo "Without directory, please again."
 9     [ ! -d $1 ] && exit 6
10     [ -d $1 ] && baseDirectory=$1
11 }
12 chkdep $1
13 # Format the "baseDirectory".
14 declare -g baseDirectory="$(dirname $baseDirectory)"/"$(basename $baseDirectory)"
15 declare -g fileName=$(ls -1R .)
16 declare -g -a objectFileName
17 declare -g -i obj=1
18 declare -gr father="${DONATELLO_HOME}/bin"
19 echo $father
20 
21 clear
22 # Call the functions.
23 #. displayHeader
24 . ${father}/lib/findObjectFile
25 . ${father}/lib/printObject
26 . ${father}/lib/doReplace
27 
28 # Define count function.
29 # Count the number of array elements.
30 count_objectFileName() {
31     local -i k=${#objectFileName[@]}
32     [ 1 -ge $k ] && echo -e "\t\fCheck for new files" && return 33
33     return 0
34 }
35 #
36 findFile
37 #count_objectFileName && [ 33 -eq $? ] && exit 33
38 count_objectFileName
39 [ 33 -eq $? ] && exit 33
40 printOjectFileDirName
41 replaceFile
42 echo -e '\nShell script ends.'
43 # Shell script over.
View Code

 

 

  寻找目标文件 findObjectFile

 1 #!/bin/bash
 2 # The command that will replace the file if exists.
 3 MV="$(which --skip-alias mv) -v"
 4 
 5 # Check input by user when there are many file directory will be confirm.
 6 confirmInfo() {
 7     #echo "k=$k"
 8     while true; do
 9         # Print files there are same name.
10         if [ 1 -lt $k ]; then
11             echo -e "file of the same name:\f<< $i >>"
12             for((i=1; i<=k; i++)); do
13             #    name=$(env basename ${file[$i]})
14             #    echo -e "\tNo.$i ${name}\n"
15                 echo -e "\tNo.$i ${file[$i]}\n"
16             done
17         fi
18 
19         # Confirm file.
20         while true; do
21             read -p "Please confirm the path of the file that will be replace. No.-> " -N 1 confirm 1>/dev/null && echo ""
22             if [ $confirm -ge 1 ] && [ $confirm -le $k ]; then
23                 break
24             else
25                 echo "No's error."
26             fi
27         done
28 
29         # Reconfirm file.
30         read -p "Do you confirm you choice ? (yY/nN)... " -N 1 reconfirm && echo ""
31         if [ 'y' = $reconfirm ]; then
32             clear
33             break
34         elif [ 'n' = $reconfirm ]; then
35             echo "Please confirm again."
36         else
37             echo "Char's invalid."
38         fi
39     done
40     #printf "Good luck, the file is %s.\n" "file[$confirm]"
41     return $confirm
42 }
43 
44 # Find the file that will be replaced.
45 findFile() {
46     local -a file
47     local -i k=1
48     local -i confirm=0
49     local -l reconfirm=n
50 
51     for i in $(echo $fileName); do # cycle: A file is looped once.
52         [ ! -f $i ] && continue
53 
54         objectFileName=$(find $baseDirectory -name $i -print)
55         for item in $(echo "${objectFileName}"); do
56             #echo "item $k: $item"
57             file[$k]=${item}
58             let k=k+1
59         done
60         k=${#file[@]}
61         #echo $i $k
62 
63         # There is no file with the same name, direct replacement.
64         if [ 1 -eq $k ]; then
65             objectFileName[$obj]=${file[$k]}
66             let obj=obj+1
67         fi
68         # When the same file name exist, the user is required
69         # to confirm the correct file path.
70 
71         # Call local function: confirmInfo
72         if [ 1 -lt $k ]; then
73             confirmInfo
74             k=$?
75             #echo "The file is ${file[${answer}]}"
76             objectFileName[$obj]=${file[$k]}
77             let obj=obj+1
78         fi
79 
80     #    sleep 1
81         # variable reset.
82         k=1
83         unset file
84         # over
85     done
86 }
87 
88 echo "Will find files..."
89 # Over
View Code

 

 

  打印输出替换对应关系 printObject

 1 #!/bin/bash
 2 
 3 BASENAME=$(which --skip-alias basename)
 4 
 5 printOjectFileDirName() {
 6     clear
 7     #. displayHeader
 8     echo "Print object files..."
 9     local -i k=${#objectFileName[@]}
10     #echo "length, k=$k"
11     for((i=1; i<k; i++)); do
12         echo "Will move $(${BASENAME} ${objectFileName[$i]}) --->> ${objectFileName[$i]}"
13     done
14 
15     . ${father}/lib/progressBar
16 }
17 # Over
View Code

 

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

 1 #!/bin/bash
 2 #
 3 declare -i cycle=1
 4 declare -i length=15
 5 declare -i k=0
 6 #echo -n '-------------------------------------------------------'
 7 
 8 printBar(){
 9     for((i=0; i<length; i++)); do
10         echo -n '-'
11     done
12 
13     printf "\r"
14     for((i=0; i<cycle*length; i++)); do
15             echo -n '-' && sleep 0.05
16             echo -e -n '\b\' && sleep 0.05
17             echo -e -n '\b-' && sleep 0.05
18             echo -e -n '\b/' && sleep 0.05
19             echo -e -n '\b*' && sleep 0.3
20             echo -e -n '\b-'
21 
22             let k=k+1
23             if [ $k -eq $length ]
24             then
25                     k=0
26                     printf "\r"
27             fi
28     done
29 }
30 printBar
View Code

 

 

  替换文件 doReplace:

 1 #!/bin/bash
 2 MV="$(which --skip-alias mv) -v"
 3 BASENAME=$(which --skip-alias basename)
 4 
 5 replaceFile() {
 6     clear
 7     echo "Replace object files..."
 8     local -i k=${#objectFileName[@]}
 9     for((i=1; i<k; i++)); do
10         $MV $(${BASENAME} ${objectFileName[$i]}) ${objectFileName[$i]}
11     done
12 }
13 # do it
14 # Over
View Code

 

 这个例子,没有遇到重复命名的文件。运行效果:(运行过程中,会有几次清屏,需要翻动混动条,才能看到完整下边的内容)

 

[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$1.class --->> /opt/view/release/task/WEB-INF/classes/com/zhaocai/task/MemberTimeTransaction$1.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$1.class' -> `/opt/view/release/task/WEB-INF/classes/com/zhaocai/task/MemberTimeTransaction$1.class'
removed `MemberTimeTransaction$1.class'
`MemberTimeTransaction.class' -> `/opt/view/release/task/WEB-INF/classes/com/zhaocai/task/MemberTimeTransaction.class'
removed `MemberTimeTransaction.class'

Shell script ends.

 

posted on 2017-11-30 15:31  argor  阅读(578)  评论(0)    收藏  举报