实践描述:
亲爱的慕友们,在我们学习了 ls、grep、find、重定向 和 管道 后,是不是发现:Shell 是自动化运维的“瑞士军刀”?在 ROS2 开发中,节点日志常散落在 /tmp 或 ~/.ros/log 中。本项目请你编写一个脚本,自动收集最近 1 小时内所有 .log 文件,并打包压缩归档。
题目:
请你编写一个脚本,自动收集最近 1 小时内所有 .log 文件,并打包压缩归档。
作业描述
一、开发语言与环境要求
linux系统
二、程序整体要求
脚本名:
log_collector.sh
功能:
- 查找 $HOME/.ros/log 目录下 最近 1 小时内修改过的 .log 文件
- 将这些文件复制到 ~/ros_logs_archive/YYYYMMDD_HHMM/(按当前时间命名)
- 使用 tar.gz 压缩该目录,命名为 ros_logs_$(date +%Y%m%d_%H%M).tar.gz
- 若无日志文件,输出提示并退出(不创建空包)
- 必须使用:
find + -newermt "1 hour ago"
mkdir -p
tar -czf
- 重定向错误信息到 /dev/null(避免干扰)
三、详细设计规范
# 手动创建测试日志
mkdir -p ~/.ros/log
echo "test" > ~/.ros/log/node_1.log
touch -d "5 minutes ago" ~/.ros/log/node_1.log
./log_collector.sh
# 应生成 ~/ros_logs_archive/20251224_1120/ros_logs_20251224_1120.tar.gz
四、提交内容
- log_collector.sh(可执行权限)
- README.md:说明使用方法 + 回答讨论问题
评分标准是什么?
正确性
- 正确使用 find -newermt “1 hour ago”(10)
- 目录按当前时间命名(10)
- 成功生成 .tar.gz 包(10)
- 无日志时提示并退出,不建空目录(10)
命令规范性
- 使用 mkdir -p(5)
- 正确使用 tar -czf(5)
- 错误输出重定向到 /dev/null(5)
- 路径变量加双引号防空格(10)
健壮性
- $HOME/.ros/log 不存在时能处理(如跳过或提示)(10)
- 脚本可重复运行不报错(5)
工程实践
- 脚本开头有 #!/bin/bash(5)
- 变量命名清晰(如 ARCHIVE_DIR)(5)
文档与讨论
- README 含使用示例(5)
- 准确回答“为何 -newermt 更可靠”(如避免时区/夏令时问题)(5)