バッチでファイル整理を自動化 — 実務で使える定番パターン10選

  • URLをコピーしました!

日々の業務で増えていくファイルを整理するのって、意外と手間がかかりますよね。特に、同じ作業を繰り返すような場面では、「またこれか…」と感じることも。

そんなときに活躍するのがバッチファイルです。

今回は、拡張子別や日付別にファイルを仕分けたり、一時的に退避させたりといった「定番の整理パターン」を中心に、実務ですぐに使える基本の仕組みをご紹介します。

この記事を読むとわかること

  • 拡張子・日付・キーワードなどによるファイル整理バッチの基本パターン
  • ファイル名の変更や重複・空ファイルの処理といった応用例
  • バッチ作成・実行時につまずきやすいポイントとその対策
目次

バッチでできるファイル整理の基本パターン

ファイル整理においてバッチファイルが役立つのは、「単純だけど繰り返し発生する作業」を自動化できる点にあります。

たとえば、決まったフォルダに毎日ファイルがたまっていく、というような状況では、ルールを決めて整理するだけでも作業効率がぐっと上がります。

実務でも多いのが、「拡張子別に分ける」「日付単位でまとめる」「一時フォルダに退避させる」といったパターンです。その基本形を紹介しつつ、どう応用していけるかの土台を作っていきます。

拡張子で分類する

一番わかりやすい整理方法は、拡張子ごとにフォルダを分けるパターンです。たとえば .pdf.xlsx のように、ファイル形式で用途がある程度わかる場合に向いています。

以下のサンプルは、作業ディレクトリ内のファイルを拡張子別に PDFEXCEL フォルダへ自動で移動するものです。

@echo off
setlocal

set "SOURCE_DIR=C:\Users\yourname\Desktop\work"
cd /d "%SOURCE_DIR%"

:: PDFファイルをPDFフォルダへ
if not exist "PDF" mkdir "PDF"
move *.pdf PDF\

:: ExcelファイルをEXCELフォルダへ
if not exist "EXCEL" mkdir "EXCEL"
move *.xlsx EXCEL\

単純ですが、日常の整理業務ではこれだけでもずいぶん助かります。フォルダ名や拡張子を環境に応じて変更すれば応用も可能です。

日付ごとにフォルダ分けする

日単位でデータをまとめたいときには、ファイルの更新日を使ってフォルダを作る手法が使えます。ログファイルや定期的なレポート出力に便利です。

以下は、当日のフォルダ(YYYYMMDD形式)を作り、その中にファイルを移動する例です。

@echo off
setlocal

set "TODAY=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%"
set "TARGET_DIR=C:\Log\%TODAY%"

if not exist "%TARGET_DIR%" mkdir "%TARGET_DIR%"
move C:\Log\*.log "%TARGET_DIR%"

%DATE%のフォーマットはPCの地域設定によって異なることがあるため、環境によっては調整が必要です。このあたりがちょっとしたつまずきポイントですね。

特定フォルダにまとめて移動する

とりあえずどこかに一時退避させたい、という場面も多いです。手動でやるとミスしやすいのですが、バッチなら一発です。

@echo off
setlocal

set "FROM_DIR=C:\Users\yourname\Desktop\inbox"
set "TO_DIR=D:\整理用\TEMP"

if not exist "%TO_DIR%" mkdir "%TO_DIR%"
move "%FROM_DIR%\*" "%TO_DIR%\"

作業用フォルダやダウンロードフォルダの整理にも使えます。野良ファイルが散らかるのを防ぐには、この「仮置き場」方式が意外と有効です。


そのまま使える!ファイル整理バッチ10選

それではここから、実務でそのまま使えるファイル整理バッチの定番パターンを10個ご紹介します。

1. 拡張子ごとにファイルを自動で仕分ける

これは先ほど紹介した基本中の基本パターンですが、複数の拡張子に対応したバージョンを用意しておくとさらに便利です。

@echo off
setlocal

set "WORK_DIR=C:\Files"
cd /d "%WORK_DIR%"

for %%X in (pdf xlsx docx jpg png) do (
    if not exist "%%X" mkdir "%%X"
    move *.%%X %%X\
)

使い方は簡単。WORK_DIRを自分の整理したいディレクトリに変えるだけで、さまざまな拡張子に対応できます。

2. 日付別フォルダにファイルを振り分ける

以下のバッチは、ファイルの更新日を yyyyMMdd の形式で取得し、それに対応したフォルダへ移動するサンプルです。

@echo off
setlocal enabledelayedexpansion

set "SOURCE=C:\Daily"
cd /d "%SOURCE%"

for %%F in (*.*) do (
    rem WMIC で更新日(yyyyMMddHHmmss...)を取得
    for /f "tokens=1 delims=." %%D in ('wmic datafile where "name='%%~fF'" get lastmodified ^| findstr /r "[0-9]"') do (
        set "DATE=%%D"
        set "FOLDER=!DATE:~0,4!!DATE:~4,2!!DATE:~6,2!"
        if not exist "!FOLDER!" mkdir "!FOLDER!"
        move "%%F" "!FOLDER!\"
    )
)

日付の取得には wmic コマンドを使用しているため、ロケールの違いに左右されず、安定して yyyyMMdd 形式のフォルダが作成されます。実行時にはファイル数が多くても自動で振り分けられるので、作業フォルダがすっきりと整います。

3. 特定キーワードを含むファイルだけを移動

ファイル名に「請求書」や「レポート」など、決まった文字列が含まれているものだけを抽出して移動できます。

