grep进度条使用pv(pipe道查看器)

我的电脑上有一个巨大的目录,我需要在每个ruby文件里search一个string。

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

但我真的不知道该怎么写这个命令,因为还有一些我不明白的命令。

有人有任何想法?

pvpipe道上运行(不是命令) – 这是一个体积量表,显示有多less数据已经通过pipe道中的给定点。
你的grep命令不是一个pipe道( |pipe operator无处可寻) – 它只是一个单一的命令。 pv在这里帮不了你,你只需要相信, grep实际上是在所有的input文件上做它的事情。

可以用find,pv,xargs和grep( find . -name "*.rb" | pv | xargs grep [regex]看起来可能是有希望的,但是你必须告诉pv多大的find输出是为了给出有意义的结果。

坦率地说,似乎更多的工作,而不是价值。 只要运行你的grep, 耐心等待 ,并在完成后处理输出。

另外两种方法:

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

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

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

上面的两个都会告诉你当前正在处理的是哪个文件。 你可以find文件的总数:

 ls -l *.rb | wc -l 

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

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

PS我的答案假设你所有的文件都在一个目录中。 如果他们不是,你将不得不使用ls*.rb作为thinicebuild议。

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

您可能会更好地使用findgrep结合使用:

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

在最近的版本中,有一个"-d"可以观察另一个进程的所有FD。

所以理论上讲, pv不仅是一个pipe道,而且是一个整个过程的进度指标。 (例如,用你的Firefox的PID来试试)

对于上面的问题,一个简单的想法如下:当grep正在运行时,与watch一起使用lsof

 $ watch -n 1 "lsof | grep -n $PWD" 

这样你可以监视你的grep的进度。

你有没有试过

 grep -R "string" *.rb | pv 

我不知道它是否真正起作用,因为它不知道要search多less位数据,因为它是recursion的?

我通常使用Linux系统上的proc-filesystem,即

ls -al /proc/<pid of grep>/fd

这列出了grep调用当前已经打开的所有文件,因此给出了当前search的位置的印象。