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
相关产品推荐
相关产品推荐

