当方、vimで開発をすることが多いのだが、Linuxでカレントディレクトリから特定のディレクトリ内を文字列検索する時によく使う
1 |
$ find -type f | xargs grep XXXX |
について、改めて具体的に何をどうやって検索しているのか気になったのでメモ代わりに残しておく。
find -type fの意味おさらい
findコマンドの基本は
1 |
$ find XXXXX |
で、XXXXXというファイル名もしくはディレクトリ名をカレントディレクトリにて検索することだ。
大事なポイントとしては
ファイル名orディレクトリ名を指定しない場合、カレントディレクトリ以下を対象として全てのファイルとディレクトリをリストアップできる
ことにある。
これに付随して、
1 |
$ find XXXXX -type f |
というようにして-type fオプションをつけると、ファイルのみを対象として検索することができるようになる。余談だが-type dはディレクトリのみを検索対象とすることが可能。
以上を総合すると、
1 |
$ find -type f |
というコマンドで、
カレントディレクトリ以下にあるファイル名を全て抽出
してくれるわけだ。
参考)
| xargs grepの意味おさらい
|はパイプと読み、パイプの前後にコマンドを書くことで
パイプの前のコマンドの入出力をパイプの後のコマンドへ引き渡す
ことができる。英語でいうところの関係代名詞の役割に近い。
xargsが結構重要なコマンドで、標準入力やファイルからリストを読み込み、コマンドラインを作成して実行するというもの。具体的には
1 |
find -type f | xargs (コマンド) |
と書くことにより、
xargsの後ろに記載したコマンドをfind -type fで出力された行単位で適用し、実行する
ことができる。
例えばfind -type f により、カレントディレクトリ以下の結果が下記のようであったとする:
1 2 3 4 5 |
$ find -type f ./index.ctp ./add.ctp ./edit.ctp $ |
これに対し、
1 |
$ find -type f | xargs grep XXXXX |
と繋げてやると、やっていることとしては
1 2 3 |
grep XXXXX ./index.ctp grep XXXXX ./add.ctp grep XXXXX ./edit.ctp |
と同じことになる。大変便利。
grepは解説するまでもないと思うが、
1 |
grep XXXXX ファイル名 |
でファイル名に対し、XXXXXという文字列が記載された行をリストアップしてくれるというものだ。
参考)
終わりに
find -type f | xargs grepは普段からよく使うコマンドだと思うが、それだけに意味を細かく追ったことがなかったので勉強になった。余談だが、Linuxコマンドを完全に網羅していたらそれだけで飯食っていけるんじゃないかと思う今日この頃。