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

问题描述 投票:0回答:1

我有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个文件。

谢谢

bash file loops job-scheduling
1个回答
0
投票

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

  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

第二个选项更强大,但要求您更改每个文件的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
© www.soinside.com 2019 - 2024. All rights reserved.