web-dev-qa-db-ja.com

ディレクトリ内のすべてのファイルに対して非再帰的にgrepを使用する方法は?

ディレクトリ内のすべてのファイルのテキスト文字列を検索したい(サブディレクトリではなく、-rオプションがそれを行うことを知っているが、それは私が望んでいるものではない)。

  1. ランニング

    grep "string" /path/to/dir
    

    私は読んだことがありますが、これを行うことができるはずですが、それは私にエラーを与えます:

    grep:dir:ディレクトリです

  2. 次に、grepを複数のファイルで実行してみました。

    grep "string" .bashrc .bash_aliasesは完全に機能します。

    grep "string" .bash*も意図したとおりに機能します。

    grep "string" *はエラーを表示します:

    grep: data: Is a directory
    grep: Desktop: Is a directory
    grep: Documents: Is a directory
    grep: Downloads: Is a directory
    ...
    

エラーのみが出力され、一致する行が表示されません。 -sオプションを使用してみましたが、役に立ちませんでした。

だから、私の質問:

  1. (1)のように、ディレクトリでgrepを使用できないのはなぜですか?私はそれがインターネットでたくさんの例で行われているのを見てきました。
    編集:「ディレクトリでgrepを使用する」と言うとき、「そのディレクトリのサブディレクトリを除くすべてのファイルを検索する」という意味です。これは、ファイルの代わりにディレクトリを渡すときにgrepが行うことだと思います。私は間違っていますか?

  2. (2)のコマンドの動作を説明するgrepの動作に関する説明を教えてください。
    編集:具体的に説明します。なぜワイルドカードを使用して複数のファイルを指定して、.bash*または*でなく./*で作業を検索するのですか?

  3. grepを使用して、ディレクトリ内のすべてのファイル(およびサブディレクトリではない)を検索するにはどうすればよいですか?

26
John Red

Bashでは、グロブは隠しファイルに展開されません。したがって、ディレクトリ内のファイルを検索する場合は、all隠しファイル.*および非隠し*を指定する必要があります。

「Is a directory」エラーを回避するには、-d skipを使用できますが、私のシステムでは、エラーgrep: .gvfs: Permission deniedも表示されます。、したがって、すべてのエラーメッセージを非表示にする-sを使用することをお勧めします。

したがって、あなたが探しているコマンドは次のとおりです。

grep -s "string" * .*

別のディレクトリでファイルを検索する場合:

grep -s "string" /path/to/dir/{*,.*}

別のオプションは、dotglob Shellオプションを使用することです。これにより、グロブに隠しファイルが含まれるようになります。

shopt -s dotglob
grep -s "string" *

別のディレクトリ内のファイルの場合:

grep -s "string" /path/to/dir/*

†誰かがこのエラーを受け取ってはいけないと言った。彼らは正しいかもしれません-私はいくつかの読書をしましたが、自分でそれの頭や尾を作ることができませんでした。

33
wjandrea

-d skipオプションを追加する必要があります。

  1. Grepはファイル内を検索しています。前述のように、ディレクトリ内のファイルを検索する場合は、再帰的に検索できます。

  2. デフォルトでは、grepはすべてのファイルを読み取り、ディレクトリを検出します。デフォルトでは、-dオプションを使用してディレクトリの処理を定義していないため、エラー出力が表示されます。

  3. 親ディレクトリ内でのみ検索すると、 `grep -d skip" string "./*になります。

10
anonymous2

古いタイマーはおそらくこれを行うでしょう:

find . -type f -print0 | xargs -0 grep "string"
7
dathompson

言い換え-1つのレベルのサブディレクトリ内のファイルをgrepしたいが、すべてのサブサブディレクトリを再帰しませんか?

grep forthis  *  */*

または、現在のディレクトリにファイルが必要ない場合

grep forthis  */*

これは、ドットで始まるディレクトリを検出しないことに注意してください。

grep forthis  .*/*    */*   

その仕事をする必要があります。

findコマンドで利用可能な-maxdepthおよび-mindepth制限パラメーターもあります。

1
Criggie