Linux之shell指令碼程式設計例項--遍歷所有檔案,並按月份打成zip包
阿新 • • 發佈:2018-12-20
原始檔案形式如下圖:
經過shell指令碼處理之後,按月生成的zip包如下圖:
完成上述工作的shell指令碼如下:
#下面這行程式碼並不是註釋,它的作用是表名該指令碼使用哪個shell直譯器
#! /bin/sh
#變數賦值,等號=兩邊不能有空格
#需要處理的檔案目錄
from=/data/IFP/data/register
#zip包存放目錄
to=/data/myimg
#判斷符號、運算子號等,左右兩邊的變數或值,與符號之間都需有空格
#判斷原始檔目錄是否為空
if test ! -d $from
then
mkdir -p $from
fi
#path dir to
if test ! -d $to
then
mkdir -p $to
fi
#從命令入參獲取開始時間和結束時間
#start date
start=$1
#end date
end=$2
#如果開始時間小於登入結束時間,則執行迴圈
while [ $start -le $end ]
do
#先清空陣列
unset fileList
#查詢原始檔路徑下所有檔案,使用grep過濾包含開始時間的檔案
#此處使用小括號把命令括起來執行,否則獲取陣列長度一直為1
fileList=(`ls $from/* |grep "${start}" `)
len=${#fileList[@]}
echo "len:$len"
if test $len -gt 0
then
mkdir -p $to/${start}
#for filename in $fileList如此使用不規範,出現只遍歷第一個值的錯誤情況
for filename in ${fileList[@]}
do
if [ -f $filename ]
then
#將原始檔複製到按月分開的檔案中
cp $filename ${to}/${start}/
else
continue
fi
done
#將按月存放的原始檔打成zip包,-q表示安靜的執行,-m表示打包完成後刪除原始檔
zip -rqm $to/${start}.zip ${to}/${start}
fi
#將開始時間增加一個月
start=`date -d "+1 month ${start}01" +%Y%m`
done
#delete package
#刪除目標檔案中存放複製原始檔的資料夾,
#ls ${to}/ |grep -v "zip"表示查詢指定目錄加所有檔案,但過濾調zip檔案,-v是取反,不包含的意思
#因為zip命令使用了-m引數,即不再用使用下面的命令
#rm -rf `ls ${to}/ |grep -v "zip"`
shell指令碼檔案儲存為:month_zip.sh,並賦給該使用者指令碼可執行許可權:
[root@localhost myshell]# ls -l month_zip.sh
-rwxr-xr-x 1 root root 725 Jul 7 15:37 month_zip.sh
執行month_zip.sh指令碼命令如下:
[root@localhost myshell]# sh month_zip.sh 201701 201708
學習shell可以參照:Linux Shell指令碼教程:30分鐘玩轉Shell指令碼程式設計
補充:date命令使用,可以參照date命令,其中-d引數也可以用–date替換。
還有,如果在指定日期上加減時間的格式如下:
date -d "date desc str" +formate
舉例如下:
1、2017-07-07的前2天
[root@localhost ~]# date -d "-2 day 2017-07-07" +%Y-%m-%d
2017-07-05
2、2017-07-07的後3天
[root@localhost ~]# date -d "+3 day 2017-07-07" +%Y-%m-%d
2017-07-10
如果是月份操作的話,指定的日期,也必須給到具體的天,比如下面,加減操作在月上,但指定的日期必須有天,天可以隨意
3、2017-07前2個月
[root@localhost ~]# date -d "-2 month 2017-07-01" +%Y-%m
2017-05
4、2017-07後3個月
[root@localhost ~]# date -d "+3 month 2017-07-01" +%Y-%m
2017-10