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 {} \;

4、 后记

  1. 实际环境中运行时,因为 data 所在目录比较复杂,所以开始时,直接在 zip 命令之前加上了一条

    cd /home/dhbm/atc/build/atc-linux-1.6.0-testnet/

  2. 虽然是可以运行正常,但是,查看 cron.log 时,发现总是多了一层 CMD

  3. 使用变量保存路径之后,再 zip 时,直接使用了绝对路径,这样子的话,无论这个 bakanddel.sh 在什么位置,都可以直接调用了

最终的代码如下:

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
	
# cd /home/dhbm/atc/build/atc-linux-1.6.0-testnet
path_bak='/home/dhbm/atc/build/atc-linux-1.6.0-testnet/bak/'
bakfile="data.`date '+%Y%m%d-%H%M%S'`.zip"
bak_file123=$path_bak$bakfile

path_data='/home/dhbm/atc/build/atc-linux-1.6.0-testnet/data/'

echo $bak_file123
echo $path_data

# zip ./data to ./data/bak
#
zip  $bak_file123  $path_data
#       
echo zip  $bak_file123  $path_data run ok!!

echo 查找当前目录不包含子目录 7 天前的所有 log 文件,并删除
#
find $path_bak -maxdepth 1 -type f -mtime +7 -name "*.zip" -exec rm -rf {} \;

你可能感兴趣的:(日常记录,运维记录)