今回はWindowsでのファイル検索です(ここでの説明と実行環境はWindows10ですが、Windows 7以降であれば同じように使えると思います)。ここで説明するのはPowerShellではなくてコマンドプロンプトから実行するものです。
Windowsにはファイル検索ができるコマンドはいくつかあります。MS-DOS時代からのコマンドも使えますが、Windowsではより便利なコマンドが用意されています。MS-DOSという用語が死語になってる気もしますので、以下にWikiの解説リンクを載せておきます。CP/Mも死語みたいな気もしますが、興味ある方は検索してみてください。
・MS-DOS
https://ja.wikipedia.org/wiki/MS-DOS
WindowsにもUNIXと同じfindコマンドがあります。が、これはUNIXでのコマンドとは機能が異なります。Windowsのfindコマンドはファイルの検索ではなくて、ファイル内容の検索を行います。UNIXで言うところのgrepに近いコマンドです。今回はファイル内容の検索はしないのでfindコマンドは扱いません。UNIXでのfindコマンドに近いような機能のコマンドとしてforfilesがありますが、これについては次回説明します。
今回もサンプルファイルはデスクトップのsampleディレクトリに入れておきます。また、カレントディレクトリはsampleディレクトリとします。コマンドならcd ¥Users¥ユーザー名¥Desktop¥sampleです。ユーザー名部分は使用しているユーザー名を指定してください。すでにコマンドプロンプト起動時に自分のホームフォルダにいる場合はcd Desktop¥sampleと入力しても構いません。
ディレクトリ内容を表示する
最初にWindowsで使えるコマンドについて把握しておきましょう。Windowsで使えるコマンドについては以下のマイクロソフト社のページに一覧が掲載されています。コマンド名をクリックするとリファレンスが表示され、どのようなオプションが使えるか、コマンドのサンプルなどが掲載されています。
https://docs.microsoft.com/ja-jp/windows-server/administration/windows-commands/windows-commands
まずは昔からあるdirコマンドを使ってみましょう。ちなみにコマンド名は大文字でも小文字でも構いません。MS-DOS時代にならうなら大文字でコマンドを示した方がいいのかもしれませんが、ここでは全部小文字としています。
コマンドで単にdirとだけ入力するとカレントディレクトリの内容が表示されます。その際、サブディレクトリの内容までは表示されません。
サブディレクトリの内容を表示するにはdirの後に半角空白で区切って表示したいサブディレクトリの名前を指定します。以下のようにするとカレントディレクトリにあるphotoディレクトリの内容が表示されます。
dir photo
ただ、この方法だと複数あるサブディレクトリをまとめて表示することができません。そのような場合はdirコマンドのオプションで/sを指定します。以下のようにするとカレントディレクトリ以下のサブディレクトリを再帰的に出力します。
dir /s
単純にdir /sとした場合、ファイルやサブディレクトリ数が多いと表示が流れてしまって把握しにくくなります。幸いdirコマンドにはページ単位で表示を止めてくれる/pオプションがあります。以下のようにするとページ単位で表示され、スペースキー等を押すと次のページが表示されるようになります。なお、オプションはdir /s/pのように半角空白なしでも問題ありません。順番もdir /p/sのように変えても問題ありません。
dir /s /p
dir /w
dir /s /w
ファイル・ディレクトリ情報で単純に名前だけが必要な場合もあります。そのような場合は/bオプションを指定します。
dir /b
サブディレクトリ内もリストアップする場合は/sオプションを付加します。この場合、出力されるファイル名はパス付き(フルパス)になります。
dir /s /b
ここで便利かもしれないclipコマンドを使ってみましょう。clipコマンドは標準入力をクリップボードにコピーしてくれます。先ほどの出力結果をクリップボードにコピーするには以下のようにパイプ記号を使って指定します。
dir /s /b | clip
クリップボードに出力結果が入っているのでメモ帳でテキストデータとして貼り付ける(ペースト)ことができます。
標準出力されるものは何でもコピーできるので便利に使いましょう。
条件にマッチするファイルをリストアップ
dirコマンドは表示するファイル名にワイルドカード(*)を指定することができます。以下のようにするとカレントディレクトリ内にある拡張子がtxtのファイルだけがリストアップされます。
dir *.txt
/bオプションを指定すればマッチしたファイル名だけを表示できます。
dir *.txt /b
サブディレクトリ内にある拡張子txtのファイルまでリストアップするには/sオプションを指定します。以下のようにするとカレントディレクトリ内にあるサブフォルダ内も含めて結果がリストアップされます。/bオプションと併用した方が後々便利かもしれません。
dir *.txt /s
dir *.txt /s /b
テキストファイルではなく画像を検索することもできます。画像の場合、JPEGやPNG形式など様々な種類があります。複数の拡張子を指定して検索するには,で区切って指定します。
dir *.jpg,*.png /s
dir *.jpg,*.png /s /b
他のワイルドカードと組み合わせると応用範囲が広がるかもしれません。UNIXのシェルと比べると使える記号が少ないのですが、それでも上手に組み合わせれば目的のファイルの検索が楽になります。
・4文字のファイル名を検索
・ファイル名の最後が3で終わる(拡張子問わず)
検索した結果をクリップボードにコピーする方法は説明しましたが、ファイルに保存する場合は>記号を使ってリダイレクトします。これはUNIX系と同じです。以下のようにすると検索結果をresult.txtというファイルに保存します。result.txtはカレントディレクトリに保存されます。
dir *.txt /s /b > result.txt
whereコマンド
Windowsでファイルを検索できるのはdirコマンドだけではありません。Windowsには他にもいくつか検索用途に使えるコマンドがあります。whereコマンドも、その1つです。
まずはwhereコマンドを使ってカレントディレクトリ内のファイルを検索してみましょう。以下のように入力するとカレントディレクトリのファイルやディレクトリが表示されます。-rオプションの後に検索対象とするディレクトリパスを指定します。
where *.txt -r c:¥Users¥weed¥Desktop¥sample¥
ディレクトリパスを指定しない場合、カレントディレクトリと環境変数で指定されているディレクトリからの検索になります。まず、検索対象となるパスを確認しておきましょう。コマンドラインでpathと入力すれば設定されているパスが表示されます。
path
以下のように入力すると拡張子がtxtのファイルが検索されます。カレントディレクトリだけでなく環境変数で設定されたパスの検索結果も表示されているのがわかります。
where *.txt
今度は実行ファイルの拡張子exeで検索してみましょう。かなり多くの実行ファイルが検索され表示されます。
where ~/Desktop/sample/*.exe
検索されたファイルの最終更新日やファイルサイズも表示したい場合は-tオプションを付加します。
where *.txt -t
出力結果を他で利用する場合は-fオプションも指定した方がよいかもしれません。-fオプションを指定するとファイル名(ファイルパス)をダブルクオーテーションで囲んで出力されます。空白を含むファイル名が存在する場合、このオプションは必要でしょう。
where *.txt -t -f
ちなみに検索結果をfindstrコマンドと組み合わせると、より柔軟なファイル名マッチも可能です。
次回はforfilesコマンドについて説明します。
著者 仲村次郎
いろいろな事に手を出してみたものの結局身につかず、とりあえず目的の事ができればいいんじゃないかみたいな感じで生きております。