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