web-dev-qa-db-ja.com

多くのファイルでコマンドを実行する

多くのファイル(xyz1、xyz2、xyz5025まで)を含むフォルダーがあり、それらすべてに対してスクリプトを実行して、xyz1.faa、xyz2.faaなどを出力として取得する必要があります。

単一ファイルのコマンドは次のとおりです。

./transeq xyz1 xyz1.faa -table 11

それを自動的に行う方法はありますか?多分for-doコンボ?

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

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

32
Jeff Schaller

GNU Parallel をインストールすると、次のように並行して実行できます。

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

プログラムがCPUを集中的に使用する場合、かなり高速化するはずです。

24
hschou

bashコマンドラインで次のようなことができます:

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

1〜5025の整数を1行で生成してから、xargsに1つずつ入力します。これにより、整数が{}にカプセル化され、適切な方法で./transeqコマンドラインに移植されます。 。

ブレース展開機能{n..m}がない場合は、seqユーティリティを呼び出してこれらの数値を生成できます。

または、次の方法で常に数値生成をエミュレートできます。

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

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

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

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

-n 1は、呼び出しごとにリストから引数を1つだけ選択するようxargsに指示します(デフォルトでは、それは十分に渡されます)、および-P 4は、同時に4つのプロセスを生成するように指示します。1つが終了すると、新しいプロセスが生成されます。

私見、GNUをインストールする必要はありません。この単純なケースではパラレルです-xargsで十分です。

4
ttsiodras

ファイルをディレクトリ内に分散している場合に便利な検索の使用

find -name "xyz*" -exec ./transeq {} {}.faa -table 11 \;
4
Pelle

xargを使用できます

ls | xargs -L 1 -d '\n' your-desired-command

-L 1は一度に1つのアイテムを渡します

-d '\n'lsの出力を作成すると、新しい行に基づいて分割されます。

0
Al Mamun