使用 pv (管道查看器) Grep 进度条

使用 pv (管道查看器) Grep 进度条

我的计算机上有一个巨大的目录,我需要在里面的每个 ruby​​ 文件中搜索字符串。

我可以这样做:grep -R "string" *.rb但这需要很长时间,而且我想使用 pv(管道查看器)来显示进度条以便能够监控grep进度。

但我真的不知道如何写这个命令,因为关于这个命令还有一些我无法理解的事情。

有人知道吗?

答案1

pv适用于管道(不是命令)——它是一个容量计,显示有多少数据已经通过管道中的给定点。
您的 grep 命令是不是管道(|-pipe operator无处可寻) - 它只是一个命令在做它的事情。 pv这里无法帮助你,你只需要相信它grep实际上在所有输入文件上执行它的事情。

可以用 find、pv、xargs 和 grep 拼凑一些东西(find . -name "*.rb" | pv | xargs grep [regex]看起来很有希望,但是你必须知道输出pv有多大find才能给出有意义的结果。

坦白说,这似乎比它本身的价值要多得多。只需运行 grep,耐心地等待,并在完成后处理输出。

答案2

另外两种方法:

for file in *.rb; do echo $file; grep "string" $file >> output.txt; done

或者,在原始命令正在运行时在另一个 shell 中,找到 grep 命令的 pid,然后:

strace -q -s 256 -e trace=open -p [pid] 2>&1 | head

以上两个命令都会显示 grep 命令当前正在处理的文件。你可以使用以下命令查找文件总数:

ls -l *.rb | wc -l

最后,使用它来确定当前文件在列表中的编号:

ls -l *.rb | grep -n [the current filename]

PS 我的回答假设您的所有文件都在一个目录中。如果不是,则必须使用find而不是,正如thinice建议的那样ls*.rb

答案3

我不确定您使用的是什么操作系统,但grep -R "string" *.ext可能无法正常工作。

find结合使用可能会更好grep

find . -type f -name "*.rb" -print0 |xargs --null grep "string"

答案4

你已经尝试过吗

grep -R "string" *.rb | pv

我不知道它是否真的有效,因为它不知道要搜索总共多少位数据,因为它是递归的?

相关内容