質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.02%
grep

grepはコマンドライン上でテキスト検索を可能にするユーティリティーです。元はUnixのために用意されたものです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Vim

VimとはUnix / Linux 系のOSに標準搭載されているターミナル上で動くテキストエディタです。

Q&A

解決済

grepでカレントディレクトリとサブディレクトリ全体を検索するには?

_CHO
_CHO

総合スコア16

grep

grepはコマンドライン上でテキスト検索を可能にするユーティリティーです。元はUnixのために用意されたものです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Vim

VimとはUnix / Linux 系のOSに標準搭載されているターミナル上で動くテキストエディタです。

5回答

0グッド

0クリップ

7493閲覧

投稿2015/09/07 13:30

編集2015/09/07 13:32

Linuxのgrepコマンドを実行した際に、カレントディレクトリのファイルとサブディレクトリのファイルすべてを検索するにはどうすればよいでしょうか?

カレントディレクトリに、"c_file1.c" というファイルを置いてあるとします。

./c_file1.c の内容は以下の通り。

C

1/* This is c_file1.c */ 2int c_function_1(void){ 3 return 0; 4}

また、カレントディレクトリ上の "folder1" というフォルダの中に、"c_file2.c" というファイルを置きます。

./folder1/c_file2.c の内容は以下の通り。

C

1/* This is c_file2.c */ 2int c_function_2(void){ 3 return 0; 4}

この環境下で、カレントディレクトリから "grep" コマンドを使い、"c_function_1" と "c_function_2" を両方抽出するにはどのように実行すればよいでしょうか?

たとえば、
$ grep -r "c_function_*" **/*.c
を実行すると、"c_file2.c" 上の、"c_function_2" はヒットしますが、"c_file1.c" 上のコードはヒットしません。
カレントディレクトリより一つ上のディレクトリから同じコマンドを実行すれば、両方ともヒットするのですが、やりたいことは、カレントディレクトリの変更をせずにヒットさせることです。

また、"grep" コマンドに加えて、vimgrepでも同様のことをやる方法を教えてください。

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答5

2

ベストアンサー

とりあえず普通の grep だけ・・・


find と xargs を組み合わせる方法をよく見かけます。

find . -name '*.c' | xargs grep 'c_function_*'

gnu grep なら grep だけでもできそうです。

grep -r --include '*.c' 'c_function_*' .

投稿2015/09/07 13:53

ngyuki

総合スコア4510

act823, pi-chan👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

2

**ということはzshですかね。
単に、
$ grep -r "c_function_*" *.c **/*.c
でいいのは?

追記:
訂正です。zshだと**でカレントディレクトリもマッチしますね。ということは、zshではなくて、***の書き誤りでしょうか?それでも、
$ grep "c_function_*" *.c */*.c
で良いですね。

投稿2015/09/07 13:49

編集2015/09/07 14:03
otn

総合スコア80508

pi-chan, argius👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

1

find . -name ¥*.c -print | xargs grep なんちゃら

で探せると思います。

投稿2015/09/07 13:47

umeaji

総合スコア101

act823👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

0

vimgrepを使える環境が無いので、grepに関してだけですが。

find . -name "*.c" -exec grep -Hn c_function_ {} ;

-Hn で、マッチしたフルパス名、そのファイルの行番号、行の中身を表示します。

投稿2015/09/15 12:54

hiroshi.kato

総合スコア93

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

0

私は、フォルダ以下の文字列検索は、もっぱら ag をつかっています。

(ag は .git や .svn 以下を検索対象から除外してくれます)

grep, find で行うなら、以下のページが参考になります。

投稿2015/09/07 20:20

katoy

総合スコア22306

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.02%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

grep

grepはコマンドライン上でテキスト検索を可能にするユーティリティーです。元はUnixのために用意されたものです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Vim

VimとはUnix / Linux 系のOSに標準搭載されているターミナル上で動くテキストエディタです。