如何编写Linux脚本删除目录多余文件 仅保留5个文件
Linux目录保底清理脚本
核心目标是清理指定目录文件时,强制保留至少5个文件,绝不超删。
核心逻辑
- 执行删除前先校验传入的目录路径合法性
- 优先删除最早修改的旧文件,符合常规日志、临时文件清理的通用需求
- 每删除1个文件前都会重新统计当前目录剩余文件数,只要剩余数降到5就立刻终止所有删除操作
- 默认不递归清理子目录,避免误删嵌套文件,可按需修改参数开启递归
完整脚本代码
#!/bin/bash # 校验入参 if [ $# -ne 1 ]; then echo "使用方法: $0 待清理目录的绝对/相对路径" exit 1 fi TARGET_DIR=$1 # 校验目标路径是否为有效目录 if [ ! -d "$TARGET_DIR" ]; then echo "错误:路径 $TARGET_DIR 不存在或不是目录" exit 1 fi echo "开始清理目录:$TARGET_DIR,规则:始终保留至少5个文件" # 按修改时间升序列出所有一级普通文件(从最旧到最新) find "$TARGET_DIR" -maxdepth 1 -type f -printf "%T@ %p\n" | sort -n | cut -d' ' -f2- | while read -r old_file; do # 实时统计当前剩余普通文件数量 current_remain=$(find "$TARGET_DIR" -maxdepth 1 -type f | wc -l) # 达到留存阈值直接退出循环 if [ "$current_remain" -le 5 ]; then echo "当前剩余文件数为 $current_remain,触发保底留存规则,停止删除" break fi echo "删除文件:$old_file (删除前剩余文件数:$current_remain)" rm -f -- "$old_file" done echo "目录清理执行完毕"
使用方法
- 把上面的代码保存为
cleanup.sh,执行chmod +x cleanup.sh给脚本加执行权限 - 调用时传入要清理的目录路径即可,例如清理/var/log/nginx下的旧日志就执行:
./cleanup.sh /var/log/nginx
可调整的配置项
- 如果需要递归清理所有子目录内的文件,把两处find命令里的
-maxdepth 1参数删掉即可 - 如果要改删除优先级(比如按文件大小从小到大删、按文件名排序删),修改sort后的参数就行:比如按大小排序把
-printf "%T@ %p\n" | sort -n换成-printf "%s %p\n" | sort -n - 如果要调整保底留存的文件数量,把判断条件里的
5改成你需要的数字就行
提示:正式执行前可以先把脚本里的
rm -f -- "$old_file"这行注释掉,先跑一遍看输出的待删除文件列表是否符合预期,确认没问题再放开删除操作,避免误删。
内容的提问来源于stack exchange,提问作者VIP-Commuter
相关产品推荐
相关产品推荐

