私はgrepを使って次のパターンを含むいくつかのtexファイルを見つけようとしています->-
。
grep -R -- "->-" *.tex
しかし、これはうまくいきません。私がするなら:
grep -R -- "->-"
代わりに動作しますが、非常に遅くて明確にtexファイルだけでなく、他の多くのファイル(バイナリファイルなど)とも一致します。
この検索を実行する最速の方法は何ですか?
答え1
以下を試してください。find
grep
-exec
find path_to_tex_files_directory -name "*.tex" -exec grep -- "->-" {} \;
またはxargs
find path_to_tex_files_directory -name "*.tex" | xargs grep -- "->-"
答え2
問題は、ディレクトリ内のすべてのファイルを検索するように再帰に-R
指示することです。grep
したがって、特定のファイルグループと組み合わせることはできません。だからあなたは使用することができますfind
@KMが提案したように。またはシェルワイルドカード:
$ shopt -s globstar
$ grep -- "->-" **/*.tex
このshopt
コマンドはbashのglobstar機能を有効にします。
globstar
If set, the pattern ** used in a pathname expansion con‐
text will match all files and zero or more directories
and subdirectories. If the pattern is followed by a /,
only directories and subdirectories match.
次に、現在のディレクトリとサブディレクトリのすべてのファイル**/*.tex
と一致するパターンを提供します。.tex
thisを使用している場合、これは基本的にこれを行うので(とにかくbash機能なので)zsh
必要ありません。shopt
zsh
答え3
1をgrep
サポートしている場合は、次のスイッチを使用できます。--include
grep -R --include '*.tex' -- "->-"
または
grep -R --include='*.tex' -- "->-"
1:
少なくともGNUで利用可能grep
:
--include=GLOB
Search only files whose base name matches GLOB
およびオペレーティングシステムgrep
:
--include
If specified, only files matching the given filename pattern are searched.
答え4
-R
オプションは再帰を意味します。 *.tex パターンのディレクトリがないようです。
たぶん、次のようにしてみてください。
find . -name \*.tex -exec grep -l -- "->-" {} \;
-l
ファイル名に興味がない場合は、オプションを削除できます。ファイル名とモードを表示するには:
find . -name \*.tex -exec grep -l -- "->-" {} \; | xargs grep -- "->-"
しかし、これはデュアルgrepです。 @KMのソリューションが良く見えます。