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

Bash脚本问题:多子目录循环运行Unicycler批量组装失败

问题排查与修复方案

错误根源

你的脚本中,basename ${file} _1.fastq.gz仅提取了文件名前缀(比如QC_181651),丢失了文件所在的子目录路径(比如Assemblies/assem_181651/)。当你直接用${base}_1.fastq.gz作为参数时,Unicycler会在当前工作目录(Sequencing)下查找文件,而实际文件存放在对应的assem_xxx子目录中,因此出现找不到文件的错误。

修复方案

以下两种方法均可解决问题,按需选择:

方法一:保留完整文件路径

for file in Assemblies/assem*/*_1.fastq.gz; do
    # 获取文件所在的子目录路径
    dir=$(dirname "$file")
    # 获取文件名前缀(移除_1.fastq.gz后缀)
    base=$(basename "$file" _1.fastq.gz)
    echo "running unicycler hybrid assembly on ${base}"
    # 用完整路径指定输入文件,输出目录也存入对应子目录
    unicycler --short1 "${dir}/${base}_1.fastq.gz" --short2 "${dir}/${base}_2.fastq.gz" --long "${dir}/${base}.fastq.gz" --out "${dir}/${base}_hybridassem" --threads 16
    echo "unicycler assembly on ${base} finished"
done

方法二:切换到子目录执行(更简洁)

for dir in Assemblies/assem*; do
    # 进入目标子目录,cd失败则跳过该目录
    cd "$dir" || continue
    # 提取当前目录下的文件前缀
    base=$(basename *_1.fastq.gz _1.fastq.gz)
    echo "running unicycler hybrid assembly on ${base}"
    # 当前已在子目录,直接用文件名即可
    unicycler --short1 "${base}_1.fastq.gz" --short2 "${base}_2.fastq.gz" --long "${base}.fastq.gz" --out "${base}_hybridassem" --threads 16
    echo "unicycler assembly on ${base} finished"
    # 返回上级目录
    cd - > /dev/null
done

方案说明

  • 方法一无需切换目录,通过保留完整路径定位文件,适合需要在原工作目录记录运行日志的场景。
  • 方法二切换到子目录后执行,路径逻辑更简洁,避免路径拼接错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 18:50:28