任意のフォルダの以下にあるファイルを再帰的に検索(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'