我有一个包含许多文件的文件夹(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
答案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
就足够了。