如何在 bash for 循环中使用 tqdm?

yuk*_*say 14 bash loops for-loop progress-bar tqdm

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

for f in `find mydir -name *.jpg -print`; do cp $f images/${f//\//_}; done
Run Code Online (Sandbox Code Playgroud)

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

guh*_*hur 7

tqdm在 Bash 循环中使用,您需要:

  1. 输出一些东西
  2. 了解迭代总数(可选)
  3. 在 后添加donetqdm

在你的情况下:

total=1000
for f in `find mydir -name *.jpg -print`; do echo $f; cp $f images/${f//\//_}; done | tqdm --total $total >> /dev/null
Run Code Online (Sandbox Code Playgroud)

查看答案:https://github.com/tqdm/tqdm/issues/436#issuecomment-330504048


APa*_*aul 6

这是一个非常老的问题,但目前的自述文件tqdm说,在 bash 中使用它作为命令效果很好,例如:

\n\n
$ seq 9999999 | tqdm --bytes | wc -l\n75.2MB [00:00, 217MB/s]\n9999999\n\n$ tar -zcf - docs/ | tqdm --bytes --total `du -sb docs/ | cut -f1` \\\n    > backup.tgz\n 32%|\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x8d                      | 8.89G/27.9G [00:42<01:31, 223MB/s]\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是,tqdm显示进度条取决于为其提供构建进度条信息的命令,而该命令则cp不然(甚至cp -v不发送缓冲信息,因此您只能在cp完成后获得进度条)。

\n\n

也就是说,如果您想要一个用于复制文件的进度条,您应该使用 或rsync --progress命令pv

\n\n

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

\n\n
rsync -avzh --progress **/*.jpg images/\n
Run Code Online (Sandbox Code Playgroud)\n