ずらっと並んだ似た名前のファイル群から、特定の拡張子のファイルだけ見つけたい、特定の番号や名前のファイルだけを見つけたい、あるいはファイル内の文字列にこれが入っているものを見つけたい、といったことがありますよね。
そこで、今回はWindowsバッチ処理で実現する方法を、パターンに分けしてサンプルコード形式でご紹介します。
・特定の拡張子をファイル検索
・複数の拡張子指定でファイル検索
・一部のファイル名からファイル検索
・特定の拡張子かつ一部のファイル名からファイル検索
・ファイル内の文字列からファイル検索
・一部のファイル名からファイル検索して指定フォルダにコピー
それでは順に見ていきましょう!
特定の拡張子をファイル検索
想定しているシーンは次のとおりです。
test.7z
test.bz
test.tar
a.txt
test.txt
enumerate_specify-extension-files.bat
複数の拡張子のファイルが並んでいます。
同じディレクトリ内でenumerate_specify-extension-files.bat
というバッチファイルを実行して、
テキストファイル(.txt)を検索したいと思います。
a.txtとtest.txtが見つかればOKです。
適当なファイルを作って下記をコピペします。
例ではenumerate_specify-extension-files.bat
としました。
@echo off
rem 現在の作業ディレクトリを取得
set "source_folder=%cd%"
rem 検索する拡張子
set "extension=.txt"
rem 指定された拡張子のファイルを検索して絶対パスを取得
for /r "%source_folder%" %%F in (*%extension%) do (
echo %%~fF
)
pause
set "extension=.txt"
部分が対象拡張子を決めています。
実行結果がこちらです。
無事にa.txtとtest.txtを見つけることができました。
複数の拡張子指定でファイル検索
今度は複数の拡張子のファイルを検索したいと思います。
圧縮ファイルを検索してみます。
同様に適当なファイルをバッチファイルにリネームして下記をコピペします。
例ではenumerate_specify-extensions-files.bat
としました。
@echo off
rem 現在の作業ディレクトリを取得
set "source_folder=%cd%"
rem 検索する拡張子のリスト
set "extensions=.7z .zip .rar"
rem 指定された拡張子のファイルを検索して絶対パスを取得
for %%E in (%extensions%) do (
for /r "%source_folder%" %%F in (*%%E) do (
echo %%~fF
)
)
pause
set "extensions=.7z .zip .rar"
で対象とする拡張子を決めています。
今回の例ではtest.7z、test.bz、test.tarが見つかればOKです。
実際に試した結果がこちらです。
無事に見つけることができました。set "extensions=.7z .zip .rar"
を変えることで、
対象の拡張子、数を自由に変えることができます。
用途に合わせて変更してご使用ください。
一部のファイル名からファイル検索
それでは次は、別のファイル検索をしてみましょう。
ファイル名の一部に特定のワードを含んだファイルを検索してみます。
想定するディレクトリ例がこちらです。
enumerate_specify-name-files.bat
file1.txt
file2.txt
file3.txt
・・・
file100.txt
例えば、連番ファイルがある中で、
番号に7を含むものを検索してみたいと思います。enumerate_specify-name-files.bat
を作成して次をコピペして実行します。
@echo off
rem 現在の作業ディレクトリを取得
set "source_folder=%cd%"
rem 検索する拡張子
set "extension=.*"
rem 検索語
set "specify_word=7"
rem 指定された拡張子のファイルを検索してファイル名を取得
for /r "%source_folder%" %%F in (*%extension%) do (
echo %%~nxF | findstr /i %specify_word% > nul
if not errorlevel 1 (
echo %%F
)
)
pause
set “specify_word=7″が検索するキーワードを指定しています。
バッチファイルをダブルクリック実行した結果がこちらです。
無事に「7」を含むファイルをすべて列挙することができました。set "specify_word=7"
部分で検索キーワードを変えることができます。
ちょっと注意がありまして、残念ながらキーワードを日本語にすることはできません。
特定の拡張子かつ一部のファイル名からファイル検索
ここまでを合体して、特定の拡張子かつ、特定キーワードを含むファイルを検索してみたいと思います。
想定するシーンはこんな感じです。
enumerate_specify-name-files.bat
file1.txt
file2.txt
file3.txt
・・・
file100.txt
file7.7z
file7.bz
file7.tar
file7.7z
を見つけたいとします。
先ほどのやり方だと、7を含む別のテキストファイルや圧縮ファイルが引っかかってしまいます。
これを回避しながらfile7.7z
を見つけたいと思います。
実はコードは先ほどとほぼ同じです。
@echo off
rem 現在の作業ディレクトリを取得
set "source_folder=%cd%"
rem 検索する拡張子
set "extension=.7z"
rem 検索語
set "specify_word=7"
rem 指定された拡張子のファイルを検索してファイル名を取得
for /r "%source_folder%" %%F in (*%extension%) do (
echo %%~nxF | findstr /i %specify_word% > nul
if not errorlevel 1 (
echo %%F
)
)
pause
ポイントはset "extension=.7z"
です。
先ほどはset "extension=.*"
としていました。
ワイルドカードにすることですべての拡張子を対象にしていました。
今度は.7zファイルのみを対象にします。
今回の例では、file7.7zを見つけられればOKです。
先ほどと同様に、検索キーワードは「7」としています。set "specify_word=7"
部分で指定しています。
実行してみましょう。
こうなります。
file1.txt~file100.txt、file7.7z、file7.bz、file7.tarと「7」のつくファイルが多数ある中、
「.7z」かつファイル名に「7」を含むファイルだけ検索することができました。
これで、無事に拡張子とファイル名を指定して検索できるようになりました。
ファイル内の文字列からファイル検索
次はファイル内の文字列を見て判定したいと思います。
想定するシーンはこんな感じです。
enumerate_specify-word_in-files.bat
file1.txt
file2.txt
file3.txt
・・・
file10.txt
各ファイルには適当な文字列として、ファイル名を入れています。
file3.txtのみ「test」を追加しておきます。
これを見つけてみます。
file3.txt
test
enumerate_specify-word_in-files.batを作成して、次をコピペします。
@echo off
rem 現在の作業ディレクトリを取得
set "source_folder=%cd%"
rem 検索する拡張子
set "extension=.*"
rem 検索語
set "specify_word=test"
rem 指定された拡張子のファイルを検索してファイル名を取得
for /r "%source_folder%" %%F in (*%extension%) do (
findstr /i /c:"%specify_word%" "%%F" > nul
if not errorlevel 1 (
echo %%F
)
)
pause
ポイントになるのはこの部分です。findstr /i /c:"%specify_word%" "%%F" > nul
findstr関数を使って、set "specify_word=test"
で設定したキーワードを検索しています。
ファイル内にキーワードを含んでいるファイルのみ列挙します。
実行するとこのようになります。
バッチファイルも判定されてしまいましたが、無事に見つけることができました。
対象の拡張子(今回はset "extension=.*"
でワイルドカード)を指定しておけば回避することができます。
一部のファイル名からファイル検索して指定フォルダにコピー
ここまででファイル検索パターンとしては以上となります。
次は応用編として、検索して見つけたファイルに何某かのアクションをさせたいと思います。
大量に並んだファイルの中から、ファイル名に指定キーワードを含むファイルだけ、
別のフォルダにコピーさせてみましょう。
想定するシーンはこのような感じです。
copy_matches.bat
file1.txt
file2.txt
file3.txt
・・・
file1000.txt
この中から、ファイル名に「17」を含むファイルだけ、
「matched」フォルダにコピーしたいと思います。
それでは、copy_matches.batを作成して次をコピペします。
@echo off
rem 現在の作業ディレクトリを取得
set "source_folder=%cd%"
rem 検索する拡張子
set "extension=.txt"
rem 検索語
set "specify_word=17"
rem フォルダの名前
set "folder_name=matched"
rem フォルダを作成
mkdir "%folder_name%"
rem 指定された拡張子のファイルを検索してファイル名を取得
for /r "%source_folder%" %%F in (*%extension%) do (
echo %%~nxF | findstr /i %specify_word% > nul
if not errorlevel 1 (
rem ファイルを作成したフォルダにコピー
copy "%%F" "%folder_name%"
echo Copied: %%F
)
)
pause
ダブルクリック実行するとこのようになります。
コマンドプロンプトが開いて、抽出したファイルをコピーしていきます。
ディレクトリ側を見ると、まず「matched」フォルダができています。
フォルダを開くとこんな感じです。
無事に「17」を含むファイルを抽出してコピーすることができました。
手で実行するにはかなり面倒な作業ですが、自動実行できると手間の節約になります。
今回のサンプルコードの次の部分を変えれば、自由に設定を変えることができます。set "source_folder=%cd%"
set "extension=.txt"
set "specify_word=17"
set "folder_name=matched"
今回はバッチ(bat)で特定の拡張子やファイル名からファイル検索する方法をご紹介しました。
特定の拡張子やファイル名をキーにファイル検索することで、
多数のファイルが並んだ中でも効率的にファイルを見つけることができます。
画像ファイルの検索には、.jpg や .pngをキーにするとよいでしょう。
プログラミングのプロジェクトで使用されるソースコードファイルを検索する場合、
.cpp や .java などの拡張子を指定するのもよいですね。
ファイルの整理と管理、そして半自動化することで、時間と労力を節約できます。
試してみてはいかがでしょうか。
今回は以上となります。
本記事が少しでもお役に立てれば幸いです。
それでは、読んで頂きありがとうございました!