fgrep
主にまたはを使用して検索を高速化および/または改善する方法を考えていますag
。and
大文字と小文字を区別せずに単語を検索し、$HOME
一致リストを次にリダイレクトするコード。vim
find -L $HOME -xtype f -name "*.tex" \
-exec fgrep -l -i "and" {} + 2>/dev/null | vim -R -
ag
並列性とack
find -L $HOME -xtype f -name "*.tex" \
-exec ag -l -i "and" {} + 2>/dev/null | vim -R -
統計資料
グループ平均fgrep
統計ag
time
fgrep ag terdon1 terdon2 terdon3 muru
user 0.41s 0.32s 0.14s 0.22s 0.18s 0.12s
sys 0.46s 0.44s 0.26s 0.28s 0.30s 0.32s
例terdon1
とterdon3
同じように高速です。この二人に対する私の態度は大きく変わる。時間別の一部ランキングsys
(最高の基準ではない!)
- テデン1
- テデン2
- テトン3
- ムル
- 株式会社
- コマンドラインツール
略語
- terdon1 = terdon-many-find-grep
- terdon2 = terdon-many-find-fgrep
- terdon3 = terdon-many-find-ag (FがないためFがない
ag
)
その他のコード
コメントのムルの提案
grep -RFli "and" "$HOME" --include="*.tex" | vim -R -
オペレーティングシステム:Debian 8.5
ハードウェア:ASUS Zenbook UX303UA
答え1
ack
The Silver Searcher( ) を使用しているので、ag
他のツールを使用しても構いません。
この領域の新しいツールはripgrep(rg
)です。すばやく設計されています発見する検索するファイル(たとえばag
)も高速です。探すファイル自体(普通の古いGNUのようなgrep
)。
お客様の質問については、次のように使用できます。
rg --files-with-matches --glob "*.tex" "and" "$HOME"
ripgrepの著者公開された詳細分析さまざまな検索ツールの仕組みとベンチマークの比較。
ベンチマークの一つは、linux-literal-casei
、あなたが説明する仕事にやや似ています。多数のネストされたディレクトリ(Linuxコードベース)から複数のファイルを検索して、大文字と小文字を区別しない文字列リテラルを検索します。
このベンチマークでは、rg
ホワイトリスト(例:「* .tex」など)を使用するときに最も高速です。このucg
ツールはこのベンチマークでも優れたパフォーマンスを発揮します。
rg (ignore) 0.345 +/- 0.073 (lines: 370) rg (ignore) (mmap) 1.612 +/- 0.011 (lines: 370) ag (ignore) (mmap) 1.609 +/- 0.015 (lines: 370) pt (ignore) 17.204 +/- 0.126 (lines: 370) sift (ignore) 0.805 +/- 0.005 (lines: 370) git grep (ignore) 0.343 +/- 0.007 (lines: 370) rg (whitelist) 0.222 +/- 0.021 (lines: 370)+ ucg (whitelist) 0.217 +/- 0.006 (lines: 370)*
* - 最高の平均時間。 + - 最適なサンプリング時間。
著者は、ack
このテストが他のテストよりはるかに遅いので、ベンチマークから除外しました。
答え2
find
複数の呼び出しを並列に実行すると、少し早く作成できます。たとえば、最初にすべての最上位ディレクトリを取得し、各ディレクトリに1つずつN個の検索呼び出しを実行します。サブシェルで実行している場合は、出力を収集してvimなどにパイプすることができます。
shopt -s dotglob ## So the glob also finds hidden dirs
( for dir in $HOME/*/; do
find -L "$dir" -xtype f -name "*.tex" -exec grep -Fli and {} + &
done
) | vim -R -
または、すべての照会が完了した後にのみ出力を受け取り始めるようにしてください。
( for dir in $HOME/*/; do
find -L "$dir" -xtype f -name "*.tex" -exec grep -Fli and {} + &
done; wait
) | vim -R -
いくつかのテストを行った結果、上記のテストは実際には単一のテストよりわずかに高速ですfind
。平均して10回以上実行され、find
ツールの単一呼び出しに0.898秒かかり、上記のサブシェルはディレクトリごとのルックアップを実行するのに0.628秒かかりました。
詳細は、常に持っているディレクトリの数$HOME
、ファイルを含めることができるディレクトリの数、.tex
一致できるディレクトリの数によって異なります。