用于脚本编写的一次一行工作进度过滤器

用于脚本编写的一次一行工作进度过滤器

假设我有一个可以处理文件组的脚本,并执行几种不同类型的操作。

在处理文件时打印出文件名有助于了解事情的进展情况。

但数据量会淹没其他信息,比如脚本处于哪个阶段。

我想要的是读取标准输入并将换行符更改为盒式返回和 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 中的固定字段长度将确保它们不会发生换行(除非您的终端窗口更小)。

相关内容