web-dev-qa-db-ja.com

特定のテキスト文字列と拡張子を持つフォルダ内のすべてのファイルを見つけるにはどうすればよいですか?

OSXを使用しています。

.php拡張子と文字列41がファイルの内容のどこかにあるディレクトリでファイルを見つける必要があります。

grepを使ってみました。

grep -R 41 *.php

ただし、これはCWDでのみファイルを検索し、サブディレクトリでは検索しないようでした。

また、findをいじってみました。

私はこれを理解することができませんでした。

私は何が間違っているのですか?

5
alex

両方が必要です。

find . -name '*.php' -type f -exec grep -q 41 {} \; -print

grepが再帰的に機能するためには、grepの引数に、再帰が予想されるディレクトリを含める必要があります。

次のファイルを見てください

shiny:t fl$ find .
.
./evenmore
./evenmore/foo.php
./evenmore/inhere.php
./evenmore/no41in.php
./foo.php
./inhere.php
./morestuff
./morestuff/foo.php
./morestuff/inhere.php
./morestuff/no41in.php
./no41in.php
./stuff
./stuff/no41in.php

これは動作しません:

shiny:t fl$ grep -r 41 *.php
foo.php:41
inhere.php:41

パス名の展開が行われた後、シェルはアスタリスクを処理し、コマンドラインは現在

shiny:t fl$ set -x
shiny:t fl$ grep -r 41 *.php
+ grep -r 41 foo.php inhere.php no41in.php
foo.php:41
inhere.php:41

grepに渡された引数に子孫となるディレクトリはありません。ただし、これは存在するすべてのディレクトリで下降します。

shiny:t fl$ grep -r 41 .
./evenmore/foo.php:41
./evenmore/inhere.php:41
./foo.php:41
./inhere.php:41
./morestuff/foo.php:41
./morestuff/inhere.php:41

それがドットディレクトリも処理するかどうかは、読者の練習問題として残されています:-)

1
Florenz Kley

ack を使用すると、ack 41 --phpを実行できます。

ackgrepに似ており、強調表示と行番号が組み込まれており、ソースコードを検索するために設計されています。

1
Andy Lester

なんとか使った

grep 41 **/*.php

そしてそれはうまくいった。

0
alex