shell 備份並刪除幾日內的歷史文件

20200622 需要做一個每天定時備份的任務,同時,刪除若干天以前的歷史文件

我的環境:
ubuntu 20.04
ubuntu 18.04

設想:

  1. 備份 /data 目錄到 /data+yyyymmdd+hhmmss 目錄
  2. 壓縮 /data+yyyymmdd+hhmmss 爲 zip (zip 時加上 -m 會自動刪除)
  3. 刪除 zip 歷史文件

學習過程中發現以上思路搞反了,應該直接壓縮到備份目錄即可

  1. 壓縮 /data 目錄到 ./bak/data+yyyymmdd+hhmmss.zip
  2. 刪除歷史 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 {} \;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章