Grep パターンにはダッシュが含まれ、ファイル拡張子に制限されます。

Grep パターンにはダッシュが含まれ、ファイル拡張子に制限されます。

私はgrepを使って次のパターンを含むいくつかのtexファイルを見つけようとしています->-

grep -R -- "->-" *.tex

しかし、これはうまくいきません。私がするなら:

grep -R -- "->-"

代わりに動作しますが、非常に遅くて明確にtexファイルだけでなく、他の多くのファイル(バイナリファイルなど)とも一致します。

この検索を実行する最速の方法は何ですか?

答え1

以下を試してください。findgrep-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必要ありません。shoptzsh

答え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のソリューションが良く見えます。

関連情報