如何迭代许多文件夹中的文件



我有15个文件夹,每个文件夹包含一个 *.gz文件。我想将该文件用于其中一个包装来进行一些过滤。为此,我想编写一些可以打开该文件夹并读取特定文件并执行提到的操作的内容,而不是将结果保存在具有不同扩展名的同一文件夹中。

我所做的是(PBS脚本(:

#!/bin/bash
#PBS -N Trimmomatics_filtering
#PBS -l nodes=1:ppn=8
#PBS -l walltime=04:00:00
#PBS -l vmem=23gb
#PBS -q ext_chem_guest
# Go to the Trimmomatics directory
cd /home/tb44227/bioinfo_packages/Trimmomatic/Trimmomatic-0.36
# Java module load
module load java/1.8.0-162
# Input File (I have a list of 15 folders and each contained fastq.gz file)
**inputFile= for f in /home/tb44227/nobackup/small_RNAseq_260917/support.igatech.it/sequences-export/536-RNA-seq_Disco_TuDO/delivery_25092017/754_{1..15}/*fastq.gz; $f**

# Start the code to filter the file  and save the results in the same folder where the input file is
java -jar trimmomatic-0.36.jar SE  -threads ${PBS_NUM_PPN} -phred33 SLIDINGWINDOW:4:5 LEADING:5 TRAILING:5 MINLEN:17 $inputFile  $outputFile
# Output File
outputFile=$inputFile{.TRIMMIMG}

我的问题是如何定义$ inputfile和$ outputfile,以便可以读取所有15个文件。

谢谢

如果您的应用程序一次仅处理单个输入文件,则有两个选项:

  1. 处理一个单一作业中的所有文件
  2. 处理不同作业中的每个文件

从用户的角度来看,您通常对第二种选项更感兴趣,因为如果有资源,多个作业可能会同时运行。但是,这取决于您需要处理的文件数量和系统使用策略,因为在短时间内发送太多工作可能会导致工作中的问题。

第一个选择或多或少是您已经获得的东西。您可以使用find程序和简单的bash循环。您基本上将find输出存储到一个变量中,然后像在此示例中一样迭代它:

#!/bin/bash
# PBS job parameters
module load java
root_dir=/home/tb44227/nobackup/small_RNAseq_260917/support.igatech.it/sequences-export/536-RNA-seq_Disco_TuDO/delivery_25092017
# Get all files to be processed
files=$(find $root_dir -type f -name "*fastq.gz")
for inputfile in $files; do
  outputfile="$inputFile{.TRIMMIMG}"
  # Process one file at a time
  java -jar ... $inputfile $outputfile
done

然后,您只需提交您的作业脚本,这将产生一个作业。

$ qsub myjobscript.sh

第二个选项更强大,但要求您更改每个文件的作业订阅。大多数工作经理让您通过标准输入传递工作脚本。这确实很有帮助,因为它避免了我们生成中间文件,从而污染您的目录。

#!/bin/bash
function submit_job() {
   # Submit job. Jobscript passed through standard input using a HEREDOC.
   # Must define $inputfile and $outputfile before calling the function.
   qsub - <<- EOF
     # PBS job parameters
     module load java
     # Process a single file only
     java -jar ... $inputfile $outputfile
   EOF
}
root_dir=/home/tb44227/nobackup/small_RNAseq_260917/support.igatech.it/sequences-export/536-RNA-seq_Disco_TuDO/delivery_25092017
# Get all files to be processed
files=$(find $root_dir -type f -name "*fastq.gz")
for inputfile in $files; do
  outputfile="$inputFile{.TRIMMIMG}"
  submit_job
done

由于您在脚本内调用QSUB,因此您只需要像任何常规的Shell脚本文件一样调用脚本本身。

$ bash multijobscript.sh

最新更新