zip -r [target_zip] [folder_to_zip] 2>&1 | \
pv -lep -s $(ls -Rl1 [folder_to_zip] | \
egrep -c '^[-/]') > /dev/null
And this is explained below:
zip -r [target_zip] [folder_to_zip] 2>&1 |
zip recursively into [target_zip] file the [folder_to_zip] redirecting stderr to stdout. Note, that stderr will contain one line for each file and directory being processed.
pv -lep -s $(ls -Ral1 [folder_to_zip] | egrep -c '^[-/]') > /dev/null
pipe into pv the lines with the filenames as they are being output from zip. pv is operated in line mode (counting progress based on lines and size is also in number of lines to expect - see PV man page -l option).
The total size of lines to expect is gathered by recursively listing (ls) the [folder_to_zip] and counting the lines starting with '-' or 'd' i.e. all the files and directories (remember directories are listed starting with '/' ).
The above provides accurate percentage of completion as the 100% is reached when all files and directories have been processed.