Ubuntu-18.04.6 の 'grep' コマンドの何が問題なのでしょうか?

Ubuntu-18.04.6 の 'grep' コマンドの何が問題なのでしょうか?

私は何十年もの間 'grep' を楽しんでいましたが、数年後に Linux を離れ、再び戻ってみると 'grep' が以前とは動作が異なっていることに気づきました。Web で使用方法を調べ、私の記憶が壊れていないことを確認しました。

*.hいくつかのファイル*.cppはより深いサブディレクトリの下にあると確信しています。以下のコマンドを使用したところ、予期しない同様の結果になりました。

grep 44738 -r -l *.h
grep 44738 -r -l *.c
grep 44738 -r -l *.c*

結果が出ました

 grep: *.h: No such file or directory
 ./daemons/snmpcd/snmpcd.cpp
 ./.svn/pris.......svn-base

 grep: *.c: No such file or directory
 ./daemons/snmpcd/snmpcd.cpp
 ./.svn/pris.......svn-base

 grep: *.c*: No such file or directory
 ./daemons/snmpcd/snmpcd.cpp
 ./.svn/pris........svn-base

それぞれ。

  • コマンド: を使用した場合grep 44738 -r -l .、最初の行を除いて同じ結果が得られました。grep: ...
  • コマンド: を使用した場合grep 44738 -r -l *.c*grep: ...ファイルが何も取得されませんでした。
  • コマンド: を使用するとgrep 44738 -r -l -file *.c* .grep: *.c*: No such file or directory

この結果は、数年前の私の経験とほぼ矛盾しています。私の質問は次のとおりです。

  1. ubuntu-18.04.6 には多くの変更がありましたかgrep?
  2. grep でファイル パターンを指定するにはどうすればいいですか?数年前に使用していたような のよう*.cなパターンが使用できないのはなぜですか?*.h *.c*
  3. 同僚から を使用するように勧められましたackが、ほぼ同じ結果になりました。grep以前のようにグローバル文字列検索を行うには、どのようなコマンドを使用すればよいでしょうか?

答え1

ここで問題が 2 つあります。まず、またはフラグを組み合わせて、ターゲット ファイル名を引数として指定することはできません-r。/-R-r再帰-R検索をオンにします。これは「指定されたディレクトリ内のすべてのファイルを検索する」という意味で、grepその引数をファイルを検索するディレクトリとして扱います。glob に一致する名前のディレクトリがないため*.c*、表示されるエラーが発生します。私の記憶では、少なくとも Linux を使い始めてから 25 年近く経ちますが、これは常に当てはまっていました。

-r/-Rフラグを使用しない場合は、グロブを自由に使用できます。しかしこれらは引用符で囲む必要があります。これは必須です。引用符で囲まない場合、シェルによって glob が一致するファイルに展開され、grepglob は表示されず、シェルによる展開の結果のみが表示されます。つまり、現在のディレクトリ内で glob に名前が一致するファイルまたはディレクトリのみが表示されます。

現在、grepLinux のデフォルトである GNU には、必要なことを実行する方法がありますが、構文が異なります。

grep 44738 -r -l --include='*.h'

見るman grep

  --include=GLOB
          Search only files whose base name matches GLOB (using  wildcard
          matching  as  described  under  --exclude).   If  contradictory
          --include and --exclude options are given,  the  last  matching
          one  wins.   If no --include or --exclude options match, a file
          is included unless the first such option is --include.

関連情報