ループを使って複数のファイルを実行する方法

ループを使って複数のファイルを実行する方法

1 つのファイルに対してこのように機能するスクリプトがあります。

./script 0001g.log > output

2つ以上のファイルの場合は、次のようにします

./script 0001g.log 0002g.log 0003g.log > output

このスクリプトは、各入力ファイルから 1 つの特別な番号を取得し、それを 1 つの出力ファイルに出力します。

私の質問は、入力ファイルが 1000 個あるのですが、ループを実行してスクリプトを実行するにはどうすればよいかということです。

答え1

解決策はいくつか考えられます:

単に

$ ./script *g.log >output

... そして、それが*g.logコマンドラインを長くしすぎないように願っています。これはあまり堅牢ではありません。

スクリプトが与えられたファイルの数に依存しない場合、つまり、出力を各入力ファイルに追加できる場合はoutput、次の解決策もあります。

$ find ./ -type f -name "*g.log" | xargs ./script >output

3 番目の解決策は、ループをスクリプト自体に移動することです。

for f in *g.log; do
  # old code using "$f" as file name
done

これはスクリプト内にあるため、コマンド ラインの長さ制限の問題はありません。

スクリプトの呼び出しは、

$ ./script >output

答え2

もし

./script 0001g.log 0002g.log 0003g.log > output

同値

./script 0001g.log > output
./script 0002g.log >> output
./script 0003g.log >> output

ループを使うか

`seq -f '%04gg.log' 10` | script > output

答え3

必要に応じてファイルをディレクトリに置くこともできます

/opt/location/source
    /0001g.log
    /0002g.log
    /0003g.log

次に、bashスクリプトで以下を試してください。

#!/bin/bash

# store path to files
SOURCE="/opt/location/source/"

# loop through files
for FILE in `ls $SOURCE*g.log`; do
    # do what you want to specific file
    echo $FILE
done

関連情報