私は何十年もの間 '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
この結果は、数年前の私の経験とほぼ矛盾しています。私の質問は次のとおりです。
- ubuntu-18.04.6 には多くの変更がありましたか
grep
? - grep でファイル パターンを指定するにはどうすればいいですか?数年前に使用していたような のよう
*.c
なパターンが使用できないのはなぜですか?*.h
*.c*
- 同僚から を使用するように勧められました
ack
が、ほぼ同じ結果になりました。grep
以前のようにグローバル文字列検索を行うには、どのようなコマンドを使用すればよいでしょうか?
答え1
ここで問題が 2 つあります。まず、またはフラグを組み合わせて、ターゲット ファイル名を引数として指定することはできません-r
。/-R
は-r
再帰-R
検索をオンにします。これは「指定されたディレクトリ内のすべてのファイルを検索する」という意味で、grep
その引数をファイルを検索するディレクトリとして扱います。glob に一致する名前のディレクトリがないため*.c*
、表示されるエラーが発生します。私の記憶では、少なくとも Linux を使い始めてから 25 年近く経ちますが、これは常に当てはまっていました。
-r
/-R
フラグを使用しない場合は、グロブを自由に使用できます。しかしこれらは引用符で囲む必要があります。これは必須です。引用符で囲まない場合、シェルによって glob が一致するファイルに展開され、grep
glob は表示されず、シェルによる展開の結果のみが表示されます。つまり、現在のディレクトリ内で glob に名前が一致するファイルまたはディレクトリのみが表示されます。
現在、grep
Linux のデフォルトである 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.