指定したパスの中にあるファイルの中身を検索したいときに、linux ならば grep を使えばいいのですが、Windows にはそんなコマンドはないのです。Windows でもできないか調べたところ PowerShell を使えばいいようなので試してみました。
やりたいことは、あるディレクトリ内で指定した文字列が含まれるファイルを抽出することです。さらに拡張子も絞って、一部ディレクトリを除外したいです。
まずはコマンドから。
get-childitem "【検索したいディレクトリ】*" -include "*.【拡張子】" -recurse | where-object {$_.directory -notlike "【除外するディレクトリ】*"} | select-string -pattern "【正規表現】"
使い方は以下のような感じです。「C:\curry\」フォルダ(サブフォルダ内も含む。ただし「C:\curry\hot\」以下は除外)から、文字列「indian」がファイル内に含まれる「php」ファイルを検索します。
get-childitem "C:\curry\*" -include "*.php" -recurse | where-object {$_.directory -notlike "C:\curry\hot\*"} | select-string -pattern "indian"
上のコマンドだとファイル内で一致した文字列と、その文字列がある行数も出力されます。ファイルパスのみ取得したい場合は、後ろに以下のコマンドを追加します。最初の半角スペースを忘れないようにしてください。
-List | Select-Object Path
文字コードが Shift-JIS(CP932)のファイルを検索したい場合は、Select-String のオプションで以下のように指定すると検索できます。
-Encoding Default
以下のようにしてよく使っています。
get-childitem "C:\*" -exclude *.gif,*.jpg,*.jpeg,*.gif,*png,*.exe,*.jar,*.pdf,*.dll,*.zip,*.log,*.bk -recurse | where-object {$_.directory -notlike "*.svn*"} | select-string -pattern "【検索したい文字】"