私のコンピュータには巨大なディレクトリがあり、すべてのRubyファイル内で文字列を検索する必要があります。
私はこのようにそれをすることができたでしょう:grep -R "string" *.rb
ですが、本当に時間がかかります。pv(パイプビューア)を使用して、grep
の進行状況を監視できるように進行状況バーを表示したいと思います。
しかし、このコマンドについて理解できないことがまだあるので、このコマンドをどのように書くことができるのか本当にわかりません。
誰かが何か考えを持っていますか?
pv
はpipesで動作します(コマンドではありません) -パイプラインの特定のポイントを通過したデータの量を示すボリュームゲージです。
あなたのgrepコマンドはパイプラインではありません(|
-pipe operator
は見つかりません)-単一のコマンドで実行されます。 pv
はここでは役に立ちません。grep
が実際にすべての入力ファイルに対して処理を実行していることを信頼する必要があります。
あなたcouldfind、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
または、元のコマンドの実行中に別のシェルで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]
追伸私の回答では、すべてのファイルが単一のディレクトリにあると想定しています。そうでない場合は、_find
および*.rb
の代わりにls
を使用する必要があります。
使用しているOSはわかりませんが、grep -R "string" *.ext
が正しく機能していない可能性があります。
find
をgrep
と組み合わせて使用するほうがよい場合があります。
find . -type f -name "*.rb" -print0 |xargs --null grep "string"
pv
の最近のバージョンでは、"-d"
-別のプロセスのすべてのFDを監視するオプション。
したがって、理論的にはpv
はパイプとして機能するだけでなく、プロセス全体の進行状況インジケータとしても機能します。 (たとえば、FirefoxのPIDで試してください)
上記の問題の簡単なアイデアは次のとおりです。grep
の実行中に、lsof
をwatch
と一緒に使用します。
$ watch -n 1 "lsof | grep -n $PWD"
これにより、grepの進行状況を監視できます。
私は通常、Linuxシステムでproc-filesystemを使用します。
ls -al /proc/<pid of grep>/fd
これにより、grep呼び出しが現在開いているすべてのファイルがリストされ、検索の現在の場所がわかります。
もう試しましたか
grep -R "string" *.rb | pv
再帰的であるため、検索するデータの合計ビット数がわからないため、実際に機能するかどうかはわかりませんか?