前语
咱们在服务器运行一些服务经常会产生很多临时文件,
而有些临时文件不定时处理很简单就打满了整个磁盘;
所以有必要去定时清理,基于这个需求咱们就可以搞一个脚本结合crontab
或许服务调度这些来使用;
脚本完成
#!/bin/bash
# cleanup_old_files - 清理指定目录中指定天数之前的旧文件
# $1: 目录称号
# $2: 天数
# $3: (可选)关键字,用于匹配文件名
function cleanup_old_files() {
local dir="$1" # 目录称号
local days="$2" # 天数
local keyword="$3" # 匹配文件名的关键字
# 参数有效性查看
if [ -z "$dir" ]; then
echo "过错:目录参数为空."
return 1
fi
if [ ! -d "$dir" ]; then
echo "过错:目录 $dir 不存在."
return 1
fi
if ! [[ "$days" =~ ^[0-9]+$ ]]; then
echo "过错:天数参数无效."
return 1
fi
# 假如未指定天数,则默认为当天
if [ -z "$days" ]; then
days=0
fi
# 构建查找指令,根据 $days 的值进行区分
if [ "$days" -eq 0 ]; then
find_cmd="find -L \"$dir\" -type d -o -type f -mtime 0"
else
find_cmd="find -L \"$dir\" -type d -o -type f -mtime +$days"
fi
# 假如指定了关键字,则参加查找指令中
if [ -n "$keyword" ]; then
find_cmd+=" -name \"*$keyword*\""
fi
# 打印完好指令
echo "执行指令: $find_cmd"
# 执行查找并删去文件
if [ "$days" -eq 0 ]; then
echo "正在清理目录 $dir 中当天创建的$(if [ -n "$keyword" ]; then echo "包括关键字 $keyword 的 "; else echo "一切 "; fi)文件..."
else
echo "正在清理目录 $dir 中 $days 天之前创建的$(if [ -n "$keyword" ]; then echo "包括关键字 $keyword 的 "; else echo "一切 "; fi)文件..."
fi
# 经过-exec rm -rf {} + 删去查找到的文件
if eval "$find_cmd -exec rm -v -rf {} +" >/dev/null; then
if [ "$days" -eq 0 ]; then
echo "已删去当天的旧文件."
else
echo "已删去 $days 天之前的旧文件."
fi
else
echo "删去失利."
return 1
fi
}
# 示例用法
# cleanup_old_files "/path/to/directory" 30 "log"
# cleanup_old_files "/path/to/directory" 0 "log"
总结
注意事项1:mtime 为0的状况
值得注意的是,mtime
为0的时分,也便是咱们想模仿当天,不能带修饰符(+/-
);
Debian和MacOS执行的表现是没有报错,可是没有任何操作,所以代码里边做了一个区分;
注意事项2:/tmp为软链的时分
若是find
指令想要检索到里边的内容,记得带-L
,否则没法检索出任何东西;
# 在mac下tmp是一个软链链接到/private/tmp
ls -l /tmp
lrwxr-xr-x@ 1 root wheel 11 Dec 2 19:37 /tmp -> private/tmp
带上-L
之后就能兼容Linux和MacOS两个渠道,便利本地调试也能测试;
这个参数大体的作用便是递归去找,所以符号链接也能被检索;
不带的状况下默认都是只找硬链接,符号链接就会直接忽略。
有不对之处请留言,谢谢阅读!