对许多文件运行命令

对许多文件运行命令

我有一个包含许多文件的文件夹(xyz1、xyz2,一直到 xyz5025),我需要对每个文件运行一个脚本,获取 xyz1.faa、xyz2.faa 等作为输出。

单个文件的命令是:

./transeq xyz1 xyz1.faa -table 11

有没有办法自动做到这一点?也许是一个 for-do 组合?

答案1

for file in xyz*
do
  ./transeq "$file" "${file}.faa" -table 11
done

这是一个简单的for循环,它将迭代xyz当前目录中以 开头的每个文件,并使用./transeq文件名作为第一个参数调用程序,文件名后跟“.faa”作为第二个参数,后跟“-table 11” 。

答案2

如果你安装GNU 并行你可以像这样并行执行:

parallel ./transeq {} {}.faa -table 11 ::: xyz*

如果你的程序是CPU密集型的,它应该会加速很多。

答案3

您可以在命令行上执行类似的操作bash

printf '%s\n' {1..5025} | xargs -l -I {} -t ./transeq xyz{} xyz{}.faa -table 11

我们生成从 1 到 5025 的整数,每行一个,然后将它们一一输入到 xargs,xargs 将整数封装起来{},然后以适当的方式将其移植到 ./transeq 命令行中。

如果您没有大括号扩展工具,{n..m}那么您可以调用该seq实用程序来生成这些数字。

或者,您始终可以通过以下方式模拟数字生成:

yes | sed -n =\;5025q | xargs ...

答案4

假设您有多个内核,并且每个调用都可以独立于其余调用运行,那么您将通过并行运行获得相当大的加速。

一个相对简单的方法是通过参数-P-xargs例如,如果您有 4 个核心:

echo xyz{1..5025} | \
    xargs -n 1 -P 4 -I{} /path/to/transeq xyz{} xyz{}.faa -table 11

告诉每次-n 1调用xargs只从列表中选择一个参数(默认情况下它会通过很多),并-P 4告诉它同时生成 4 个进程 - 当一个进程死亡时,会生成一个新进程。

恕我直言,对于这个简单的情况,您不需要安装 GNU 并行 -xargs就足够了。

相关内容