Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
LinuxBash使用进度条迭代文件夹_Linux_Bash_For Loop_Iteration - Fatal编程技术网

LinuxBash使用进度条迭代文件夹

LinuxBash使用进度条迭代文件夹,linux,bash,for-loop,iteration,Linux,Bash,For Loop,Iteration,我正在编写一个处理文件夹的小脚本。 运行时间很长,所以我想添加一个进度条 以下是迭代: for file in */ do #processing here, dummy code sleep 1 done 拥有一个计数器并知道文件夹的数量将是一个解决方案。 但我正在寻找一个更通用和更短的解决方案 我希望有人能有个主意。 谢谢你的关注 朱利安 编辑: 我得到了这个解决方案,它满足了我的需求,而且是真正的图形化解决方案: #!/bin/bash n_item=$(find /*

我正在编写一个处理文件夹的小脚本。 运行时间很长,所以我想添加一个进度条

以下是迭代:

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的解决方案,它不会占用所有屏幕


非常感谢您抽出时间

根据我们在中发布的结果,我得出了以下结果:

#!/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

基于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'
}
function redraw_progress_bar{35; int barsize,int base,int i,int top
本地酒吧大小=$1
本地基数=$2
本地电流=$3
本地顶级=4美元
局部j=0
本地进度=$($barsize*($current-$base))/($top-$base)))
回声-n“[”
对于((j=0;j<$progress;j++);执行echo-n'=';完成
echo-n'=>'
对于((j=$progress;j<$barsize;j++);执行echo-n'';完成
echo-n“]$($current))/$top“$”\r'
}
因此,您可以轻松地执行以下循环

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

for((i=4;i如果您想要图形进度条(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

你可以展示一个动画,这是相对容易的。但对于一个真正的“进度条”,我的理解是你需要知道有多少%的工作已经完成,还有多少%的工作还没有完成。这很难,这取决于“处理逻辑”。例如,对于一个有一百万个文件的目录,它可能有更多的%值。如果目录为空,它可能只有0.0001%。。
#!/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