LoginSignup
1
0

More than 5 years have passed since last update.

#2 ディレクトリ内の特定のファイルの名前を再帰的に変更する

Posted at

初めてのプログラミング

第二回目です。
今回は業務自動化系です。

今日やったこと

  1. 指定のディレクトリ内のファイル(ディレクトリ含む)をすべて取得する
  2. 1の中に指定した文字列を含むファイル名のものがあるかを調べる
  3. 2があれば、それを特定の文字列に置換する(つまりファイル名を変更する)

コード

index.php
<?php
// 再帰的にファイルを取得(サブディレクトリ内のファイルも取得する)
function getFiles($path) {
    $result = array();

    foreach(glob($path . "/*") as $file) {
        // 取得したファイルのファイル名に"2018-02"があれば"2018-03"に置換
        if(strpos($file, "2018-02") !== false) {
            $newname = str_replace("2018-02", "2018-03", $file);

            rename($file, $newname);
            $file = $newname;
        }
        if(is_dir($file)) {
            $result = array_merge($result, getFiles($file));
        }

        $result[] = basename($file);
    }

    return $result;
}
$path = dirname(__FILE__);
getFiles($path);

説明

このコードを実行するにあたって、今回はこのコードを書いたPHPファイルが設置してあるディレクトリ内を調べてファイル名の置換をおこなっています。
$path = dirname(__FILE__); の部分です。

注意点

rename 関数を使っているので、ディレクトリへの書き込み権限がないと、このコードは使えません。

ダメな点

このコード内に、ディレクトリの権限を変更をする記述はありません。
それゆえに、あらかじめ対象となるファイルのある上流のディレクトリに書き込み権限を与えておかなければいけません。

おまけ

「シェル芸よ!」と教えていただきました。
これを使うことでも、上記のPHPコードと同様の結果を得られます。

$ find . -type f -name '*2018-02*'|awk '$0="mv "$0" "gensub("2018-02","2018-03","g")'|sh

次回やること

再帰関数か単純なループを使ったプログラムを書いてみたいなと思いますが、いかほど。。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0