@echo off
setlocal

set "KEYWORD=請求書"
set "SOURCE=C:\inbox"
set "DEST=C:\archive"

cd /d "%SOURCE%"
for %%F in (*%KEYWORD%*) do (
    move "%%F" "%DEST%\"
)

一括で探して一括で動かせるので、フィルタのような使い方ができます。

4. ファイル名の先頭に作成日を付与する

報告書や画像ファイルなど、作成日がファイル名に入っていないと困る場面に使える手法です。

@echo off
setlocal enabledelayedexpansion

set "DIR=C:\Reports"
cd /d "%DIR%"

for %%F in (*.*) do (
    for /f "tokens=1-3 delims=/" %%a in ("%%~tF") do (
        set "DATE=%%a%%b%%c"
        ren "%%F" "!DATE!_%%F"
    )
)

ファイル名の前に日付が並ぶことで、エクスプローラー上でも並び替えやすくなります。

5. 重複ファイルを検出して別フォルダに移動

「同じ名前のファイルがすでにある」場合に別の場所に避難させる方法です。

@echo off
setlocal

set "DIR=C:\Files"
set "DUP_DIR=C:\Duplicates"
cd /d "%DIR%"

if not exist "%DUP_DIR%" mkdir "%DUP_DIR%"

for %%F in (*.*) do (
    if exist "%DUP_DIR%\%%F" (
        echo Duplicate found: %%F
        move "%%F" "%DUP_DIR%\"
    )
)

完全な重複検出(ハッシュ比較)ではないですが、実務ではこの程度でも十分な場面が多いです。

6. ファイルサイズがゼロのファイルを削除

空のログやエクスポートミスでできた空ファイルを自動で削除できます。

@echo off
setlocal

cd /d "C:\Temp"
for %%F in (*.*) do (
    if %%~zF EQU 0 del "%%F"
)

見た目では気づきにくい空ファイルを一掃できるので、定期的に回しておくとスッキリします。

7. 指定日数より古いファイルを削除する

forfiles コマンドを使うことで、数日前までのファイルだけを残すことができます。

forfiles /p "C:\Logs" /s /m *.* /d -30 /c "cmd /c del @file"

-30 の部分を変えれば日数を調整できます。バックアップ整理などに便利です。

8. 一括でファイル名に接頭辞を付ける

特定の処理名やカテゴリ名など、任意の文字列をファイル名の頭に付けられます。

@echo off
setlocal

set "PREFIX=処理済み_"
cd /d "C:\Done"

for %%F in (*.*) do (
    ren "%%F" "%PREFIX%%%F"
)

実際の処理結果が一目でわかるようになるので、運用上のミス防止にもつながります。

9. 拡張子を一括で変更する

たとえば .txt.csv に変更したい場合など、手動では大変な作業をバッチで処理できます。

@echo off
cd /d "C:\Data"
ren *.txt *.csv

環境によっては拡張子の関連付けが変わるので注意も必要です。

10. 空フォルダだけを削除する

中身のないフォルダを削除するだけでも、階層がずいぶんスッキリします。

@echo off
set "DIR=C:\Projects"
cd /d "%DIR%"

for /d %%D in (*) do (
    dir "%%D" /b >nul 2>&1 || rd "%%D"
)

「とりあえず作ったけど中身がない」というフォルダは案外多い場合、整理の締めにおすすめです。


編集・実行時の注意点とつまずきやすい罠

フォルダパスにスペースがあるときの対処法

Windowsのフォルダ名にはスペースが含まれることが多く、これが原因でうまく動かないケースがあります。パスは常に "(ダブルクオート)" で囲うようにしましょう。

move "C:\My Documents\file.txt" "D:\Backup\"

とくに cdmove コマンドでは、囲みを忘れると「ファイルが見つかりません」となりがちです。

管理者権限での実行が必要な場合

一部の操作、たとえば C:\Program Files 配下への移動や削除は、管理者権限が必要になる場合があります。バッチファイルを右クリックして「管理者として実行」を選ぶか、UACの設定も考慮する必要があります。

エラーが出たときに最初に見るポイント

想定通りに動かないときは、次の3つをまず確認すると原因を絞りやすいです。

  1. パスが正しく指定されているか(絶対パス/相対パス)
  2. 括弧やクオートの閉じ忘れがないか
  3. 対象のファイルやフォルダが実際に存在するか

また @echo on にして実行すると、どこで止まったかが見えるので、デバッグの助けになります。意外とそれだけで「あ、タイポしてた」と気づけたりします。


まとめ

本記事では、バッチファイルで行うファイル整理の基本から応用までを幅広く紹介しました。

定番の仕分け方法やトラブル対策を知っておくだけでも、日々の整理作業がぐっと楽になります。私自身、最初はシンプルなスクリプトから始めましたが、それだけでも作業のミスや手間が大幅に減りました。まだバッチを使ったことがない方も、一度試してみるとその便利さに驚くはずです。

運用環境に応じてさらなる工夫の余地もあるので、自分なりの改善も楽しんでみてください。

この記事を書いた人

業務システムとWebアプリの開発に20年以上携わるフリーランスエンジニア。
製造業や物流業界のシステム保守・改修を中心に、要件定義から運用改善まで幅広く対応してきました。Laravelや業務改善、AI活用など、現場で実際に試し・使い続けている技術や設計の工夫を、トラブル対応の視点も交えてブログに記録しています。

日々の業務で直面した「困ったこと」をベースに、再現性のあるノウハウをシンプルな言葉で伝えることを意識しています。

目次