请求优化Bash脚本:批量处理文件并上传至Azure Blob后归档
批量处理文件并上传Azure Blob的脚本优化
需求背景
有一个文件夹会生成以下格式的文件:
- Delhi_20221234556.csv
- Melbourne_20123456789.csv
- Goa_1234567890.csv
- Sydney_2022345689.csv
需要完成三个核心操作:
- 移除文件名中的数字后缀,保留城市名+csv后缀(如
Delhi_20221234556.csv→Delhi.csv) - 将处理后的文件上传至Azure Blob存储
- 上传成功后,将文件移动到归档文件夹并添加日期后缀(如
Delhi.csv→Delhi_2024-05-20.csv)
目前仅实现了针对Goa开头文件的处理脚本,需要优化为批量处理所有符合格式的文件。原脚本如下:
#!/bin/bash find /abc/def -type f -name 'Goa*' -execdir bash -c 'for f in "$@"; do mv "$f" "${f%%_*}.csv"; done' bash {} + ./azcopy cp "/abc/def/Goa.csv" "https://<Blobaccount>.blob.core.windows.net/abc\home\xyz?<SAS- Token>" mv /abc/def/Goa.csv /abc/def/Archive/Goa$(date +%F).csv
优化后的批量处理脚本
#!/bin/bash # 配置基础路径和Azure Blob地址 BASE_DIR="/abc/def" ARCHIVE_DIR="${BASE_DIR}/Archive" BLOB_UPLOAD_URL="https://<Blobaccount>.blob.core.windows.net/abc/home/xyz?<SAS-Token>" # 确保归档目录存在,不存在则创建 mkdir -p "${ARCHIVE_DIR}" # 遍历所有符合「城市名_数字串.csv」格式的文件 find "${BASE_DIR}" -maxdepth 1 -type f -name '*_*.csv' | while read -r source_file; do # 提取文件名中的城市名(下划线前的部分) city=$(basename "${source_file}" | cut -d'_' -f1) processed_file="${BASE_DIR}/${city}.csv" # 重命名文件,移除数字部分 mv "${source_file}" "${processed_file}" # 上传到Azure Blob,检查上传结果 if ./azcopy cp "${processed_file}" "${BLOB_UPLOAD_URL}"; then # 上传成功,移动到归档目录并添加日期后缀 archive_file="${ARCHIVE_DIR}/${city}_$(date +%F).csv" mv "${processed_file}" "${archive_file}" echo "处理完成:${processed_file} → ${archive_file}" else # 上传失败,恢复原文件名避免数据丢失 echo "上传失败:${processed_file},已恢复原文件名" mv "${processed_file}" "${source_file}" fi done
优化点说明
- 批量匹配:用
*_*.csv匹配所有符合格式的文件,不再局限于特定城市前缀 - 动态提取城市名:通过
basename和cut自动解析文件名,无需硬编码城市名称 - 错误容错:只有当
azcopy上传成功时才执行归档操作,失败则恢复原文件,避免数据异常 - 参数化配置:把路径和Blob地址定义为变量,后续修改更方便
- 目录预检查:用
mkdir -p确保归档目录存在,避免移动文件时出错
内容的提问来源于stack exchange,提问作者Mahesh456
相关产品推荐
相关产品推荐

