Programming Field

DOS コマンド一覧

Findstr

[Windows 2000以降] ファイルや標準入力から、指定されたパターンに一致する文字列を検索します。Findよりも詳細なオプション・検索パターンを指定することができます。

※ ファイルはShift JISとして検索されます。ただし /G オプションでShift JIS以外の文字コードのテキストを読み込んだ場合、その文字コードと検索対象のファイルの文字コードが一致していれば検索できる場合があります。

構文

findstr[.exe] [/B] [/E] [/L | /R] [/S] [/I] [/X] [/V] [/N] [/M]
    [/O] [/P] [/OFF[LINE]] [/A:<color-attr>] [/C:<pattern>]
    [/D:<directories>] [/F:<list-file>] [/G:<pattern-file>]
    <pattern> [[<drive>:][<path>]<file-name> ...]
/B
指定したパターンに一致する文字列が行頭にある時一致するとみなします。行頭にスペースがある場合も無視されず、スペースを含めてパターンに一致するかどうかの比較が行われます。
/E
指定したパターンに一致する文字列が行末にある時一致するとみなします。行末にスペースがある場合も無視されません。/B と同時に指定されている場合は、パターンに一致する文字列のみで行が構成されている場合に限り、その行が一致するとみなします(/X を指定するのと同じです)。
/L
<pattern> を通常の文字列(文字列リテラル)として検索します。比較は単純に <pattern> に指定された文字列と一致するかどうかで行われます。
/R
<pattern> を「正規表現」と見なして検索します。正規表現については後述の解説をご覧ください(使用できるパターンの種類は限られています)。
/S
「[<drive>:][<path>]」で指定されたパス(指定されていない場合は現在のディレクトリ)だけでなく、その中にあるサブディレクトリすべてにおいて、<file-name> または /F で指定されたファイルが存在する場合にそれらを検索対象とします。
/I
検索する文字列の大文字・小文字を区別しません。
/X
指定したパターンに完全一致する行を検索します。
/V
指定したパターンに一致する文字列が「存在しない」行を出力します。/X が指定されている場合はパターンに完全一致しない行すべてが出力されます。
/N
検索にヒットした行を表示する際、行番号を表示します。/M が指定されているときは意味がありません。
/M
検索し終えたときに一致した行が存在するファイルの名前をすべて出力します。/V が指定されていないときはパターンに一致する文字列が存在したファイル、/V が指定されているときは存在しなかったファイルを表示します。
/O
検索にヒットした行を表示する際、その行がファイル全体で何バイト目にあたるか(オフセット)を表示します。/N が指定されている場合は行番号とオフセット両方を表示します。/M が指定されているときは意味がありません。
/P
画面に出力できない文字を含むファイル(バイナリーファイルなど)を検索対象から除外します。
/OFF[LINE]
「オフライン属性」が指定されたファイルをスキップせず、検索します。
/A:<color-attr>
ファイル名(検索対象ファイルが複数ある場合)や行番号(/N)、オフセット(/O)を出力する際に、出力するテキストの色を指定します。<color-attr> にはColorコマンドと同じ形式で指定します。/M が指定されているときは意味がありません。
/C:<pattern>
検索パターンを指定します。/C を使用せずに指定した場合はスペースで分割され、それぞれのパターンのいずれかに一致するファイルが検索されますが、/C を使用してパターンを指定した場合はスペースで分割されず、指定したパターン全体を用いて検索を行います(スペースなどを含む場合は <pattern> を「" "」で括る必要があります)。
/C は複数指定することができます。その場合はいずれかのパターンに一致するファイルを検索します。なお、/C を使用した場合は /C を使わない「<pattern>」の指定ができなくなります。
/D:<directories>
検索対象のディレクトリを指定します。「;」を区切り文字として複数のディレクトリを指定することができます。
この指定は、指定されたディレクトリを(ドライブ含めて)一時的に「現在のディレクトリ」とするため、「[<drive>:][<path>]」の指定がある場合はそれを重ねて使用します。
  • 「/D:D:」が指定され、検索ファイルが「*.txt」と指定されている場合は、Dドライブの「現在のディレクトリ」(Cdの説明をご覧ください)における「*.txt」ファイルを検索します。
  • 「/D:D:」が指定され、検索ファイルが「\Sources\*.cpp」と指定されている場合は、Dドライブの「\Sources」ディレクトリにおける「*.cpp」ファイルを検索します。
  • 「/D:\Temp」が指定され、検索ファイルが「*.txt」と指定されている場合は、現在のドライブの「\Temp」ディレクトリにおける「*.txt」ファイルを検索します。
  • 「/D:\Temp」が指定され、検索ファイルが「C:*.txt」と指定されている場合は、現在のドライブに「\Temp」ディレクトリが存在しないと失敗しますが、検索対象はCドライブの「現在のディレクトリ」における「*.txt」ファイルとなります。
  • 「/D:D:\Temp」が指定され、検索ファイルが「*.txt」と指定されている場合は、「D:\Temp」ディレクトリにおける「*.txt」ファイルを検索します。
  • 「/D:D:\Temp」が指定され、検索ファイルが「C:*.txt」と指定されている場合は、「D:\Temp」ディレクトリが存在しないと失敗しますが、検索対象はCドライブの「現在のディレクトリ」における「*.txt」ファイルとなります。
  • 「/D:D:\Temp」が指定され、検索ファイルが「C:\MyData\*.txt」と指定されている場合は、「D:\Temp」ディレクトリが存在しないと失敗しますが、検索対象は「C:\MyData」における「*.txt」ファイルとなります。
