Edited at

【Linuxコマンド】findコマンドで特定の関数が使用されているファイルを見つける

More than 1 year has passed since last update.


コマンドを使用する目的

特定のファイルを見つけ出すにはfindコマンドが多用されるかと思います。今回の内容も、特段目新しいものではありません。

以下のコマンドは膨大なファイルから特定の関数が使用されているファイルを見つけるために、職場の先輩から教わりました。

$ find . -name '*.php' | xargs grep '関数名'

以前からfindコマンドは利用していましたが、自分は単純にファイルを見つけるコマンドとしか捉えていませんでした。今回のように特定の関数を見つけ出す場合、該当ファイルを開いて地道にCtrl+Fで全文検索してましたから(´;ω;`)

個々のコマンドを知るのは大事ですが、どこでどういう目的で使用するのかも重要です。コマンドに限らず、独学だと使用目的のバリエーションが広がりにくいのが難点ですね。

忘れないうちに、各コマンドの解説とともにメモしておきます。


findコマンド


基本

ファイルを探すためのコマンドです。知名度高し。ファイルだけでなく、ディレクトリも検索対象になります。

.でカレントディレクトリを指定すれば、カレントディレクトリ以下を検索します。

同じく1階層上にあるディレクトリは../../parents、同階層にあるディレクトリは../brotherのように指定します。

$ find .

この状態で使用しても全てのファイル・ディレクトリが表示されるだけなので、ここから絞って行きます。


nameオプション

ファイル名・ディレクトリ名を指定して検索する場合に使用するオプションです。inameオプションであれば、名前の大文字小文字は区別されません。

以下のコマンドで、カレントディレクトリにあるtest.htmlが検索されます。

$ find . -name test.html

./test.html

ファイル名が一部しかわからない場合は、ワイルドカードを使用します。*は任意の文字列、?は任意の1文字を意味します。

ワイルドカードを使用する場合は、必ずクォーテーションで文字列を囲ってください。

$ find . -name 'test*'

./test2.html
./test001.html
./test.html
./testdir


typeオプション

ファイルの種類を指定します。-type dでディレクトリのみ、-type fでファイルのみを検索対象とすることができます。

以下のコマンドでは、名前がtestで始まるディレクトリに限定して検索を行なっています。

$ find . -type d -name 'test*' 

./testdir


grepコマンド

ファイル内の文字列を検索するコマンドです。nオプションで行番号の表示ができます。

以下のコマンドでは、test.htmlに対してtestという文字列が存在する行を検索しています。この場合、クォーテーションの有無は関係ありません。

$ grep -n test test.html 

7: <p>git_test</p>

vオプションを指定すると、反対に指定する文字列が存在しない列を抽出します。

$ grep -n -v test test.html

1:<!DOCTYPE html>
2:<html lang="ja">
3: <head>
4: <meta charset="UTF-8">
5: </head>
6: <body>
8:
9:
10: </body>
11:</html>


xargsコマンド

前のコマンドから実行結果(標準入力)を受け取り、それを次のコマンドで引数として扱います。単体で使用するのではなく、その引数を利用するコマンドも指定します。

仮にxgargs grepと指定した場合、前のコマンドで出力されたファイルを引数にしてgrepコマンドが実行されます。

合わせてパイプライン(前のコマンドの標準出力を、別のコマンドの標準入力につなぐ)という機能が使用されています。


コマンドの意味

$ find . -name '*.php' | xargs grep '関数名'

処理の流れはこんな感じです。



  1. findコマンドでカレントディレクトリからphpファイルを探す。

  2. 1.の結果を引数にしてgrepコマンドを実行する。


  3. grepコマンドで、指定した関数名を含むファイルを見つけ出す。

様々な場所や状況で利用できるコマンドです(^ω^)