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单行,当可以想象的真正巨大的文件达到一定大小时,它就会中断。我想它看起来会是这样的:

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内置。可以通过help test或在 bash 内部检索帮助信息help [man test指的是test如果 shell 没有这样的命令则使用的命令内置or 被显式调用为/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命令来限制 shell(或其子级)可以创建的文件大小:

ulimit -f 32768

相关内容