多くのファイルに対してコマンドを実行する

多くのファイルに対してコマンドを実行する

多くのファイル(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

これは、最初の引数としてファイル名、2番目の引数として「.faa」、その後に「-table 11」で始まるプログラムを呼び出す現在のディレクトリ内のすべてのファイルをfor繰り返す単純なループです。 。xyz./transeq

答え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までの整数を1行に1つずつ生成し、xargsに1つずつ入力します。 xargsは整数をラップ{}し、適切な方法で./transeqコマンドラインに移植します。

支柱拡張ツールがない場合は、このユーティリティを呼び出してこれらの番号を生成できます{n..m}seq

または、次の方法でいつでも数値生成をシミュレートできます。

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

答え4

複数のコアがあり、各呼び出しが残りの呼び出しとは独立して実行できると仮定すると、並行して実行すると、大幅なスピードアップが得られます。

比較的簡単な方法はパラメータを使用することです-Pxargsたとえば、コアが4つの場合:

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

リストから1つのパラメータのみを選択するように各-n 1呼び出しに指示します。xargs(基本的にたくさんお届けします)-P 44つのプロセスを同時に作成するように指示します。 1つのプロセスが終了すると、新しいプロセスが作成されます。

IMHO、この簡単な場合はGNU Parallelをインストールする必要はありませんxargs。それで十分です。

関連情報