ファイルサイズが与えられると、bash whileループは中断されます。

ファイルサイズが与えられると、bash whileループは中断されます。

だから私はこの本を買った。素数とプログラミング、進行が非常に困難です。今日、私は第1章で説明した(簡単な)プログラムを書いています:

#!/usr/bin/env python

import math

def find_gcd(a,b):
    while b > 0:
        r = a - b * math.floor(a/b)
        a = b
        b = r
    return int(a)

if __name__ == "__main__":
    import random, sys
    while True:
        print find_gcd(random.randrange(int(sys.argv[1])), random.randrange(int(sys.argv[2])))

…今はこう呼びました。

./gcd-rand.py 10000 10000 > concievablyreallyhugefile

...今、私はbash非常に大きなファイルが特定のサイズに達すると、1行が壊れるという夢を見ています。私はそれが次のように見えると思います。

while $(du -h f) < 32M; do ./gcd-rand.py 10000 10000 > $f; done

...しかし、私は以前にwhileループを書いたことがなく、bash構文がどのように機能するのかわかりません。

答え1

秘密は、testコマンドtestまたはそれに対応するコマンドを使用することです[ ... ]

 while [ "$(du -m f|cut -f1)" -lt 32 ]
 do 
  ./gcd-rand.py 10000 10000 > "$f"
 done

詳細についてはを参照してくださいhelp test

ノート

testまたは、[コマンドはbashです。組み込み。ヘルプ情報はbashで、help testまたはbash内で検索できますhelp [。シェルに対応するコマンドがない場合に使用されるコマンドをman test示します。test組み込みまたは明示的にとして呼び出されます/usr/bin/test

答え2

./gcd-rand.py 10000 10000 | head -c 32M > concievablyreallyhugefile

head32MB 以降は読み取りが停止します。head読み取りを中止した直後、次のgcd-rand.pyメッセージが表示されます。信号パイプライン信号を送ってください。

次のように切り捨てられた最後の行を保存したくない場合マイケル・ゾリンメモ:

./gcd-rand.py 10000 10000 | head -c 32M | sed '$d' > concievablyreallyhugefile

答え3

Pythonコードは永遠に繰り返されます。したがって、バックグラウンドで実行してファイルサイズを超えた場合は終了することをお勧めします。一行で:

{ ./gcd-rand.py 10000 10000 > f & }; p=$!; while (( $(stat -c %s f) < 33554432 )); do sleep .1; done; kill $p

注:Dirkの提案に従って適切な睡眠時間を選択してください。 statに加えてduを使用することもできます。

答え4

ulimit以下を使用して、シェル(またはその子孫)が生成できるファイルサイズを制限できます。

ulimit -f 32768

関連情報