Linux Bash循环遍历文件夹并显示进度条

6

我正在编写一个用于处理文件夹的小脚本。

由于运行时间相当长,因此我想添加一个进度条。

以下是迭代过程:

for file in */
do 
    #processing here, dummy code
    sleep 1
done

拥有计数器并知道文件夹数量是一种解决方案。 但我正在寻找更通用和更短的解决方案...
我希望有人能有一个想法。 谢谢你的关注,
朱利安
编辑:
我得到了这个解决方案,它可以做到我想要的,并且非常具有图形化:
#!/bin/bash
n_item=$(find /* -maxdepth 0 | wc -l)
i=0
for file in /*
do
    sleep 1 #process file
    i=$((i+1))
    echo $((100 * i / n_item)) | dialog --gauge "Processing $n_item folders, the current is $file..." 10 70 0
done

然而,我将保留fedorqui的解决方案,该方案不会占用整个屏幕。

非常感谢您的时间。


你可以展示一个动画,这相对容易。但对于一个真正的“进度条”,我的理解是你需要知道已完成的工作量占总工作量的百分比以及剩余工作量所占的百分比。这很困难,它取决于“处理逻辑”。例如,对于一个包含100万个文件的目录,它可能有更高的百分比值。而对于一个空目录,它可能只有0.0001%的进度。 - Kent
3个回答

6

基于我们在如何在覆盖上一行的情况下打印到同一行?中发布的结果,我得出了以下结论:

#!/bin/bash

res=$(find /* -maxdepth 0 | wc -l)
echo "found $res results"
i=1

for file in /*
do
    echo -n "["
    for ((j=0; j<i; j++)) ; do echo -n ' '; done
    echo -n '=>'
    for ((j=i; j<$res; j++)) ; do echo -n ' '; done
    echo -n "] $i / $res $file" $'\r'
    ((i++))
    sleep 1
done

示例

$ ./a
found 26 results
[  =>                        ] 2 / 26 /boot 
[                =>          ] 16 / 26 /root

4

基于fedorqui的出色解决方案,我制作了一个函数,可以与任何循环非常好地配合使用。

function redraw_progress_bar { # int barsize, int base, int i, int top
    local barsize=$1
    local base=$2
    local current=$3
    local top=$4        
    local j=0 
    local progress=$(( ($barsize * ( $current - $base )) / ($top - $base ) )) 
    echo -n "["
    for ((j=0; j < $progress; j++)) ; do echo -n '='; done
    echo -n '=>'
    for ((j=$progress; j < $barsize ; j++)) ; do echo -n ' '; done
    echo -n "] $(( $current )) / $top " $'\r'
}

因此,您可以轻松地执行类似于以下的for循环:

for (( i=4; i<=20 ; i+=2 ))
do
    redraw_progress_bar 50 4 $i 20
    $something $i
done
echo $'\n'

3
如果您想要一个图形化的进度条(GTK+),可以看看zenity:
#!/bin/bash
(
    for i in {0..5}
    do
        echo $((i*25))
        echo "#Processing $((i+1))/5"
        sleep 1
    done
) | zenity --progress --width=400 --title="Please wait" --auto-close

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接