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

如何用Bash基于键值对文本文件批量重命名Fastq文件?

批量重命名Fastq文件(基于键值对映射)

问题背景

现有Fastq文件目录结构:

./PBMCs/SRR1_1.fastq
./PBMCs/SRR1_2.fastq
./Monos/SRR2.fastq
./Monos/SRR3.fastq

有一份键值对映射文件(假设命名为name_map.txt),内容如下:

SRR1 pbmc-1
SRR2 mono-1
SRR3 mono-2

需要将文件名中的SRR#替换为对应映射名称,最终得到:

./PBMCs/pbmc-1_1.fastq
./PBMCs/pbmc-1_2.fastq
./Monos/mono-1.fastq
./Monos/mono-2.fastq

你原本的「遍历文件+遍历映射行替换」思路是可行的,但效率偏低,更高效的方式是先把映射加载到内存,再批量处理文件。

解决方案(Bash脚本实现)

步骤1:编写脚本

创建rename_fastq.sh脚本,内容如下:

#!/bin/bash

# 检查映射文件是否存在
if [ ! -f "name_map.txt" ]; then
    echo "错误:映射文件name_map.txt不存在"
    exit 1
fi

# 加载映射到关联数组
declare -A name_map
while read -r old_name new_name; do
    name_map["$old_name"]="$new_name"
done < "name_map.txt"

# 遍历所有fastq文件
find . -type f -name "*.fastq" | while read -r file_path; do
    filename=$(basename "$file_path")
    # 匹配映射中的旧名称并替换
    for old in "${!name_map[@]}"; do
        if [[ "$filename" == "$old"* ]]; then
            new_filename="${filename/$old/${name_map[$old]}}"
            new_file_path=$(dirname "$file_path")/"$new_filename"
            # 执行重命名(预览模式可改为echo mv)
            mv "$file_path" "$new_file_path"
            echo "已重命名:$file_path -> $new_file_path"
            break
        fi
    done
done

步骤2:执行脚本

  1. 给脚本添加执行权限:
chmod +x rename_fastq.sh
  1. 确保name_map.txt和脚本在同一目录,运行脚本:
./rename_fastq.sh

补充说明

  • 脚本会递归查找当前目录下所有.fastq文件,无需手动逐个指定
  • 先将映射文件加载到关联数组,避免重复遍历映射行,提升处理效率
  • 若想先预览重命名结果,可将脚本中的mv改为echo mv,此时仅输出操作内容,不会实际修改文件

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 22:30:53