/F:<list-file>
検索対象のファイルをコマンドライン(<file-name>)からではなく、<list-file> に指定されたファイルに記述されている内容から取得します。<list-file> に指定するファイルは1行ごとに検索したいファイル名を記述します。
<list-file> に「/」1文字のみを指定すると、ファイル一覧を標準入力(STDIN)から取得します。これは通常、パイプと組み合わせて利用されます。
/G:<pattern-file>
検索パターンをコマンドライン(<pattern> や /C オプション)からではなく、<pattern-file> に指定されたファイルに記述されている内容から取得します。<pattern-file> に指定するファイルは1行ごとに検索パターンを記述します(いずれかのパターンに一致する行が検索されます)。
<pattern-file> に「/」1文字のみを指定すると、検索パターン一覧を標準入力(STDIN)から取得します。
このオプションは /C オプションと同時に指定することができますが、/C を使わない「<pattern>」の指定はできなくなります。
<pattern>
検索パターンを指定します。「"」は付けなくても構いませんが、複数のパターンを指定する場合は"<pattern1> <pattern2> ..."のように指定します。
検索パターンにスペース文字を含めたい場合は /C オプションを用いて指定します。
<drive>:, <path>, <file-name>
検索するファイル名を指定します。ドライブやパスを省略すると現在のドライブ・パスにあるファイルを検索します。ファイル名は複数指定することが可能です。
ファイル名にワイルドカードを指定することができます。

解説

このコマンドはFindコマンドと同様にファイルに含まれる文字列を検索するコマンドですが、Findよりも高度な検索を行うことが可能です。

「/R」を指定した場合に使用できる正規表現は以下の通りです。

