バックエンド

PHPでファイルを年月別ディレクトリに整理する方法

データを扱う上で、ファイルの整理は重要な作業です。特に、日付や名前で管理されるファイルが大量にある場合、ファイルを年月ごとにディレクトリ分けすると効率的です。本記事では、PHPを使用してファイルを年月別ディレクトリに分類・移動する方法を詳しく解説します。

なぜ年月別ディレクトリに整理するのか?

年月別にファイルを整理するメリットは次の通りです。

  1. 視認性向上:特定の期間に関連するファイルを簡単に見つけられます。
  2. 管理が容易:大量のファイルを一つのフォルダで管理するより、整理された状態を保つことができます。
  3. パフォーマンス向上:特にファイル数が多い場合、ディレクトリの操作速度が向上します。
  4. バックアップやアーカイブが簡単:年月単位でバックアップを取る場合にも便利です。

本記事で扱うシナリオ

例えば、以下のようなファイルがあるとします。

  • data_20241202.json
  • data_20241203.json

これらのファイルを、2024-12というフォルダに移動し整理します。最終的には次のようなディレクトリ構造を目指します。

/sorted/
    /2024-12/
        data_20241202.json
        data_20241203.json

それでは、具体的なPHPコードを解説していきます。

実装の準備

開発環境

以下の環境を前提とします。

  • PHP 7.4以上(PHP 8.xでも動作可能)
  • ローカルサーバ(XAMPP, Laragonなど)
  • 対象ファイルがスクリプトと同じディレクトリに存在

必要な関数

今回の処理で使用する主なPHP関数は以下の通りです。

  • scandir():ディレクトリ内のファイル一覧を取得します。
  • preg_match():ファイル名から年月を抽出します。
  • mkdir():新しいディレクトリを作成します。
  • rename():ファイルを移動します。

コード例

以下に、ファイルを年月別に整理するための完全なコードを示します。

<?php
// ベースとなるディレクトリパス(ファイルが存在するディレクトリ)
$sourceDir = __DIR__; // カレントディレクトリを指定
$targetDir = $sourceDir . '/sorted'; // 移動先のベースディレクトリ

// ディレクトリが存在しない場合、作成
if (!is_dir($targetDir)) {
    mkdir($targetDir, 0777, true);
}

// ファイル名のパターン(正規表現)
$filePattern = '/^data_(\d{4})(\d{2})\d{2}\.json$/';

// ディレクトリ内のファイルを取得
$files = scandir($sourceDir);

foreach ($files as $file) {
    // ファイルが正規表現に一致するか確認
    if (preg_match($filePattern, $file, $matches)) {
        $year = $matches[1]; // 年
        $month = $matches[2]; // 月

        // 移動先のディレクトリパス
        $yearMonthDir = $targetDir . '/' . $year . '-' . $month;

        // 移動先ディレクトリが存在しない場合、作成
        if (!is_dir($yearMonthDir)) {
            mkdir($yearMonthDir, 0777, true);
        }

        // ファイルを移動
        $sourcePath = $sourceDir . '/' . $file;
        $destinationPath = $yearMonthDir . '/' . $file;

        if (rename($sourcePath, $destinationPath)) {
            echo "Moved: $file to $yearMonthDir\n";
        } else {
            echo "Failed to move: $file\n";
        }
    }
}

コードの説明

1. ディレクトリパスの設定

$sourceDir = __DIR__;
$targetDir = $sourceDir . '/sorted';

$sourceDir は、処理対象のファイルが格納されているディレクトリを指定します。__DIR__ は現在のスクリプトが存在するディレクトリを指します。

$targetDir は移動先ディレクトリのベースパスです。この例では sorted フォルダを移動先としています。

2. ファイル名のパターンマッチ

$filePattern = '/^data_(\d{4})(\d{2})\d{2}\.json$/';

この正規表現は、ファイル名が data_YYYYMMDD.json の形式に一致するかどうかを確認します。

  • \d{4} は4桁の数字(年)を表します。
  • \d{2} は2桁の数字(月)を表します。
  • 最後の \d{2} は日付を無視するための部分です。

3. ディレクトリの作成とファイル移動

if (!is_dir($yearMonthDir)) {
    mkdir($yearMonthDir, 0777, true);
}

if (rename($sourcePath, $destinationPath)) {
    echo "Moved: $file to $yearMonthDir\n";
} else {
    echo "Failed to move: $file\n";
}

mkdir() 関数で、移動先のディレクトリを作成します。すでに存在する場合はスキップされます。

その後、rename() 関数を使用してファイルを指定したディレクトリに移動します。

実行方法

  1. 上記のコードを move_files.php として保存します。
  2. 処理対象のファイルをスクリプトと同じディレクトリに配置します。
  3. ターミナルまたはコマンドプロンプトで以下を実行します。
php move_files.php
  1. 正常に処理されると、次のようなメッセージが表示されます。
Moved: data_20241202.json to /sorted/2024-12
Moved: data_20241203.json to /sorted/2024-12

注意点

  • ファイルの命名規則:対象ファイルが正規表現に一致する必要があります。他の形式のファイルは処理されません。
  • エラーハンドリング:ファイル移動が失敗する場合の対策として、ログ出力や例外処理を追加することをおすすめします。

応用例

このコードを応用することで、次のようなシナリオにも対応できます。

  • ファイル形式を .json 以外にも対応(例: .txt, .csv)。
  • 年単位や日単位でのディレクトリ分類。
  • データベースへのログ保存や処理後のファイル削除。

まとめ

本記事では、PHPを使ってファイルを年月別ディレクトリに整理する方法を紹介しました。このような自動化スクリプトを使用することで、日常業務やデータ管理の効率を大幅に向上させることができます。ぜひ、自分のプロジェクトに応じてカスタマイズしてみてください!

-バックエンド
-