通过bash生成快速文件内容

时间:2015-03-14 16:53:24

标签: bash unix

任务是在bash中编写脚本,当文件大小小于5 Mb时,该脚本将生成从1到某个数字的数字。我写过剧本但是太慢了。如何将速度提高到2秒?

#!/bin/bash
if ! [ -f task3.txt ]
then
        touch task3.txt
fi
limit=5242880
size=`wc -c < task3.txt`
i=1
while [ $size -le $limit ]
do
        echo "$i " >> task3.txt
        i=$((i+1))
        size=`wc -c < task3.txt`
done

1 个答案:

答案 0 :(得分:1)

不是每次都跑到文件系统并再次计算每个字节来计算你写了多少,而是自己保留计数。正如目前所写,您可以使用

size=$((size + ${#i} + 2))

循环内部。此处${#i}$i的长度,并且每个循环的长度为两个,因为除了它之外还会回显空格和换行符。如果空间是一个拼写错误,我怀疑,那么你的循环可能是

while [ $size -le $limit ]
do
    echo "$i" >> task3.txt     # cut space
    i=$((i+1))
    size=$((size + ${#i} + 1)) # only +1 here.
done

此外,为了避免始终打开和关闭管道,您可以编写

while [ $size -le $limit ]
do
    echo "$i"                  # cut space
    i=$((i+1))
    size=$((size + ${#i} + 1)) # only +1 here.
done >> task3.txt

这并没有像删除wc -c一样减少运行时间,但它仍然是~50%(非常值得)。

速度快的附录:

执行此操作的另一种方法比手动循环快得多,是滥用seq,如下所示:

left=$((limit - size))      # bytes left to write

seq 1 $left | head -c $left >> task3.txt

这会滥用head -c $left$left个字节后停止阅读的事实,此时seq的标准输出关闭,seq也停止写入, seq 1 $left将打印超过$left个字节的输出。需要注意的是,它不是写入n个数字而是写入n个字节,因此输出中的最后一个数字可能会被截断。从空文件开始,这不是特殊情况,但这是偶然的。

感谢@gniourf_gniourf提出了大部分内容。