例如,我有这个for loop
需要很长时间才能完成,所以我想用tqdm
一个很好的进度条,就像在 python 中一样。但是我找不到任何方法吗?
for f in `find mydir -name *.jpg -print`; do cp $f images/${f//\//_}; done
如何获得此循环的进度条?
例如,我有这个for loop
需要很长时间才能完成,所以我想用tqdm
一个很好的进度条,就像在 python 中一样。但是我找不到任何方法吗?
for f in `find mydir -name *.jpg -print`; do cp $f images/${f//\//_}; done
如何获得此循环的进度条?
这是一个非常古老的问题,但目前的自述文件tqdm
说在 bash 中使用它作为命令可以正常工作,例如:
$ seq 9999999 | tqdm --bytes | wc -l
75.2MB [00:00, 217MB/s]
9999999
$ tar -zcf - docs/ | tqdm --bytes --total `du -sb docs/ | cut -f1` \
> backup.tgz
32%|██████████▍ | 8.89G/27.9G [00:42<01:31, 223MB/s]
但是,tqdm
显示进度条取决于命令为其提供信息以从中构建进度条,而该命令cp
不会(甚至cp -v
不发送缓冲信息,因此您只会在cp
完成后获得进度条)。
也就是说,如果您想要一个进度条来将您想要的文件复制到其中一个rsync --progress
或pv
命令中。
使用rsync
,解决您的问题的命令可能类似于:
rsync -avzh --progress **/*.jpg images/
tqdm 专用于 python,而不是 bash。相反,如果您只想显示循环的进度,您可能只需要一个“符号”进度条,就像 @Mitch Haile 对问题如何添加shell脚本的进度条?
您可能需要根据需要通过(执行的循环数)/(总循环数)计算进度。例如
Loop_array=(`find mydir -name *.jpg -print`);
Total_loop_num=${#Loop_array[*]};
for((i=0;i<$Total_loop_num;i++))
do
echo -ne "Progress: $[ ($i+1)*100/$Total_loop_num ]%\r";
f=${Loop_array[$i]};
cp $f images/${f//\//_};
done;
echo "Loop finished.";
只要您的原始命令有效,它就应该有效。我刚刚测试了以下代码,它工作正常:
for((i=0;i<120000;i++))
do
echo -ne "Progress: $[ ($i+1)*100/120000 ]%\r";
done;
如果您还想要一个像“#”系列这样的“真实”进度条,您可以计算每 N 个循环在字符串中添加一个“#”,然后回显它。