閑古鳥

オールドプログラマの日記。プログラミングとか病気(透析)の話とか。

PowerShellでfind/grep

任意のフォルダの以下にあるファイルを再帰的に検索(grep)、というのをPowerShellでやりたくなりました。たとえば、ソースファイルの中からboostのヘッダファイルをインクルードしている行を抽出する、というようなものです。

Cygwinでは以下のようにすると実現できます。

find ./ -type f \( -name '*.cpp' -or -name '*.h' -or -name '*.hpp' \) | xargs grep '#include <boost'
# zshだとfindが要らないらしい…

findで拡張子がcpp/hpp/hになっているファイルを検索して、'#include <boost/'という文字列を含む行をgrepで検索します。

PowerShellではfindとgrepに対応するコマンドレットがそれぞれ以下のように定義されています。

Unixコマンド PowerShell
find Get-ChildItem
grep Select-String

Get-ChildItemはlsという別名(Alias)を持っています。Select-Stringも長いので、grepで使えるようにしてしまいます。

Set-Alias grep Select-String

あとは以下のような感じでコマンドを打てばOKです。

ls -r -include *.cpp,*.hpp,*.h | grep '#include <boost'