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

Linux集群中基于映射表查找文件并创建指定别名链接

解决Linux集群中基于映射表批量创建文件软链接的问题

我来帮你完善这个脚本,解决批量根据Sample名查找文件并通过映射表创建别名软链接的问题。咱们先明确核心需求:从key.tsv里拿到Sample和Serial的对应关系,找到指定Sample的fastq文件,然后在目标目录用对应的Serial名创建软链接。

优化思路

首先要解决原脚本里的几个潜在问题:重复遍历映射表的效率问题、find命令的冗余遍历、缺乏错误提示逻辑。下面是完整的可运行方案:


第一步:预加载映射表(提升集群环境效率)

先把key.tsv里的Sample-Serial映射关系一次性加载到bash关联数组中,避免每次循环都读取文件,尤其适合大型集群的慢存储环境:

# 加载映射表到关联数组(假设key.tsv第一列是Sample,第二列是Serial)
declare -A sample_to_serial
while IFS=$'\t' read -r sample serial; do
    sample_to_serial["$sample"]="$serial"
done < key.tsv

第二步:完整批量处理脚本

下面是包含错误处理、效率优化的完整脚本,你只需要替换对应的路径参数即可:

#!/bin/bash

# ===== 配置参数(根据你的集群环境修改) =====
SEARCH_DIR="/directory"          # 存放Sample文件的根目录
TARGET_LINK_DIR="/target/links"  # 要创建软链接的目标目录
SAMPLES=("Sample10" "Sample22")  # 需要处理的Sample列表
MAP_FILE="key.tsv"               # 映射表文件路径

# 创建目标目录(如果不存在)
mkdir -p "$TARGET_LINK_DIR"

# 检查映射表是否存在
if [[ ! -f "$MAP_FILE" ]]; then
    echo "❌ 错误:映射表文件 $MAP_FILE 不存在,请检查路径!"
    exit 1
fi

# 加载映射表到关联数组
declare -A sample_to_serial
while IFS=$'\t' read -r sample serial; do
    sample_to_serial["$sample"]="$serial"
done < "$MAP_FILE"

# 批量处理每个Sample
for sample in "${SAMPLES[@]}"; do
    # 检查当前Sample是否有对应的Serial映射
    if [[ -z "${sample_to_serial[$sample]}" ]]; then
        echo "⚠️ 警告:Sample $sample 在映射表中未找到对应Serial,跳过..."
        continue
    fi
    serial="${sample_to_serial[$sample]}"

    # 查找对应的fastq文件(找到第一个匹配项就停止遍历,提升速度)
    fastq_file=$(find "$SEARCH_DIR" -name "${sample}*.fastq" -type f -quit)
    if [[ -z "$fastq_file" ]]; then
        echo "⚠️ 警告:未找到Sample $sample 对应的fastq文件,跳过..."
        continue
    fi

    # 提取原文件后缀,保持软链接的后缀一致性
    suffix="${fastq_file##*.}"
    link_path="$TARGET_LINK_DIR/${serial}.${suffix}"

    # 创建软链接(-f覆盖已存在的链接,-n避免误操作目录)
    if ln -sfn "$fastq_file" "$link_path"; then
        echo "✅ 成功创建软链接:$link_path -> $fastq_file"
    else
        echo "❌ 错误:创建软链接 $link_path 失败!"
    fi
done

关键细节说明

  • 关联数组兼容性:如果你的集群bash版本低于4.0(不支持关联数组),可以用awk替代映射查询:serial=$(awk -v sample="$sample" '$1 == sample {print $2; exit}' key.tsv)
  • find -quit选项:在大型集群目录中,找到第一个匹配文件就停止遍历,避免不必要的IO消耗
  • 软链接路径:使用find返回的绝对路径创建软链接,确保链接在任何目录下都能正常访问
  • 错误提示:添加了映射表不存在、Sample无映射、未找到文件的提示,方便排查集群环境中的问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:17:11