于是,我买了这本书,名叫素数和编程,而且进展非常艰难。今天我写了第 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
答案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