You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写Shell脚本扫描S3文件提取列头输出日志的实现方法

完整实现脚本

直接替换你现有的脚本框架即可,先修改脚本开头的配置项为你自己的实际参数:

#!/bin/bash
# -------------------------- 配置项 按需修改 --------------------------
# 要扫描的目标S3文件夹路径,必须带s3://前缀,结尾加斜杠
S3_TARGET_PATH="s3://your-bucket-name/your/target/folder/"
# 结果输出日志路径
LOG_FILE="my_s3_results.txt"
# 要提取的文件头部行数,默认取第1行作为列头,需要取前3行就把值改成3
HEADER_FETCH_LINES=1
# -------------------------------------------------------------------

# 初始化日志文件
echo "Log File - " > "$LOG_FILE"
date >> "$LOG_FILE"
echo -e "\n=== 文件名与列头映射结果 ===" >> "$LOG_FILE"

# 扫描S3路径下所有文件,过滤掉PRE开头的子目录项,提取文件名
aws s3 ls "$S3_TARGET_PATH" | grep -v "^PRE" | awk '{print $NF}' | while read -r file_name; do
    # 跳过空行/空文件名
    [ -z "$file_name" ] && continue

    full_file_path="${S3_TARGET_PATH}${file_name}"
    echo "正在处理: $full_file_path"

    # 提取文件表头:注意原来的hdfs dfs -ls是列目录命令,读内容要用-cat,压缩文件换成-text即可
    header_content=$(hdfs dfs -cat "$full_file_path" | head -n "$HEADER_FETCH_LINES")

    # 结果写入日志
    echo "文件名: $file_name" >> "$LOG_FILE"
    echo "完整S3路径: $full_file_path" >> "$LOG_FILE"
    echo "列头内容: $header_content" >> "$LOG_FILE"
    echo "----------------------------------------" >> "$LOG_FILE"
done

echo "所有文件处理完成,结果已写入 $LOG_FILE"
关键注意点
  • 脚本自动过滤了aws s3 ls返回结果中PRE开头的子目录条目,不会误把文件夹当文件处理触发报错。
  • 所有路径变量都加了双引号包裹,兼容带空格、特殊字符的文件名,不会出现执行异常。
  • 如果你需要递归扫描目标文件夹下所有嵌套子目录的文件,给aws s3 ls加上--recursive参数即可,注意此时要去掉S3_TARGET_PATH结尾的斜杠,避免路径拼接出错。
  • 如果你的S3上存的是gzip、lzo等压缩格式的文本文件,把脚本里的hdfs dfs -cat换成hdfs dfs -text即可,HDFS会自动解压读取内容。
运行步骤
  1. 把上述内容保存为s3_scan.sh,替换你原来的脚本框架,修改开头的配置项为实际参数
  2. 给脚本添加可执行权限:chmod +x s3_scan.sh
  3. 直接执行脚本:./s3_scan.sh
  4. 执行完成后打开my_s3_results.txt即可查看所有文件名和对应列头的关联结果

如果你本地配置了aws cli和hdfs客户端的对应访问权限,脚本可以直接运行,不需要额外调整其他逻辑。

内容的提问来源于stack exchange,提问作者Gdata0data0

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 00:01:20