任务是在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
答案 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提出了大部分内容。