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

时间:2018-03-01 09:09:03

标签: bash file loops job-scheduling

我有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 个答案:

答案 0 :(得分:0)

如果您的应用程序一次只处理一个输入文件,您有两个选择:

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

    第一种选择或多或少是你已经得到的。您可以使用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
    

    第二个选项功能更强大,但要求您更改每个文件的jobscript。大多数作业管理员允许您通过标准输入传递作业脚本。这非常有用,因为它避免了我们生成污染您的目录的中间文件。

    #!/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