web-dev-qa-db-ja.com

Linuxでgrepを使ってファイル名だけを表示するにはどうすればよいですか。

Linuxでgrepを使用してファイル名のみを表示する(インライン一致しない)にはどうすればよいですか。

私は通常次のようなものを使っています:

find . -iname "*php" -exec grep -H myString {} \;

ファイル名(パス付き)を取得する方法はありますが、一致するものはありません。 xargsを使う必要がありますか?私はgrepのmanページでこれを行う方法を見ませんでした。

877
cwd

標準オプションのgrep -l(これは小文字のLです)がこれを行うことができます。

Unix標準から

-l
    (The letter ell.) Write only the names of files containing selected
    lines to standard output. Pathnames are written once per file searched.
    If the standard input is searched, a pathname of (standard input) will
    be written, in the POSIX locale. In other locales, standard input may be
    replaced by something more appropriate in those locales.

この場合も-Hは必要ありません。

1339
Random832

grep(1)のmanページから:

  -l, --files-with-matches
          Suppress  normal  output;  instead  print the name of each input
          file from which output would normally have  been  printed.   The
          scanning  will  stop  on  the  first match.  (-l is specified by
          POSIX.)
115

単純なファイル検索のために、grepの-l-rオプションを使うことができます:

grep -rl "mystring"

検索はすべてgrepによって行われます。もちろん、他のパラメータでファイルを選択する必要がある場合は、findが正しい解決策です。

find . -iname "*.php" -execdir grep -l "mystring" {} +

execdirオプションは、各ディレクトリごとに各grepコマンドを作成し、ファイル名を1つのコマンド(+)のみに連結します。

29
user2350426