You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

通过调整字符串位置批量重命名SAC格式文件

通过调整字符串位置批量重命名SAC格式文件

看起来你需要把SAC地震数据文件里的分量标识(比如示例中的BHE)从中间位置移到时间串和文件后缀之间对吧?我给你两个实用的方案,分别适合不同的使用场景,你可以根据自己的习惯选择:

方案一:用Bash脚本批量重命名(适合Linux/macOS终端)

如果你平时习惯用终端操作,这个脚本可以快速批量处理文件:

# 遍历当前目录下所有SAC格式文件
for file in *.SAC; do
    # 跳过不符合目标格式的文件,避免误处理
    if ! [[ "$file" =~ ^[A-Z]+\.[A-Z]+\.\.[A-Z0-9]+\.[M]\.[0-9]+\.[0-9]+\.[0-9]+\.SAC$ ]]; then
        continue
    fi
    # 按点分割文件名,调整字段顺序生成新名称
    new_file=$(echo "$file" | awk -F '.' '{
        printf "%s.%s.%s.%s.%s.%s.%s.%s.%s\n", $1, $2, $3, $5, $6, $7, $8, $4, $9
    }')
    # 执行重命名,-v参数会显示每一步的操作
    mv -v "$file" "$new_file"
done

脚本说明:

  • for file in *.SAC 会遍历当前目录下所有以.SAC结尾的文件
  • 正则判断部分是为了过滤掉不符合你给出格式的文件,如果你确认所有SAC文件都是目标格式,可以直接删掉这部分
  • awk -F '.' 以点为分隔符拆分文件名,原文件的字段顺序是$1=YL, $2=BIRA, $3=空, $4=BHE, $5=M, $6=2001, $7=324, $8=210818, $9=SAC,调整后把原来的$4(分量名)移到$8$9之间,正好符合你的需求
  • mv -v 会打印每个文件的重命名过程,方便你确认操作是否正确

方案二:用Python脚本(跨平台,适合Windows/Linux/macOS)

如果你不熟悉终端命令,或者需要跨平台使用,Python脚本会更友好直观:

import os
import re

# 设置要处理的目录,当前目录用"./",可以改成具体路径比如"/home/yourname/sac_files"
target_directory = "./"

# 遍历目录下的所有文件
for filename in os.listdir(target_directory):
    # 只处理SAC后缀的文件
    if not filename.endswith(".SAC"):
        continue
    
    # 用正则匹配文件名格式,捕获各个组成部分
    name_pattern = r"^([A-Z]+)\.([A-Z]+)\.\.([A-Z0-9]+)\.(M)\.([0-9]+)\.([0-9]+)\.([0-9]+)\.SAC$"
    match_result = re.match(name_pattern, filename)
    
    if not match_result:
        print(f"跳过不符合格式的文件:{filename}")
        continue
    
    # 提取捕获到的各个字段
    station_net, station_code, component, m_segment, year, doy, time_str = match_result.groups()
    
    # 拼接生成新的文件名
    new_filename = f"{station_net}.{station_code}..{m_segment}.{year}.{doy}.{time_str}.{component}.SAC"
    
    # 构建文件的完整路径
    old_file_path = os.path.join(target_directory, filename)
    new_file_path = os.path.join(target_directory, new_filename)
    
    # 执行重命名操作
    os.rename(old_file_path, new_file_path)
    print(f"已完成重命名:{filename} → {new_filename}")

脚本说明:

  • 用正则表达式捕获文件名的各个部分,比单纯按点分割更稳定,即使文件名格式有细微调整也容易修改
  • 脚本会自动跳过不符合格式的文件,并打印提示信息
  • 你只需要修改target_directory的路径,就能处理指定文件夹下的所有SAC文件

注意事项:

  • 无论使用哪种方案,建议先备份文件再执行批量操作,避免因格式判断失误导致文件名称错误
  • 如果你的分量标识不只是BHE(比如BHN、BHZ等),这两个方案都能兼容,因为都是基于位置而非固定字符串处理的

备注:内容来源于stack exchange,提问作者Shiba Subedi

火山引擎 最新活动