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,361
  • 1
  • 15
  • 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