Web事業部_クリエイティブ
Web事業部_クリエイティブ
2018.10.05

【ディレクターもプログラミングを学ぼう #10】任意のディレクトリに格納されているファイル名を一括でリネームする方法

Jack

こんにちは、マネージャーのジャックです。
本日も、プログラミングネタで記事を執筆していこうと思います。

今回は、PHPでディレクトリに格納されているファイル名を取得するスクリプトを書いていきたいと思います。

背景

とある案件で、任意のディレクトリに格納されているたくさんのファイルをリネームする必要があり、
手動ではなく効率よく自動でリネーム実現できないかなぁと思ったのが背景です。

普段ファイルをリネームする際は、 rename コマンドを利用するのですが、
この rename コマンドは複数ファイルを一括してリネームする事ができないという問題点があります。
それなら、ファイル名を一括取得した後に rename コマンドを叩くスクリプトを書いたらラクなのでは?
いや、ラクでしょう!!という事で、スクリプトをサッと書いていきたいと思います。

要件

たとえば、test というディレクトリに複数のテキストファイルが存在する場合で考えてみます。
tree コマンドを利用すると、ディレクトリ構造を視覚的に理解しやすくなります。

% pwd
/home/jack/test
% tree
.
├── sample1.txt
├── sample2.txt
├── sample3.txt
├── sample4.txt
└── sample5.txt

0 directories, 5 files

要件は、test ディレクトリに格納されているファイル名を一括で取得することです。
では、早速スクリプトを書いて行きましょう。

スクリプトを書いてみる

まず、該当ディレクトリ (test) 以下のファイルを全て取得するPHPコードを書いてみたいと思います。

ソースコード

foreach (glob('test/*') as $file) {
  if (is_file($file)) {
    echo htmlspecialchars($file) . "\n";
  }
}

実行結果

実行結果は下記のように出力されます。

% php sample.php
test/sample1.txt
test/sample2.txt
test/sample3.txt
test/sample4.txt
test/sample5.txt

いい感じでファイル名(ファイルパス)を出力する事ができました。

次に取得したファイル名に、接頭辞として日付を付与する処理を追加します。
例えば、test/sample1.txt というファイルを、test/20180608_sample1.txt というファイル名に変換します。

ソースコード

リネーム用のPHPコードは下記となります。

foreach (glob('test/*') as $file) {
  if (is_file($file)) {
    // ファイルパスをディレクトリとパス無しのファイル名に分割
    $result = explode('/', $file);
    $dir = $result[0];
    $filename = $result[1];

    // ファイル名の接頭辞として日付を付与する
    $renameFilename = date(Ymd) . '_' . $filename;

    // リネーム後のファイルパスを構築
    $renameFilepath = 'test/' . $renameFilename;

    // リネーム処理
    rename($file, $renameFilepath);
  }
}

実行結果

実行結果は下記となります。

% php sample.php
% tree
.
├── 20180608_sample1.txt
├── 20180608_sample2.txt
├── 20180608_sample3.txt
├── 20180608_sample4.txt
└── 20180608_sample5.txt

0 directories, 5 files

treeコマンドで確認するとしっかりとリネームされている事が確認できます。
とても便利ですね。

おわりに

今回は、PHPスクリプトで任意のディレクトリに格納されているファイルを一括でリネームするPHPスクリプトを実装しました。
サクッと自動化ツールを開発できるところもPHPの利点ですよね。
さて、次は何を作ろうかな〜〜。 それでは!!