最初に自分の状況を説明します。Linuxプラットフォームに取り組んでおり、.bmp
からfilename0022.bmp
までの画像番号に1を追加するfilename0680.bmp
ファイルのコレクションがあります。合計658枚の写真。これらの各画像を、画像上で動作する.exeファイルを介して実行し、ユーザーが指定したファイルにファイルをキックできるようにしたいと考えています。したがって、実行可能ファイルの典型的な呼び出しは次のとおりです。
./filter inputfile outputfile lower upper
端末からだけで、または何らかのbashスクリプトを作成して、すべてのファイルに対してこの呼び出しをループする方法はありますか?私の問題はこれに似ています: バッチファイルで複数のファイルに対してコマンドを実行 しかし、今回はLinuxコマンドラインターミナルで作業しています。
このようなものを試すことができます...
#! /bin/bash
for ((a=022; a <= 658 ; a++))
do
printf "./filter filename%04d.bmp outputfile lower upper" $a | "sh"
done
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
形式の実行可能ファイルが必要です。
以下に簡単な例を示します。
for i in {1..100}; do echo "Hello Linux Terminal"; done
ファイルに追加するには:(>>は追加に使用され、>は上書きにも使用できます)
for i in {1..100}; do echo "Hello Linux Terminal" >> file.txt; done
それをテストできますAS-IS
シェルで:
for i in *; do
echo "$i" | tr '[:lower:]' '[:upper:]'
done
特別なパスがある場合は、*
あなたのパスで+グロブ:例:
for i in /home/me/*.exe; do ...
http://mywiki.wooledge.org/glob を参照してください
xargs
を反復処理に活用できます:
ls | xargs -i ./filter {} {}_out lower upper
注意:
これは、出力画像の名前の前にfiltered_filename0055.bmp
for i in *; do
./filter $i filtered_$i lower upper
done