2012-06-12 8 views
9

最初に私の状況を説明しましょう。私はLinuxプラットフォームで作業していて、.bmpのファイルを持っており、画像番号にfilename0022.bmpからfilename0680.bmpまでのファイルが追加されています。合計658枚の写真私はこれらの画像のそれぞれを、画像上で動作する.exeファイルを通して実行し、そのファイルをユーザが指定したファイルに蹴り出したいと思っています。だから、実行のための一般的なコールは、次のとおりです。Linuxのターミナルで実行可能なコマンドをループする方法は?

./filter inputfile outputfile lower upper 

は、私は、端末からすべてのファイルの上やbashスクリプトのいくつかの種類を作成することによって、ループ、このコールをすることができます方法はありますか?私の問題はこれに似ています:Execute a command over multiple files with a batch fileしかし、私はLinuxコマンドライン端末で作業しています。

答えて

6

あなたは...

#! /bin/bash 
for ((a=022; a <= 658 ; a++)) 
do 
    printf "./filter filename%04d.bmp outputfile lower upper" $a | "sh" 
done 
+1

ここに私が試したのは、それは私の画面に多少関連性のあるものをたくさん印刷しましたが、実際にはファイルを作成していませんでした... #! (; <= 680;(= 022 ++))のために/ binに/ bashの のprintfを行う」./filter胎児-00-2.3.5um__voi0%04d.bmp fetus_threshold_%04D 90 240" $ 行わ ここで、90と240は私が先に述べた下位と上位の議論です。私はbashスクリプトを作成していないので、前のコード行を入力したファイルを作成するためにemacsを使用しました。私はemacsファイルを単にテストとして保存しました。それは何かの背後に何もないので、それは私がオンラインで行ういくつかの例を見たものです。その他のヒント? –

+0

.shファイルに作成してください(上記で新しく追加したもの)。そして、同じディレクトリに[[bash myfile.sh]]と入力してファイルを実行してください。 – scottyaz

+0

これは少なくとも、時間が経過し、最初のイメージでも動作します。その後、実行可能ファイルが使用しているソフトウェアからエラーが発生します。私が理解していないことは、それがinputfile0000で開始しようとしており、inputfile0022.bmpで始まるように指示しているということです。私が得ている唯一の出力イメージはoutputfile0000.bmpです。 threshold.shとして保存したbashファイルは次のとおりです。 #!/bin/bash for((a = 022; a <= 680; a ++)) do printf "./filter6 fetus-00-2_3.5um__rec_voi%04d.bmp fetus_threshold_%04d.bmp 90 240" $ a | "sh" done –

1

あなたはあなたのシェルでAS-ISことをテストすることができます:あなたは特別なパスをお持ちの場合は

for i in *; do 
    echo "$i" | tr '[:lower:]' '[:upper:]' 
done 

すると、あなたのパス+グロブによって*を変更します。例:

for i in /home/me/*.exe; do ... 

http://mywiki.wooledge.org/glob

+0

は、彼が正しいディレクトリにあると仮定すると:=) – ant

+1

編集この可能性を説明するために=) –

+0

sputnickねえ、 はあなたが私はあなたが上記の書いたコードのビットを理解する助けてもらえますか?私はあなたがすべてのことを行き来するforループを持っているのを見ることができますが、イメージを処理する実行可能ファイルをどこに呼び出すかわかりません。もう少し詳しく説明していただけますか?あなたの助けと投稿をありがとう。このような短時間で多くの助けを得ることは素晴らしいことです。 –

0
を参照してください。

これは、出力イメージの名前の前に、

for i in *; do 
    ./filter $i filtered_$i lower upper 
done 
+0

これは私が推測するソースファイルを上書きします。 –

+0

ファイルにスペースがある場合はどうなりますか?コマンドは './filter file with space filtered_file with space lower upper'に解決されます。おそらくあなたが '' $ i ''を使用しているときに引用するべきです。 –

+1

@TimPote質問情報に基づいてできるだけシンプルにしようとしていますが、引用符を付けると、ファイルの拡張子とディレクトリをチェックする方が良いでしょう。 –

11

あなたはbashのスクリプトに探しに興味がある可能性があり、このような何かを試すことができます。

forループ内でコマンドをシェルから直接実行することができます。

具体的に言及した数字を生成する単純なループです。例えば、シェルから:

[email protected] $ for i in {22..680} ; do 
> echo "filename${i}.bmp" 
> done 

これはfilename22.bmpからfilename680.bmpにあなたのリストが表示されます。それはあなたが言及した範囲の繰り返しを処理するだけです。これには0のパディング数は含まれません。これを行うにはprintfを使用できます。 printfの構文はprintf format argumentです。前のループの変数$iを引数として使用し、%Wd形式を適用できます(Wは幅です)。 Wプレースホルダをプレフィックスにすると、使用する文字が指定されます。例:所定の値とは反対の値を取得するためのコマンドを実行する変数として上記$()作用において

[email protected] $ for i in {22..680} ; do 
> echo "filename$(printf '%04d' $i).bmp" 
> done 

これで、指定したファイル名が表示されます。我々はそれを取ると、実際のアプリケーションに適用することができます。これは、1本のラインを形成するために書き換えることができ

[email protected] $ for i in {22..680} ; do 
> ./filter "filename$(printf '%04d' $i).bmp" lower upper 
> done 

:質問から注意すべき

[email protected] $ for i in {22..680} ; do ./filter "filename$(printf '%04d' $i).bmp" lower upper ; done 

一つのことを、.exeファイルは、一般的にコンパイルされていますCOFFフォーマット(linuxはELFフォーマットを実行可能としています)。ファイルに追加する

for i in {1..100}; do echo "Hello Linux Terminal"; done 

:ここ

+0

'user @ machine $ 'はシェルプロンプトをシミュレートすることで、'> 'は実行のためのコマンドを完了する前にもっと待つプロンプトの続きをシミュレートします。 –

7

は簡単な例である(>>を付加するために使用されて、あなたはまた、上書きする>を使用することができます)

for i in {1..100}; do echo "Hello Linux Terminal" >> file.txt; done 
1

あなたはxargsを活用することができます

ls | xargs -i ./filter {} {}_out lower upper 

注:

を反復について
  • {}はパイプから出力される1行に相当します。ここでは入力ファイル名です。
  • 出力ファイルの名前は、postfix '_out'で指定します。
関連する問題