假设我有一个可以处理文件组的脚本,并执行几种不同类型的操作。
在处理文件时打印出文件名有助于了解事情的进展情况。
但数据量会淹没其他信息,比如脚本处于哪个阶段。
我想要的是读取标准输入并将换行符更改为盒式返回和 termcap 序列以清除到行尾的东西。 (或者甚至是一个回程,一个间隔的终端宽度和另一个回程)
使用此功能,各个阶段的输出将显示为单个变化的行,而无需滚动(除非有换行。哦,好吧,一次一个问题)
我可以写这个,但它似乎足够有用,以前可能有人做过,但我不知道该过滤器的名称是什么。
已经做到了吗?
(使用someprogram | dialog --progressbox 1 80
接近我正在寻找的)
答案1
我认为你想要做的是有一个不断更新而不滚动的进度线,所以这是我为此编写的内容:
files="$(ls /some/folder)"
elems="$(echo "$files" | wc -w)"
cnt=0
for name in $files; do
let "cnt+=1"
printf "\rMyScript - Processing file %3i of %3i: %.40s" "$cnt" "$elems" "$name"
done
echo
这给你一行,例如MyScrpit - Processing file 5 of 14: foo.a
。
您还可以修改它以通过管道工作,类似于dialog --progressbox
:
total="$1"
cnt=0
while IFS='$\n' read -r name; do
let "cnt+=1"
printf "\rProcessing file %3i of %3i: %.40s" "$cnt" "$total" "$name"
done < /dev/stdin
echo
当然,您可以省略计数器并仅打印文件名(如果您不想预先提供总计数作为参数)。
printf 中的固定字段长度将确保它们不会发生换行(除非您的终端窗口更小)。