I've got a huge directory on my computer and I need to search in every ruby file inside for a string.
I could have done it like this : grep -R "string" *.rb
but it takes really long and I'd like to use pv (pipe viewer) to show a progress bar to be able to monitor grep
progress.
But I don't really know how can I write this command because there are still some things I just can't understand about this command.
Has someone got any idea ?
pv
operates on pipes (not commands) -- It is a volume gauge showing how much data has gone past a given point in the pipeline.Your grep command is not a pipeline (
|
- thepipe operator
is nowhere to be found) - it's just a single command doing its thing.pv
can't help you here, you just have to trust thatgrep
is actually doing its thing on all of the input files.You could cobble something together with find, pv, xargs & grep (
find . -name "*.rb" | pv | xargs grep [regex]
looks like it might be promising, but you would have to tellpv
how big thefind
output is for it to give meaningful results.Frankly it seems like more work than it's worth. Just run your grep, wait patiently, and deal with the output when it's done.
Two more methods:
Or, in a different shell while your original command is running, find the pid of the grep command and then:
Both of the above will show you which file the grep command is currently working on. You can find the total number of files with:
Lastly, use this to figure out which number the current file is in the list:
P.S. My answers assume that all your files are in a single directory. If they are not, you will have to use
find
instead ofls
and*.rb
as thinice suggested.I'm not sure what OS you're using, but
grep -R "string" *.ext
may not be working correctly for you.You might be better served using
find
in conjunction withgrep
:find . -type f -name "*.rb" -print0 |xargs --null grep "string"
In recent versions of
pv
there is an"-d"
-Option to watch all the FDs of another process.So in theory
pv
will not only work as a pipe but also as a progress-indicator for a whole process. (For example, try it with the PID of your Firefox)For the Problem above a simpler idea is the following: While the
grep
is running, uselsof
together withwatch
.That way you can monitor the progress of your grep.
Have you already tried
I don't know if it actually works to because it doesn't know how many bits of total data to search because it is recursive?
I usually use the proc-filesystem on Linux systems, i.e.
ls -al /proc/<pid of grep>/fd
This lists all the files that the grep-invocation has open currently and thus gives an impression of where in the search it is currently.