ディレクトリ内のすべてのファイルのテキスト文字列を検索したい(サブディレクトリではなく、-r
オプションがそれを行うことを知っているが、それは私が望んでいるものではない)。
ランニング
grep "string" /path/to/dir
私は読んだことがありますが、これを行うことができるはずですが、それは私にエラーを与えます:
grep:dir:ディレクトリです
次に、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)のように、ディレクトリでgrep
を使用できないのはなぜですか?私はそれがインターネットでたくさんの例で行われているのを見てきました。
編集:「ディレクトリでgrepを使用する」と言うとき、「そのディレクトリのサブディレクトリを除くすべてのファイルを検索する」という意味です。これは、ファイルの代わりにディレクトリを渡すときにgrepが行うことだと思います。私は間違っていますか?
(2)のコマンドの動作を説明するgrep
の動作に関する説明を教えてください。
編集:具体的に説明します。なぜワイルドカードを使用して複数のファイルを指定して、.bash*
または*
でなく./*
で作業を検索するのですか?
grep
を使用して、ディレクトリ内のすべてのファイル(およびサブディレクトリではない)を検索するにはどうすればよいですか?
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/*
†誰かがこのエラーを受け取ってはいけないと言った。彼らは正しいかもしれません-私はいくつかの読書をしましたが、自分でそれの頭や尾を作ることができませんでした。
-d skip
オプションを追加する必要があります。
Grepはファイル内を検索しています。前述のように、ディレクトリ内のファイルを検索する場合は、再帰的に検索できます。
デフォルトでは、grepはすべてのファイルを読み取り、ディレクトリを検出します。デフォルトでは、-d
オプションを使用してディレクトリの処理を定義していないため、エラー出力が表示されます。
親ディレクトリ内でのみ検索すると、 `grep -d skip" string "./*になります。
古いタイマーはおそらくこれを行うでしょう:
find . -type f -print0 | xargs -0 grep "string"
言い換え-1つのレベルのサブディレクトリ内のファイルをgrepしたいが、すべてのサブサブディレクトリを再帰しませんか?
grep forthis * */*
または、現在のディレクトリにファイルが必要ない場合
grep forthis */*
これは、ドットで始まるディレクトリを検出しないことに注意してください。
grep forthis .*/* */*
その仕事をする必要があります。
find
コマンドで利用可能な-maxdepth
および-mindepth
制限パラメーターもあります。