编写需用户确认再删除的Bash脚本:如何统计早于指定天数的文件数量
Bash 按天数归档文件脚本实现方案
一、符合时间条件的文件数量统计方法
你之前写法报错的核心原因是命令替换语法错误,执行命令并将结果赋值给变量需要用$()包裹命令,同时-mtime参数需要加符号前缀:+天数代表早于指定天数,-天数代表晚于指定天数,无符号代表刚好是指定天数修改的文件。
通用统计写法(适合绝大多数场景)
# 统计当前目录下早于$days天的普通文件数量 file_count=$(find . -type f -mtime +"$days" | wc -l)
兼容特殊文件名的统计写法(文件名含换行符时也能正确统计)
file_count=$(find . -type f -mtime +"$days" -printf '.' | wc -c)
统计完成后可以直接判断数值:
if [ "$file_count" -eq 0 ]; then echo "未找到符合条件的文件" exit 0 fi echo "共找到${file_count}个符合条件的文件"
二、满足需求的完整脚本实现
以下脚本完全覆盖你需要的所有功能:文件数量统计、全局操作确认、单文件归档确认、压缩包移动确认:
#!/bin/bash # 1. 校验天数输入合法性 read -p "请输入归档的天数阈值(将归档早于该天数的文件):" days if ! [[ "$days" =~ ^[0-9]+$ ]]; then echo "输入错误,请输入正整数" exit 1 fi # 2. 统计符合条件的文件数量 file_count=$(find . -type f -mtime +"$days" -printf '.' | wc -c) if [ "$file_count" -eq 0 ]; then echo "未找到早于${days}天的文件,脚本退出" exit 0 fi echo "共找到${file_count}个符合条件的文件,是否继续处理?(y/n)" read -n1 global_confirm echo if [ "${global_confirm,,}" != "y" ]; then echo "用户取消操作,脚本退出" exit 0 fi # 3. 逐文件确认后归档并删除 zip_name="packed.zip" # 先删除已存在的旧压缩包避免冲突 [ -f "$zip_name" ] && rm "$zip_name" find . -type f -mtime +"$days" -print0 | while IFS= read -r -d '' file; do echo "是否归档文件:$file ?(y/n/s=跳过所有)" read -n1 file_confirm echo case "${file_confirm,,}" in y) zip "$zip_name" "$file" # 压缩成功后删除源文件 if [ $? -eq 0 ]; then rm -f "$file" echo "已归档并删除源文件:$file" fi ;; s) echo "跳过后续所有文件" break ;; *) echo "已跳过文件:$file" ;; esac done # 4. 确认后移动压缩包到根目录 if [ -f "$zip_name" ]; then echo "是否将压缩包${zip_name}移动到根目录?(y/n)" read -n1 mv_confirm echo if [ "${mv_confirm,,}" = "y" ]; then mv "$zip_name" / echo "已将压缩包移动到根目录" else echo "压缩包保留在当前目录" fi fi
关键逻辑说明
- 用
-print0+read -d ''的写法遍历文件,完美兼容文件名带空格、换行、特殊符号的场景,不会出现遍历报错 - 所有确认步骤支持大小写输入,输入Y/y都会识别为同意
- 新增了跳过所有剩余文件的选项,文件数量较多时可以快速操作
- 所有操作都加了成功校验,避免压缩失败误删源文件
- 如果需要归档刚好等于指定天数、或晚于指定天数的文件,修改
-mtime +"$days"的符号即可:去掉+代表刚好等于指定天数,改成-代表晚于指定天数
内容的提问来源于stack exchange,提问作者socke
相关产品推荐
相关产品推荐

