4

As posted here and here, pipeviewer is a tool that shows content progress based on it's size. As seen there, the proposal of their questions is to get a progress bar of a process running without data volume.

I was wondering if is it possible to show progress of a loop with pipeviewer, considering that I'm reading it from a file, and I know it's size.

I've trying something like

while IFS= read -r line; do <code> done < file.txt | pv

And this definitelly doesn't work, since pv shows only an empty progress bar.

Any ideas?

Thank you in advance!

Community
  • 1
  • 1

1 Answers1

1

If you can, read the file with pv instead of cat, so that pv will automatically get the file size and format the progress bar appropriately.

For example:

pv very_big_file.txt

or, in your example:

pv file.txt | while IFS= read -r line;
do
    <code>
done

If you cannot read the file with pv, you can pass pv the size of the file with -s size. That way, pv will expect the flow to be that length, and format the progress bar proportionally to it.

You can get the size of a file with:

stat -c '%s' file

or

wc -c < file

For example:

command1 | command2 | ... | pv -s $(stat -c '%s' file) | commandX | ...

in your example:

cat file.txt | pv -s $(stat -c '%s' file.txt) | while IFS= read -r line;
do
    <code>
done

As you see, it is redundant to use pv just after cat, it should be substituted by a pv reading the file.

Alvaro Gutierrez Perez
  • 3,669
  • 1
  • 16
  • 24
  • That's exactly what I mean... Thank you, sir! I'll figure out a way to hide the first empty bar that PV adds unintentionally, but your simple but functional solution is more than appreciated! – Carlos Eduardo Santos Oct 01 '15 at 19:37
  • for me this shows a progress bar for the read operation only, before any work is done inside the loop, presumably because the file is read as buffered any way to actually cause read to consume it line by line? – Arkadiy Kukarkin Sep 28 '22 at 17:15