bash 一次对目录中的每个文件运行命令

bash 一次对目录中的每个文件运行命令

我想要执行以下命令:

$SCHRODINGER/utilities/prepwizard [options] inputfile outputfile

$SCHRODINGER 是一个软件的导出,在[选项]中我必须控制程序内一些没有问题的计算变量:

例如:

$SCHRODINGER/utilities/prepwizard -watdist 0 填充侧链 -fillloops 输入文件 输出文件

我想对多个扩展名为 .pdb 的文件运行它,但问题是我必须逐个运行它,而不是同时运行。也就是说,只要执行以下任一操作,输出也可能是 .pdb

我已经编写了此代码,但是它当时会执行所有文件,这不是我想要的:

for i in `ls *pdb`
do
$ SCHRODINGER / utilities / prepwizard [options] $i prep_$i 
done

答案1

首先,永远不要解析 的输出。这可能会发生不好的事情。像和ls这样的字符实际上可能出现在文件名中。为了解决这个问题,bash 通配符可以为你提供帮助:\r\n

for file in *.pdb
do
    ${SCHRODINGER}/utilities/prepwizard [options] "$file" "prep_${file}"
done

或者如果你想要一行代码:

for file in *.pdb; do ${SCHRODINGER}/utilities/prepwizard [options] "$file" "prep_${file}"; done

这将依次执行每个文件,并等到prepwizard应用程序完成后再继续执行下一个文件。

答案2

要按顺序执行多个命令(在前一个命令完成后再执行一个命令),可以用分号分隔它们。

因此,您可以在字符串中准备所有命令,并在循环后对它们进行评估:

allcommands=""
for i in `ls *pdb`
do
allcommands="$allcommands;SCHRODINGER options"
done
eval $allcommands

相关内容