Bash判断目录下.fastq文件是否存在 不存在则执行samtools命令
原脚本核心问题
- 通配符逻辑完全失效:
[ -e 通配符路径 ]仅支持单文件匹配场景,当匹配到0个或多个.fastq文件时判断结果完全错误;被双引号包裹的通配符"*.bam"/"*.fastq"会被shell识别为文件名叫*.bam/*.fastq的单个文件,不会匹配所有对应后缀的文件。 - 输出逻辑混乱:直接将所有bam的转换结果重定向到名为
*.fastq的文件,会把所有样本的测序数据混在一起,后续拆分出的r1/r2文件也无法对应原始bam样本。 - 路径不匹配:判断逻辑使用
Sample_*通配匹配所有样本目录,和需求指定检测Sample_140/analysis目录的要求不一致。
修正后可用脚本
#!/bin/bash # 定义目标处理目录 TARGET_DIR="./Sample_140/analysis" # 开启nullglob配置:通配符无匹配结果时返回空值,避免判断逻辑出错 shopt -s nullglob # 检测目录下是否已存在fastq文件 fastq_files=("$TARGET_DIR"/*.fastq) if [ ${#fastq_files[@]} -gt 0 ]; then echo "Fastq files exist, no operation needed." exit 0 fi # 进入目标目录,目录不存在则直接退出 cd "$TARGET_DIR" || exit 1 # 逐个遍历bam文件处理,避免样本数据混淆 for bam in *.bam; do # 提取文件名前缀(剔除.bam后缀) file_prefix="${bam%.bam}" # 执行bam转fastq samtools bam2fq "$bam" > "${file_prefix}.fastq" # 拆分双端r1序列 grep '^@.*/1$' -A 3 --no-group-separator "${file_prefix}.fastq" > "${file_prefix}_r1.fastq" # 拆分双端r2序列 grep '^@.*/2$' -A 3 --no-group-separator "${file_prefix}.fastq" > "${file_prefix}_r2.fastq" done
使用说明
- 脚本依赖GNU版本grep(支持
--no-group-separator参数),macOS环境需先通过homebrew安装grep,将脚本中grep替换为ggrep即可正常运行。 - 脚本默认保留bam转换生成的全量fastq文件,如果不需要保留,可在拆分r1/r2的命令后添加
rm "${file_prefix}.fastq"删除临时文件。 - 如果需要批量处理所有
Sample_*目录下的analysis文件夹,只需把TARGET_DIR的单路径定义改为循环遍历./Sample_*/analysis即可,内部处理逻辑无需修改。
内容的提问来源于stack exchange,提问作者mike ropri
相关产品推荐
相关产品推荐

