如何用Unix脚本检查S3桶指定10个文件的存在性及非零大小
实现步骤与脚本示例
你之前只获取了S3的文件名,没拿到对应大小,所以得先把S3桶里的文件名和大小都存下来,再逐一校验预期文件的存在性和大小。下面是完整的落地方案:
#!/bin/bash # 配置参数(替换为你的实际信息) SrcDir="s3://your-target-bucket/folder-path" FILE_LIST="./fileslist.txt" LOG_FILE="./s3_file_validation.log" NOTIFY_EMAIL="source-team@your-domain.com" # 初始化日志 echo "=== S3文件校验日志 - $(date '+%Y-%m-%d %H:%M:%S') ===" >> $LOG_FILE # 将S3桶内的文件名与大小存入关联数组,方便快速查询 declare -A s3_file_map aws s3 ls $SrcDir/ | awk '{print $4, $3}' | while read file_name file_size; do s3_file_map["$file_name"]=$file_size done # 标记是否存在异常 error_flag=0 # 遍历预期文件列表逐一校验 while read expected_file; do # 跳过空行 [[ -z "$expected_file" ]] && continue # 检查文件是否存在 if [[ -z "${s3_file_map[$expected_file]}" ]]; then echo "[ERROR] 文件缺失:$expected_file 未在S3桶中找到" >> $LOG_FILE error_flag=1 else # 检查文件大小是否大于0KB file_size=${s3_file_map[$expected_file]} if [[ $file_size -eq 0 ]]; then echo "[ERROR] 文件无效:$expected_file 大小为0KB" >> $LOG_FILE error_flag=1 else echo "[SUCCESS] 文件正常:$expected_file 存在,大小为 ${file_size}KB" >> $LOG_FILE fi fi done < $FILE_LIST # 异常情况发送通知 if [[ $error_flag -eq 1 ]]; then echo "S3文件校验发现异常,详情请查看日志:$LOG_FILE" | mailx -s "S3文件校验失败通知" $NOTIFY_EMAIL exit 1 else echo "所有预期文件校验通过" >> $LOG_FILE exit 0 fi
关键细节说明
- 关联数组存储:用
declare -A创建键值对数组,把S3文件名映射到对应大小,后续查询效率更高。 - 日志持久化:所有校验结果追加到日志文件,方便回溯问题。
- 通知机制:用
mailx发送邮件通知(如果你的环境没有mailx,可以替换为企业微信Webhook、Slack机器人等其他通知方式)。 - 空行兼容:自动跳过
fileslist.txt中的空行,避免无效校验。
使用注意事项
- 确保AWS CLI已配置好访问目标S3桶的权限。
- 若
fileslist.txt中的文件名包含空格,需在while read前添加IFS=$'\n',确保按完整文件名读取。 - 根据实际环境调整通知方式的命令。
内容的提问来源于stack exchange,提问作者Rajesh Kumar
相关产品推荐
相关产品推荐

