20200622 需要做一個每天定時備份的任務,同時,刪除若干天以前的歷史文件
我的環境:
ubuntu 20.04
ubuntu 18.04
設想:
- 備份 /data 目錄到 /data+yyyymmdd+hhmmss 目錄
- 壓縮 /data+yyyymmdd+hhmmss 爲 zip (zip 時加上 -m 會自動刪除)
- 刪除 zip 歷史文件
學習過程中發現以上思路搞反了,應該直接壓縮到備份目錄即可
- 壓縮 /data 目錄到 ./bak/data+yyyymmdd+hhmmss.zip
- 刪除歷史 zip 文件
1、 備份整個目錄
這個思路被淘汰
$ vim bakdata.sh
#!/bin/bash
# if no bak ,mkdir first
if [ ! -d "./bak/" ];then
mkdir ./bak
# else
# echo "文件夾已經存在"
fi
# cp data to bak
#
cp -R data './bak/data'.`date '+%Y%m%d-%H%M%S'`
echo 'data has bakuped to ' 'data'.`date '+%Y%m%d-%H%M%S'`
2、 先壓縮,再備份
好像只需要一條指令即可啊
預先在 data 所在目錄建立好一個 bak 子目錄
方式1: 腳本放在 ./data 的子目錄 ./data/bak
zip 'data'.`date '+%Y%m%d-%H%M%S'`.zip ../data
方式2: 腳本放在 ./data 同一級目錄
zip './bak/data'.`date '+%Y%m%d-%H%M%S'`.zip ./data
方式3: 腳本放在其他目錄
zip '/Users/dhbm/Desktop/shelltest/bak/data'.`date '+%Y%m%d-%H%M%S'`.zip /Users/dhbm/Desktop/shelltest/data
我選擇方式2
vim zipbakdata.sh
#!/bin/bash
if [ ! -d "./bak/" ];then
mkdir ./bak
# else
# echo "文件夾已經存在"
fi
# zip ./data to ./data/bak
#
zip './bak/data'.`date '+%Y%m%d-%H%M%S'`.zip ./data >>logbak.txt
echo './bak/data'.`date '+%Y%m%d-%H%M%S'`.zip completed! >>logbak.txt
2、 刪除歷史文件
只是分別學習,所以,這個腳本和以上備份腳本並不連續一支
$ vim finddel.sh
#!/bin/bash
# 以下幾條純粹爲了測試而創建的,實際運行時可以註釋掉
touch -d "2020-04-18 08:00:00" test1.log
touch -d "2020-04-18 08:00:00" test2.log
touch -d "2020-04-18 08:00:00" test3.log
touch -d "2020-04-18 08:00:00" test4.log
touch -d "2020-04-18 08:00:00" test5.log
# logtest 子目錄下也建立 5 個
if [ ! -d "./logtest/" ];then
mkdir ./logtest
# else
# echo "文件夾已經存在"
fi
touch -d "2020-04-18 08:00:00" ./logtest/test11.log
touch -d "2020-04-18 08:00:00" ./logtest/test12.log
touch -d "2020-04-18 08:00:00" ./logtest/test13.log
touch -d "2020-04-18 08:00:00" ./logtest/test14.log
touch -d "2020-04-18 08:00:00" ./logtest/test15.log
echo =============================
#
# 查找當前目錄不包含子目錄 2 天前的所有 log 文件
# 然後, ls 出來
echo 使用 maxdepth,查找當前目錄不包含子目錄 2 天前的所有 log 文件
# 使用 maxdepth=1 ,不包含子目錄
find ./ -maxdepth 1 -type f -mtime +2 -name "*.log" -exec ls -l {} \;
#
echo -----------------------------
#
echo 使用 prune,查找當前目錄不包含子目錄 2 天前的所有 log 文件
# 使用 prune 剪枝參數,不包含子目錄
find ./ -type f -prune -o -mtime +2 -name "*.log" -exec ls -l {} \;
#
echo -----------------------------
#
# 查找當前目錄含子目錄 2 天前的所有 log 文件
# 然後,ls 出來
echo 查找當前目錄含子目錄 2 天前的所有 log 文
find ./ -mtime +2 -name "*.log" -exec ls -l {} \;
# 以下將全部刪除
# 查找當前目錄不包含子目錄 2 天前的所有 log 文件
# 然後,rm
echo =============================
echo =============================
#
echo 查找當前目錄不包含子目錄 2 天前的所有 log 文件,並刪除
find ./ -maxdepth 1 -type f -mtime +2 -name "*.log" -exec rm -rf {} \;
#
echo -----------------------------
# 查找當前目錄含子目錄 2 天前的所有 log 文件
# 然後,ls 出來
echo 刪除之後,還剩下子目錄的 5 個log
find ./ -mtime +2 -name "*.log" -exec ls -l {} \;
# 查找當前目錄含子目錄 2 天前的所有 log 文件
# 然後,rm
echo 查找當前目錄含子目錄 2 天前的所有 log 文件,並刪除
find ./ -mtime +2 -name "*.log" -exec rm -rf {} \;
#
echo 子怒擼下 log 也刪除之後,什麼都沒有了
find ./ -mtime +2 -name "*.log" -exec ls -l {} \;
3、任務
備份,並刪除 7 日之前的歷史文件
爲了驗證結果,先在 bak 目錄下建立幾個假的 zip 歷史文件
$ touch -d “2020-04-18 08:00:00” test1.zip
$ touch -d “2020-04-18 08:00:00” test2.zip
$ touch -d “2020-04-18 08:00:00” test3.zip
$ touch -d “2020-04-18 08:00:00” test4.zip
$ touch -d “2020-04-18 08:00:00” test5.zip
$ vim bakanddel.sh
#!/bin/bash
if [ ! -d "./bak/" ];then
mkdir ./bak
# else
# echo "文件夾已經存在"
fi
# 判斷是否安裝了zip
if ! type zip >/dev/null 2>&1; then
echo '必須先安裝 zip ! ';
exit;
# else
# echo 'zip 已安裝';
fi
# zip ./data to ./data/bak
#
zip './bak/data'.`date '+%Y%m%d-%H%M%S'`.zip ./data >>logbak.txt
echo './bak/data'.`date '+%Y%m%d-%H%M%S'`.zip completed! >>logbak.txt
echo 查找當前目錄不包含子目錄 7 天前的所有 log 文件,並刪除
find ./bak/ -maxdepth 1 -type f -mtime +7 -name "*.zip" -exec rm -rf {} \;