4

例如,我有这个for loop需要很长时间才能完成,所以我想用tqdm一个很好的进度条,就像在 python 中一样。但是我找不到任何方法吗?

for f in `find mydir -name *.jpg -print`; do cp $f images/${f//\//_}; done

如何获得此循环的进度条?

4

2 回答 2

2

这是一个非常古老的问题,但目前的自述文件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 --progresspv命令中。

使用rsync,解决您的问题的命令可能类似于:

rsync -avzh --progress **/*.jpg images/
于 2020-04-28T18:49:28.167 回答
-5

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 个循环在字符串中添加一个“#”,然后回显它。

于 2018-01-22T07:39:58.913 回答