通过谷歌搜索发现这个脚本,它有一个cp的进度条,问题是它创建了大量的行,如下所示:
0%[=>
0%[=>
0%[=>
0%[=>
0%[=>
0%[=>
0%[=>
0%[=>
0%[=>
0%[=>
0%[=>
1%[==>
1%[==>
1%[==>
1%[==>
1%[==>
1%[==>
1%[==>
1%[==>
1%[==>
1%[==>
1%[==>
1%[==>
1%[==>
1%[==>
1%[==>
这是脚本的代码:
#!/bin/bash
strace -q -ewrite cp -- `printf '%q ' $@` 2>&1 \
| awk '{
count += $NF
if (count % 10 == 0) {
percent = count / total_size * 100
printf "%3d%% [", percent
for (i=0;i<=percent;i++)
printf "="
printf ">"
for (i=percent;i<100;i++)
printf " "
printf "]\r"
}
}
END { print "" }' total_size=$(stat -c '%s' "${1}") count=0
还有一件事,======的行太长了。就像,当他们走向90年代时,====的溢出会延伸到下一行。我怎么能编辑它所以它会打印75 因为我的默认终端是80宽。
编辑:好的我意识到,如果文件中有空格,这将无效。 [它只是没有做任何事情,并在我输入命令后立即退出]。有什么想法吗?
谢谢。 :)
答案 0 :(得分:2)
在'printf'] \ r“:
之前取出printf " "
#!/bin/bash
strace -q -ewrite cp -- `printf '%q ' $@` 2>&1 \
| awk '{
count += $NF
if (count % 10 == 0) {
percent = count / total_size * 100
printf "%3d%% [", percent
for (i=0;i<=percent;i++)
printf "="
printf ">"
for (i=percent;i<100;i++)
printf "]\r"
}
}
END { print "" }' total_size=$(stat -c '%s' "${1}") count=0
此外,您的终端窗口必须足够宽以处理所有字符(110个字符或更多)。
答案 1 :(得分:2)
如果您的百分比从未减少,则不需要第二个for
循环(通过打印空格来清除行的其余部分)。
这些空间是否有机会将光标推进到下一行,而\r
只是将光标放在该新行的第一列?
您可以通过确保终端宽度为&gt;来测试100个字符。
感谢Random832:
缩短界限:
if (count % 10 == 0) {
percent = count / total_size * 100
printf "%3d%% [", percent
# Limit the line length to 40 chars
width = percent * 40 / 100
for (i=0;i<=width;i++)
printf "="
printf ">]\r"
}