bash中的for循环在目录中输入一个新文件

bash中的for循环在目录中输入一个新文件

背景信息:我正在运行 Prokka(作为一名生物信息学新手,没有 Prokka,也很少有 Bash 经验),并且我有多个 FASTA 文件。

有人告诉我需要生成一个 Bash 循环,允许我一一输入 FASTA 文件。

例如:包含所有 FASTA (.fna) 文件的目录名为 StaphFNA,其中有 1000 个 FASTA 文件。它们都以 ID 号命名 - 但并不像正常情况那样递增(因此它们不是编号为 1、2、3 等)存在随机跳跃,例如,第一个是 34872,下一个是 8933。

我需要输入 StaphFNA 中的第一个 FASTA 文件,在 Prokka 中处理,然后输出到名为“StaphProkka”的文件,然后第二个 FASTA 文件经历相同的过程 - 再次输出到“StaphProkka”。如此下去,直到所有 1000 个都完成。

正如你可以想象的,这样做 1000 次有点费力,所以我希望做一个循环,但我对 bash 很陌生,我很挣扎。

我的 Prokka 论点(我认为是正确的):

prokka /Users/me/Documents/StaphFNA --outdir StaphProkka --prefix staph_aur --kingdom bacteria --locusting staphylococcus

我的 For 循环(我知道这是错误的):

i = 0
for i in StaphFNA/.fna*; do
    prokka /Users/me/Documents/StaphFNA/$i --outdir StaphProkka --prefix staph_aur --kingdom bacteria --locusting staphylococcus
i = i + 1
done

答案1

如果您不需要指定输出文件并且 prokka 根据其输入生成不同名称的文件,您所需要的只是:

for file in /Users/me/Documents/StaphFNA/*.fna; do
    prokka "$file" \ 
        --outdir StaphProkka \
        --prefix staph_aur \
        --kingdom bacteria \
        --locusting staphylococcus 
done

for variable in dir/*模式将迭代中的每个文件或目录dir/并将其路径名保存为$variable,因此您不需要计数器或其他任何东西。如果您确实需要使用计数器,例如处理file1.fafile2.fa,并且不想也处理otherfile.fa,您会像这样(注意 周围缺少空格=,这很重要):

for ((i=0; i<=10; i++)); do
    someCommand "file${i}.fa"
done

或者,如果您需要显式增加计数器(这种情况很少见),您可以这样做:

i=0
while [ "$i" -le 10 ]; do
    echo someCommand "file${i}.fa"
    (( i++ ))
done

相关内容