パターン意味パターン例パターン一致例
.任意の1文字(1バイト)te.t「test」や「text」など
*0個以上(直前の文字やセットを0回以上繰り返してヒットするかを見ます。ワイルドカードの「*」とは異なります)A *BAB」「A B」「A B」など
^行頭(直後のパターンに一致するテキストが行頭に来ている場合に一致すると見なします)^rem行頭が「rem」となっている行
$行末(直前のパターンに一致するテキストが行末に来ている場合に一致すると見なします)ed$行末が「ed」となっている行
[class]classに指定された文字のうちいずれか1文字h[aio]t「hat」「hit」「hot」のうちいずれか1つ以上を含む行
[^class]classに指定された文字以外の1文字h[^aio]t「het」「hut」など、「hat」「hit」「hot」以外の「『h』+1文字+『t』」を含む行
[x-y]xからyの間に含まれる文字のうちいずれか1文字[0-9][0-9]「04」「53」など2桁の数字を含む行
\xエスケープ(xを特殊文字ではなく普通の文字と見なします)\[[a-z][a-z]*\]「[test]」「[y]」など、「[」で始まり「]」で終わり、その間に小文字アルファベットが1文字以上含まれている文字列を含む行
\<word単語の先頭(wordの前にアルファベットや数字が来ている場合ヒットしません)\<set「set」や「setting」などを含む行(「reset」などとなっているものは除く)
word\>単語の末尾(wordの後にアルファベットや数字が来ている場合ヒットしません)use\>「use」や「excuse」などを含む行(「useless」などとなっているものは除く)

このコマンドは主に以下の終了コード(エラーコード)を返します。バッチファイルでIfとErrorlevelを用いることで、条件分岐を行うことが出来ます。

※ 下記以外の終了コードは確認できていませんが、他の終了コードを返す可能性はあります。

コード意味
0検索は正常終了し、1つ以上のファイル・行がヒットしました。
1ヒットするファイルが見つかりませんでした。検索対象のファイルを開けなかったか、パターンに一致する行を持つファイルが無かったかのいずれか、または両方である可能性があります。
2検索中にエラーが発生しました。(文字列が見つかったかどうかは分かりません)

サンプル1
findstr /n the document.txt

document.txt から「the」という文字列を検索します。検索結果は以下のようになります。

5:and he got the best prize.
サンプル2
findstr /c:"the more" document.txt

document.txt から「the more」という文字列を検索します。スペースを含むパターンを検索したい場合は「/c」で指定します。これを単純に

findstr "the more" document.txt

と指定した場合は、「the」または「more」が含まれる箇所を検索します。

サンプル3
findstr /i /s "TODO:" *.c *.cpp

現在のディレクトリとそのサブディレクトリすべてにある「*.c」ファイルと「*.cpp」ファイルを検索し、「TODO:」という文字列が大文字・小文字問わず見つかった場合それを出力します。(ワイルドカードを使用しています)

MyApp1\Main.cpp:  // TODO: fix width
MyApp2\Sample.c:  // TODO: insert your code here

※ 「/N」を指定している場合は「ファイル名:」の次に「行番号:」が入ります。

サンプル4
findstr /r /c:"^ *echo" *.bat

行頭がスペース文字を除いて「echo」で始まる「*.bat」ファイルを検索します。

サンプル5
dir /a:a /s /b *.txt | findstr /f:/ fox

現在のディレクトリとそのサブディレクトリにある「*.txt」ファイルのうち「アーカイブ属性」の付いたファイルから、「fox」という文字列を含むファイルを検索します。この例では、Dirコマンドで検索したいファイルの一覧を作成し、その出力をFindstrの入力として渡しています。

サンプル6
findstr /g:Y:\checklist.txt /s *.xml

「Y:\checklist.txt」ファイルの各行からパターンを読み取り、それらのパターンいずれかに一致する行を持つ「*.xml」ファイルを、現在のディレクトリとそのサブディレクトリから検索します。

サンプル7
for /f "delims=" %1 in ('findstr /m /v /i stub *.txt') do copy /y "%~f1" E:\Documents\

[拡張構文] 現在のディレクトリにある「*.txt」ファイルのうち「stub」という文字列(大文字・小文字いずれも)を含まないファイルを「E:\Documents」ディレクトリ以下にコピーします。「findstr /m /v /i stub *.txt」の部分でファイルの一覧を出力し、それをForコマンドに渡すことで1行ごと(1ファイルごと)にCopyコマンドを実行します。