【问题标题】:How to use tqdm in bash for loops?如何在 bash 中使用 tqdm for 循环?
【发布时间】:2018-06-30 13:49:15
【问题描述】:

例如,我有这个for loop,它需要很长时间才能完成,所以我想使用tqdm 来获得一个像python 一样的漂亮进度条。但我找不到任何方法?

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

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

【问题讨论】:

  • 更好的是,在这里搜索 [linux] find xargs parallel 。假设您有多个内核和额外的内存,您可以同时处理多个文件。祝你好运。

标签: bash loops for-loop progress-bar tqdm


【解决方案1】:

这是一个非常古老的问题,但目前the readme for 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/

【讨论】:

    【解决方案2】:

    tqdm 专用于 python,而不是 bash.. 相反,如果您只想显示循环的进度,您可能只需要一个“符号”进度条,就像 @Mitch Haile 对问题 How to add a progress bar to a shell script? 的回答一样

    您可能需要根据需要通过(执行循环数)/(总循环数)计算进度。 例如

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

    【讨论】:

    • @yukashimahuksay 谢谢。我实际上不了解 tqdm,我也没有安装它。我只是谷歌,发现它是python的一个模块。
    • 先生,您没有阅读手册,该手册很好地介绍了在终端中使用 tqdm ;)
    猜你喜欢
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    • 2016-03-29
    • 2020-06-05
    • 2010-09-08
    • 1970-01-01
    • 2013-06-15
    • 2020-09-11
    相关资源
    最近更新 更多