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参数替换为
内容的提问来源于stack exchange,提问作者Sonu
相关产品推荐
相关产品推荐

