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

Bash脚本优化:支持多排除目录参数 删除7天前含extract旧文件

Shell文件清理脚本多排除参数支持优化方案

问题原因

原脚本仅对第一个位置参数$1做了排除判断,因此传入多个排除目录时,除第一个参数外的其他排除目录不会被识别,无法满足多参数跳过的需求。

优化后完整脚本

#!/bin/bash
# 定义清理目标根路径
TARGET_DIR="/languages/analytics"

# 校验目标路径是否存在
if [ ! -d "$TARGET_DIR" ]; then
    echo "错误:目标路径 $TARGET_DIR 不存在"
    exit 1
fi

# 切换到目标路径
cd "$TARGET_DIR" || exit 1

# 遍历当前路径下所有条目
for sub_dir in *; do
    # 跳过非目录条目
    [ -d "$sub_dir" ] || continue

    # 标记当前目录是否需要排除,默认不排除
    skip=0
    # 遍历所有传入的排除目录参数
    for exclude_dir in "$@"; do
        if [ "$sub_dir" = "$exclude_dir" ]; then
            skip=1
            break
        fi
    done

    # 不需要排除的目录,执行清理逻辑
    if [ $skip -eq 0 ]; then
        # 查找文件名含extract、修改时间超过7天的普通文件直接删除
        find "$TARGET_DIR/$sub_dir" -type f -mtime +7 -name '*extract*' -delete
    fi
done

关键逻辑说明

  • 新增目标路径合法性校验,避免路径不存在时脚本抛出无意义错误
  • 排除判断逻辑改为双层遍历:外层遍历目标路径下的子目录,内层遍历所有传入的命令行参数,只要当前子目录匹配任意一个传入的排除参数,就标记为跳过,天然支持任意数量的排除目录传入
  • find命令新增-type f限定只处理普通文件,避免误删同名目录;用-delete参数替代-exec rm -f {} \;,执行效率更高,不需要反复fork rm进程
  • 无参数传入时,内层遍历参数的循环不会执行,所有子目录的skip标记都为0,会全部执行清理,完全兼容无参数运行的场景

使用示例

  • 清理所有子目录符合规则的文件(无参数运行):
    ./clean_script.sh
  • 清理除angular外所有子目录符合规则的文件(单排除参数):
    ./clean_script.sh angular
  • 清理除ruby、react、shell外所有子目录符合规则的文件(多排除参数):
    ./clean_script.sh ruby react shell

安全提示:首次执行脚本前建议先预览待删除文件列表确认规则匹配正确,可临时将find命令中的-delete参数替换为-print,确认输出的文件列表符合预期后再恢复删除逻辑。

内容的提问来源于stack exchange,提问作者Sonu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 04:01:13