0

我想在这个命令行中添加一个进度条:

find . \( -iname "*.bz" -o -iname "*.zip" -o -iname "*.gz" -o -iname "*.rar" \) -print0 | while read -d '' file; do echo "$file"; lzgrep -a stringtosearch\.anything "$file"; done

进度文件应根据压缩大小文件的总数(而不是单个文件)计算。

当然,它也可以是脚本。

如果可能的话,我还想添加其他进度条:

  1. 处理的文件总数(21 个中的 3 个示例)
  2. 单个文件的进度百分比

有人可以帮我吗?

这里的一些例子应该看起来相似(来自这里的例子):

tar cf - /folder-with-big-files -P | pv -s $(du -sb /folder-with-big-files | awk '{print $1}') | gzip > big-files.tar.gz

多个进度条(来自此处的示例):

pv -cN orig < foo.tar.bz2 | bzcat | pv -cN bzcat | gzip -9 | pv -cN gzip > foo.tar.gz 

谢谢,

4

3 回答 3

1

这是我第一次听说,pv它不在我可以访问的任何机器上,但假设它需要在启动时知道总数,然后在命令的每次迭代中知道一个数字,你可以做这样的事情来获得每个处理的文件的进度条:

IFS= readarray -d '' files < <(find . -whatever -print0)
printf '%s\n' "${files[@]}" | pv -s "${#files[@]}" | command

第一行为您提供了一个文件数组,因此您可以使用它"${#files[@]}"来提供pv它的初始总值(看起来像您使用-s value的那样?),然后在处理每个文件时执行您通常所做的任何事情以获得进度。

我看不出有任何方法可以告诉pv它正在读取的管道是 NUL 终止的,而不是换行符终止的,所以如果您的文件的名称中可以包含换行符,那么您必须弄清楚如何解决该问题。

要另外获得单个文件的进度,您可能需要以下内容:

IFS= readarray -d '' files < <(find . -whatever -print0)
printf '%s\n' "${files[@]}" |
    pv -s "${#files[@]}" |
    xargs -n 1 -I {} sh -c 'pv {} | command'

我没有,pv所以以上所有内容都未经测试,因此请检查语法,特别是因为我从未听说过pv:-)。

于 2020-05-22T13:18:44.360 回答
0

感谢 ED 和 Max C.,这里的版本 0.2 这个版本适用于 zgrep,但不适用于 lzgrep。:-\

#!/bin/bash
echo -n "collecting dump... "
IFS= readarray -d '' files < <(find . \( -iname "*.bz" -o -iname "*.gz" \) -print0)
echo done
echo "Calculating archives size..."
tot=0
for line in "${files[@]}"; do
    s=$(stat -c\%s "$line")
       if [ !  -z "$s" ]
       then
           tot=$(($tot+$s))
       fi
done

(for line in "${files[@]}"; do
    s=$(stat -c\%s "$line")
       if [ !  -z "$s" ]
       then
           echo "$line"
       fi
done
) | xargs -i{} sh -c 'echo Processing file: "{}" 1>&2 ; cat "{}"' | pv -s $tot | zgrep -a anything -

于 2020-05-25T09:43:49.370 回答
0

感谢 Max C.,我找到了主要问题的解决方案:

find ./ -type f -iname *\.gz -o -iname *\.bz | (tot=0;while read fname; do s=$(stat -c%s "$fname"); if [ !  -z "$s" ] ; then echo "$fname"; tot=$(($tot+$s)); fi; done; echo $tot) | tac  | (read size; xargs -i{} cat "{}" | pv -s $size | lzgrep -a something -)

但这仅适用于 gz 和 bz 文件,现在我必须根据扩展名开发使用不同的工具。

我也要试试 Ed 解决方案。

于 2020-05-23T19:22:09.050 回答