web-dev-qa-db-ja.com

Linuxのターミナルで実行可能なコマンドをループする方法は?

最初に自分の状況を説明します。Linuxプラットフォームに取り組んでおり、.bmpからfilename0022.bmpまでの画像番号に1を追加するfilename0680.bmpファイルのコレクションがあります。合計658枚の写真。これらの各画像を、画像上で動作する.exeファイルを介して実行し、ユーザーが指定したファイルにファイルをキックできるようにしたいと考えています。したがって、実行可能ファイルの典型的な呼び出しは次のとおりです。

./filter inputfile outputfile lower upper

端末からだけで、または何らかのbashスクリプトを作成して、すべてのファイルに対してこの呼び出しをループする方法はありますか?私の問題はこれに似ています: バッチファイルで複数のファイルに対してコマンドを実行 しかし、今回はLinuxコマンドラインターミナルで作業しています。

14
Linux Rules

このようなものを試すことができます...

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

Bashスクリプトの調査に興味があるかもしれません。

Forループ内のコマンドは、シェルから直接実行できます。

あなたが特に言及した数を生成するための単純なループ。たとえば、シェルから:

_user@machine $ for i in {22..680} ; do
> echo "filename${i}.bmp"
> done
_

これにより、_filename22.bmp_から_filename680.bmp_のリストが表示されます。それはあなたが言及した範囲の反復を単に処理します。これはゼロのパディング番号をカバーしません。これを行うには、printfを使用できます。 printf構文は_printf format argument_です。前のループの_$i_変数を引数として使用し、%Wd_形式(Wは幅)を適用できます。 Wプレースホルダーのプレフィックスは、使用する文字を指定します。例:

_user@machine $ for i in {22..680} ; do
> echo "filename$(printf '%04d' $i).bmp"
> done
_

上記の$()は変数として機能し、コマンドを実行して定義済みの値とは反対の値を取得します。

これで、指定したファイル名が表示されます。これを実際のアプリケーションに適用できます。

_user@machine $ for i in {22..680} ; do
> ./filter "filename$(printf '%04d' $i).bmp" lower upper
> done
_

これは1行に書き換えることができます。

_user@machine $ for i in {22..680} ; do ./filter "filename$(printf '%04d' $i).bmp" lower upper ; done
_

質問から注意すべきことの1つは、.exeファイルは一般にCOFF形式でコンパイルされますが、LinuxではELF形式の実行可能ファイルが必要です。

15
Steve Buzonas

以下に簡単な例を示します。

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

ファイルに追加するには:(>>は追加に使用され、>は上書きにも使用できます)

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

それをテストできますAS-ISシェルで:

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

特別なパスがある場合は、*あなたのパスで+グロブ:例:

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

http://mywiki.wooledge.org/glob を参照してください

1
Gilles Quenot

xargsを反復処理に活用できます:

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

注意:

  • {}はパイプからの1行の出力に対応します。ここでは、入力ファイル名です。
  • 出力ファイルには、接尾辞「_out」が付けられます。
1
howardoer

これは、出力画像の名前の前にfiltered_filename0055.bmp

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