web-dev-qa-db-ja.com

複雑な検索のためにfindとgrepを組み合わせる方法は? (GNU / linux、find、grep)

GNU/Linuxでは、同じディレクトリ構造を共有しているが同じディレクトリツリーにないファイルでテキスト検索を実行しようとしています。

同じツリー構造(Code Igniter MVC PHP Framework))を共有する多くのサイトを持つWebサーバーがあるので、各サイトのツリーの下の特定のディレクトリを検索したいとします。例:

/srv/www/*/htdocs/system/application/

ここで*はサイト名です。そして、それらのapplicationディレクトリから、すべてのツリーをそのリーフまで検索し、テキストパターンが含まれる* .phpファイルを探します。たとえば、「debug(」としましょう。正規表現は必要ありません。

findgrepの使い方は知っていますが、それらを組み合わせるのは得意ではありません。

どうすればいいですか?
前もって感謝します!

18
Petruza

試す

find /srv/www/*/htdocs/system/application/ -name "*.php" -exec grep "debug (" {} \; -print

これにより、applicationの下のフォルダーを再帰的に検索して、.php拡張子が付いたファイルを探し、grepに渡します。

これを最適化するには、次を実行します。

find /srv/www/*/htdocs/system/application/ -name "*.php" -print0 | xargs -0 grep -H "debug ("

これは、xargsを使用して、findによって出力されたすべての.phpファイルを引数として単一のgrepコマンドに渡します。例:grep "debug (" file1 file2 file3find-print0オプションとxargs-0オプションは、ファイル名とディレクトリ名のスペースが正しく処理されるようにします。 grepに渡される-Hオプションは、すべての状況でファイル名が確実に出力されるようにします。 (デフォルトでは、grepは、複数の引数が渡された場合にのみファイル名を出力します。)

Man xargsから:

-0

      入力項目は空白文字ではなくヌル文字で終了し、引用符とバックスラッシュは特別なものではありません(すべての文字が文字どおりに解釈されます)。ファイル終了文字列を無効にします。これは、他の引数と同様に扱われます。入力項目に空白、引用符、またはバックスラッシュが含まれる可能性がある場合に役立ちます。 GNU find -print0optionは、このモードに適した入力を生成します。
21
user4358

この例ではfindも必要ありません。grepを直接使用できます(少なくとも_GNU grep_):

_grep -RH --include='*.php' "debug (" /srv/www/*/htdocs/system/application/
_

そして、私たちは単一のプロセスフォークにダウンしています。

オプション:

  • _-R, --dereference-recursive Read all files under each directory, recursively. Follow all symbolic links, unlike -r._
  • _-H, --with-filename Print the file name for each match. This is the default when there is more than one file to search._
  • --include=GLOB Search only files whose base name matches GLOB (using wildcard matching as described under --exclude).
  • _--exclude=GLOB Skip any command-line file with a name suffix that matches the pattern GLOB, using wildcard matching; a name suffix is either the whole name, or any suffix starting after a / and before a +non-/. When searching recursively, skip any subfile whose base name matches GLOB; the base name is the part after the last /. A pattern can use *, ?, and [...] as wildcards, and \ to quote a wildcard or backslash character literally._
10

シェルはphpファイルを見つけてgrepに渡すことができます。バッシュで:

shopt -s nullglob globstar
grep searchterm /srv/www/*/htdocs/system/application/**/*.php
0
user2394284