使用Bash循环整理Fastq文件:创建目录并分类移动文件
批量处理Fastq文件的Bash循环方案
问题场景
所有Fastq文件存放在allpools目录下,命名规则固定,文件列表如下:
ls allpools 2022_pool_1_Seq_GEX.fastq.gz 2022_pool_1_Seq_CMO.fastq.gz 2022_pool_2_Seq_GEX.fastq.gz 2022_pool_2_Seq_CMO.fastq.gz
需要完成两个任务:
- 在
allpools下根据文件中的池编号创建pool1、pool2这类目录 - 将原始Fastq文件分类移动到对应目录的子文件夹中,最终结构如下:
allpools/pool1/pool1_GEX # 包含pool_1的所有GEX类型Fastq文件 allpools/pool1/pool1_CMO # 包含pool_1的所有CMO类型Fastq文件 #### allpools/pool2/pool2_GEX # 包含pool_2的所有GEX类型Fastq文件 allpools/pool2/pool2_CMO # 包含pool_2的所有CMO类型Fastq文件
1. 创建对应池目录的Bash循环
通过提取文件名中的池编号并去重,批量创建目标目录:
cd allpools # 提取唯一池编号并创建目录 for pool_num in $(ls *.fastq.gz | sed -E 's/.*pool_([0-9]+).*/\1/' | sort -u); do mkdir -p "pool${pool_num}" done
sed -E 's/.*pool_([0-9]+).*/\1/':从文件名中精准提取池编号(如从2022_pool_1_...中提取1)sort -u:对提取的编号去重,避免重复创建目录mkdir -p:自动创建目录,若目录已存在则不报错
2. 分类移动Fastq文件的Bash循环
遍历所有Fastq文件,提取池编号和文件类型,创建子目录并完成移动:
cd allpools for file in *.fastq.gz; do # 提取池编号 pool_num=$(echo "$file" | sed -E 's/.*pool_([0-9]+).*/\1/') # 提取文件类型(GEX/CMO) file_type=$(echo "$file" | sed -E 's/.*_([A-Z]+)\.fastq\.gz/\1/') # 定义目标子目录路径 target_dir="pool${pool_num}/pool${pool_num}_${file_type}" # 创建目标子目录 mkdir -p "$target_dir" # 移动文件到目标目录 mv "$file" "$target_dir/" done
- 两次
sed分别提取池编号和文件类型,适配固定命名规则 mkdir -p自动创建多层级子目录mv命令完成文件的分类迁移
内容的提问来源于stack exchange,提问作者User15Vim
相关产品推荐
相关产品推荐

