如何结合find命令实现30天以上文件归档并删除源文件的Bash脚本
脚本修改方案
原脚本未做30天修改时间过滤,直接用find命令做前置筛选即可实现需求,同时修复原脚本遇到特殊文件名易出错、复制失败仍删除源文件的隐患。
核心修改逻辑
- 用
find命令筛选当前目录下修改时间达到30天及以上的文件/文件夹,遍历范围和原脚本一致(仅处理当前目录直接内容,不递归子目录) - 保留原脚本「源文件比目标位置同名文件更新、或目标位置无对应文件时才执行复制」的判断,避免覆盖目标端更新的备份
- 增加复制结果校验:只有复制成功才删除源文件,避免复制失败导致数据丢失
修改后完整脚本
#!/bin/bash # 功能函数 help() { echo "使用方法: archiveer <目标归档目录> 示例: archiveer /home/backup/archive 该命令会自动将当前目录下修改时间超过30天的文件/文件夹归档到指定目录,仅当源文件更新或目标无对应文件时执行复制,复制完成后删除源文件。 目标归档目录为必填参数。" exit } do_archive() { echo "开始执行归档操作" # 用find筛选符合时间要求的文件/文件夹,兼容带特殊字符的文件名 find . -maxdepth 1 -mindepth 1 -mtime +29 -print0 | while IFS= read -r -d '' f do # 去掉find输出的./前缀,拿到纯文件名 filename="${f#./}" target_path="${doelmap}/${filename}" if [[ "${filename}" -nt "${target_path}" ]] then echo "文件/文件夹 ${filename} 比目标端更新或目标端不存在,开始归档" # 复制成功才删除源文件 if cp -rp "$f" "$target_path"; then rm -rf "$f" echo "${filename} 归档完成,已删除源文件" else echo "错误:${filename} 复制失败,保留源文件" fi else echo "文件/文件夹 ${filename} 目标端已存在更新版本,跳过" fi done } # 参数校验 if [[ $1 = "help" || $1 = "-h" || $1 = "--help" ]] then help elif [[ -z $1 ]] then echo "错误:缺少必填参数!" help fi # 初始化变量,自动去掉目标路径末尾的斜杠避免拼接错误 doelmap=${1%/} echo "归档目标目录: ${doelmap}" sleep 1 # 检查目标目录是否存在 if [ ! -d "${doelmap}" ] then mkdir -p "${doelmap}" echo "目标目录 ${doelmap} 已自动创建" else echo "目标目录已存在" fi do_archive echo "脚本执行结束"
关键参数说明
find命令参数解释:-maxdepth 1 -mindepth 1:仅遍历当前目录下的直接文件/文件夹,不递归进入子目录,和原脚本for f in *的遍历范围完全一致-mtime +29:筛选修改时间距离当前时间满30天及以上的条目。find的mtime按24小时为单位向下取整计算,如果写-mtime +30实际匹配的是31天及以上未修改的文件,+29刚好覆盖30天整及以上的需求范围-print0配合read -d '':用空字符作为文件名分隔符,兼容带空格、换行、特殊符号的文件名,避免遍历出错
- 路径处理增加了末尾斜杠自动去除逻辑,避免手动输入路径时末尾多打
/导致路径拼接错误 - 复制操作增加了返回值校验,只有
cp命令执行成功才会删除源文件,避免数据丢失
内容的提问来源于stack exchange,提问作者Patrickkasie
相关产品推荐
相关产品推荐

