はじめに #
PowerShellを使って、サブフォルダを含む複数のテキスト形式のファイルから文字列を検索するには以下を実行します。
ls -R | sls [検索したい文字列]
例: 123という文字列を検索する場合
ls -R | sls "123"
実行すると、ヒットしたファイル名、何行目か、およびその行の文字列が一覧で表示されます。
test1.txt:1:No. 123
sub_folder\test2.txt:2:123456
動作を確認した環境は以下の通りです。
- Windows 10 Home 21H1
- PowerShell 5.1.19041.1320
以降では上記のコマンドの詳細や、より細かな検索条件を指定する場合のオプションを解説します。
コマンドの詳細 #
前出のコマンドにおいて、lsはGet-ChildItem, slsはSelect-Stringの省略形(エイリアス)です。すなわち、以下のように実行しても同じ結果が得られます。
Get-ChildItem -R | Select-String [検索したい文字列]
Get-ChildItemはカレントディレクトリにあるファイルを全て返すコマンドです。オプションに-Rを付けることによって、サブフォルダにあるファイルも取得できます。
取得したファイルをパイプライン|を使って、Select-Stringに渡します。
Select-Stringはファイル内のテキストを検索するコマンドです。
正規表現による検索 #
slsで検索する文字列には正規表現を使用できます(後述のワイルドカードは使用できません)。簡単な正規表現を以下に示します。
| 記号 | 説明 |
|---|---|
| . | 任意の1文字 |
| * | 直前の文字の0回以上の繰り返し |
| + | 直前の文字の1回以上の繰り返し |
| ? | 直前の文字が0回か1回 |
| [a-z] | 範囲内の1文字 |
| [abc] | いずれか1文字 |
正規表現の例をいくつか示します。
| 記述例 | 一致する | 一致しない |
|---|---|---|
l.w |
low, law | lw |
no*n |
nn, non, noon | norman |
no+n |
non, noon | nn, norman |
no?n |
nn, non | noon, norman |
[a-d]ook |
book, cook | look |
正規表現の詳細は以下のページを参考にしてください。
大文字と小文字の区別 #
デフォルトではアルファベットの大文字と小文字は区別されません。区別するには、slsに-CaseSensitiveオプションを付けます。
以下の例では文字列FISHはヒットしますが、fishやFishはヒットしません。
ls -R | sls FISH -CaseSensitive
日本語のエンコーディング #
日本語を検索するときには、テキストファイルのエンコーディングに注意する必要があります。
Shift-JISでエンコーディングされているファイルを検索するときには、slsに-Encoding defaultオプションを付けます。付けなかった場合は、UTF-8でエンコーディングされたファイルが検索されます。
ls -R -Filter test.txt | sls "あいうえお" -Encoding default
ファイル名で絞り込み #
検索にヒットするファイルが多過ぎる場合は、lsの-Filterオプションを使ってファイル名で絞り込みます。-Filterの後ろにファイル名を与えます。
例1:test.txtというファイルのみ検索したい場合
ls -R -Filter test.txt | sls "123"
また、-Filterではワイルドカードを使って柔軟にファイル名を指定できます(前述の正規表現は不可)。ワイルドカードの例を以下に示します。
| 記号 | 説明 | 記述例 | 一致する | 一致しない |
|---|---|---|---|---|
* |
0文字以上の任意の文字 | *low |
low, flow, shallow | abc |
? |
任意の1文字 | a?c |
abc, arc | ac, abbc |
[ ] |
範囲内の1文字 | a[a-c]c |
abc, acc | arc, ac |
[ ] |
いずれか1文字 | a[br]c |
abc, arc | aac, ac |
例2:拡張子が.txtというファイルのみ検索したい場合
ls -R -Filter *.txt | sls "123"