1. 程式人生 > >Linux之shell指令碼程式設計例項--遍歷所有檔案,並按月份打成zip包

Linux之shell指令碼程式設計例項--遍歷所有檔案,並按月份打成zip包

原始檔案形式如下圖:
這裡寫圖片描述

經過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