如何归档特定文件夹中X小时前的日志文件?原脚本按小时处理失效
解决按小时归档日志的find脚本问题
嘿,我懂你遇到的麻烦了——原脚本里的-mtime +$hours是核心问题所在!因为find的-mtime参数单位是天,不是小时。比如你给hours传个2,-mtime +2会去找修改时间超过48小时的文件,完全不是你要的2小时前的目标文件。
给你两个实用的解决方案:
方法1:用-mmin转换为分钟计算
-mmin参数是按分钟判断文件修改时间的,我们只需要把小时数转换成分钟(小时×60)就行。修改后的脚本如下:
# 先确保目标归档目录存在,避免mv报错 mkdir -p "${DEST_DIRECTORY}/${TAR_DIR_NAME}" # 查找X小时前的日志文件并移动 find "$DEST_DIRECTORY"/*.log -type f ! -name "*.tar.gz" -mmin +$((hours * 60)) -exec mv '{}' "${DEST_DIRECTORY}/${TAR_DIR_NAME}/" +
这里用+代替\;是让mv批量处理文件,比逐个处理效率更高;另外给所有变量加双引号,能防止路径里有空格或特殊字符导致命令出错。
方法2:用-newermt指定直观的时间点
如果你觉得计算分钟麻烦,可以用-newermt直接指定“X小时前”的时间点,这个参数更直观:
mkdir -p "${DEST_DIRECTORY}/${TAR_DIR_NAME}" find "$DEST_DIRECTORY"/*.log -type f ! -name "*.tar.gz" ! -newermt "$hours hours ago" -exec mv '{}' "${DEST_DIRECTORY}/${TAR_DIR_NAME}/" +
! -newermt "$hours hours ago"表示找修改时间早于“X小时前”的文件,完全匹配你的需求。不过要注意,-newermt是GNU find的特性,大部分Linux发行版都支持,但如果是macOS这类BSD系统,得换成-newerct。
额外提醒
- 一定要确认
$hours变量是合法的数字,别传字符串或者负数,否则脚本会出问题。 - 如果你的日志文件名带特殊字符(比如空格),双引号包裹变量的操作就特别重要,能避免很多意外bug。
内容的提问来源于stack exchange,提问作者BlackOcean
相关产品推荐
相关产品推荐

