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