You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 12:57:11