使用多个命令运行循环文件,当第一个命令完成前一个文件时运行下一个文件

时间:2018-11-09 11:27:13

标签: python bash shell

对于一个项目,我创建了多个python脚本,并且希望在shell脚本中的文件目录上运行这些脚本。在此Shell脚本中,我已经使用多个命令创建了一个for循环。 第一个命令是一个Python脚本,该脚本将输入文件放入本地数据库,并占用大多数内核。 接下来的命令占用更少的内核,但是会花费很多时间。 对于每个文件,命令要按顺序运行非常重要。 为了节省时间,我想更改shell脚本以运行文件的第一个命令,并在完成后在输出上运行下一个命令,并在下一个文件上同时运行第一个命令。

有人可以帮助我吗?我试图进行自我搜索,但找不到答案。我没有尝试运行此脚本,因为我已经在运行没有外壳脚本的python脚本。

这是到目前为止的脚本:

#!/bin/bash
tsv=/home/user/tsv
fasta=/home/user/fasta/*
clustering=/home/user/clustering

for file in ${fasta}
do
    python blastn_new.py --fasta ${file} --tsv ${tsv}/${file}.tsv &&
    mkdir ${clustering}/${file} &&
    mkdir ${clustering}/${file}/clusters &&
    python blastparsPB.py --clusters ${clustering}/${file}/${file}.txt --fish ${tsv}/${file}.tsv --dir ${clustering}/${file}/clusters/
done

1 个答案:

答案 0 :(得分:1)

您可以在后台运行第二个脚本。

以下内容也有一些相切的注释,并稍微重新格式化了代码。

#!/bin/bash

# You cannot have spaces around the equals signs
# Also, avoid hard-coding an absolute path
tsv=./tsv
db=./newpacbiodb/pacbiodb
clustering=./clustering

# Notice proper quoting throughout
for file in ./fasta/*
do
    python blastn_new.py \
        --fasta "${file}" \
        --tsv "${tsv}/${file}.tsv" &&
    # mkdir -p creates an entire path if necessary
    # (and works fine even if the directory already exists)
    mkdir -p "${clustering}/${file}/clusters" &&
    python blastparsPB.py \
        --clusters "${clustering}/${file}/${file}.txt" \
        --fish "${tsv}/${file}.tsv" \
        --dir "${clustering}/${file}/clusters/" &
done # notice the simple addition of background ^ job

很显然,这假设第二个Python脚本不喜欢连接某些东西,例如同时写入数据库,但这已经是已知的了。