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


19

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

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

./transeq xyz1 xyz1.faa -table 11

それを自動的に行う方法はありますか?たぶん、フォーコンボですか?

回答:


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

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


4
または、ワンライナーとして:for file in xyz*; do ./transeq "$file" "${file}.faa" -table 11; done。私はいつもこの種のものを入力します。また、ファイル名などが希望どおりに拡張されていることを確認する場合echodo、1回目を右に置き、シェル履歴に戻って2回目に削除します。
デイブツイード

"$file".faaインタラクティブなワンライナーの一部として入力するのが少し簡単で、.faa引用する必要のあるシェルメタキャラクターが含まれていないため安全です。
ピーターコーデス

2
注として、部分的な実行に終わってループを再開したい場合、xyz*グロブは.faaファイルもピックアップします。bashの場合は、shopt -s extglobreference)を実行for file in xyz!(*.faa) ...してから、ループを介して送信されることから.faaファイルを除外するために使用します。
ジェフシャラー

24

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

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

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


6

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

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

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

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

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

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

1
それは非常に複雑です。 for i in {1..5025}; do ./transeq "xyz$i" "xyz$i".faa -table 11; done考えやすく、入力しやすい方法です。コマンドを実行する前にコマンドを印刷する場合は、を使用しますset -x
ピーターコーデス

ええ、それは正しいですが、OPが質問を定式化する方法は、xyz1 .. xyz5025という名前のファイルだけが興味の対象であるように思えました。したがって、xyz *で使用する場合は、不適合ファイルを拒否する方法が必要だと考えました...これが原因です。理想的には、OPがディレクトリ内のすべてのファイルを処理することを望んでいる場合、なぜ1から5025のものを表示するのですか?すべてのファイルを所定の方法で処理したいだけで十分だと言うだけです。

1
私が書いたループを見てください。あなたとまったく同じ結果for i in {1..5025}を達成するために使用します。bashで書くこともできますが、私は入力するのが速いので、通常は範囲構文を使用します。for ((i=1 ; i<=5025 ; i++)); do ./transeq "xyz$i" "xyz$i".faa -table 11; done{a..b}
ピーターコーデス

4

ファイルがディレクトリ内に散らばっているときに役立つfindを使用する

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

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つのプロセスを生成するためにそれを伝えます- 1つのダイは、新しいものを生み出しています。

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


0

使用できます xarg

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

-L 1 一度に1項目を渡す

-d '\n'の出力lsは、改行に基づいて分割されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.