web-dev-qa-db-ja.com

pv(パイプビューア)を使用したGrepプログレスバー

私のコンピュータには巨大なディレクトリがあり、すべてのRubyファイル内で文字列を検索する必要があります。

私はこのようにそれをすることができたでしょう:grep -R "string" *.rbですが、本当に時間がかかります。pv(パイプビューア)を使用して、grepの進行状況を監視できるように進行状況バーを表示したいと思います。

しかし、このコマンドについて理解できないことがまだあるので、このコマンドをどのように書くことができるのか本当にわかりません。

誰かが何か考えを持っていますか?

11
Cydonia7

pvpipesで動作します(コマンドではありません) -パイプラインの特定のポイントを通過したデータの量を示すボリュームゲージです。
あなたのgrepコマンドはパイプラインではありません|-pipe operatorは見つかりません)-単一のコマンドで実行されます。 pvはここでは役に立ちません。grepが実際にすべての入力ファイルに対して処理を実行していることを信頼する必要があります。

あなたcouldfind、pv、xargs&grep(find . -name "*.rb" | pv | xargs grep [regex]は有望なようですが、意味のある結果を得るには、pvの出力の大きさをfindに伝える必要があります。

率直に言って、それは価値があるよりも多くの仕事のようです。単にgrepを実行し、辛抱強く待ちます。そして、完了したら出力を処理します。

15
voretaq7

さらに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を使用する必要があります。

4
Ladadadada

使用しているOSはわかりませんが、grep -R "string" *.extが正しく機能していない可能性があります。

findgrepと組み合わせて使用​​するほうがよい場合があります。

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

1
thinice

pvの最近のバージョンでは、"-d"-別のプロセスのすべてのFDを監視するオプション。

したがって、理論的にはpvはパイプとして機能するだけでなく、プロセス全体の進行状況インジケータとしても機能します。 (たとえば、FirefoxのPIDで試してください)

上記の問題の簡単なアイデアは次のとおりです。grepの実行中に、lsofwatchと一緒に使用します。

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

これにより、grepの進行状況を監視できます。

1
Jan Walzer

私は通常、Linuxシステムでproc-filesystemを使用します。

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

これにより、grep呼び出しが現在開いているすべてのファイルがリストされ、検索の現在の場所がわかります。

0
centic

もう試しましたか

grep -R "string" *.rb | pv

再帰的であるため、検索するデータの合計ビット数がわからないため、実際に機能するかどうかはわかりませんか?

0
nhutto