LoginSignup
3
4

More than 5 years have passed since last update.

iPhoneの写真を、日付ごとに振り分けてMacに保存 - PHP

Posted at

概要

iPhoneで撮りためた写真を、ローカルのMacに保存するにあたり、日付ごとにうまく整理して取り込む方法が見つからなかったので、PHPでスクリプトを書いてみました。

シンプルに画像管理をしたかったので、画像の場所がわかりづらいMacの「写真.app」は使いたくない、という背景があります。また、Picasaがこの機能を持っていたのですが、ある日突然、iPhoneを認識してくれなくなり調べるのも面倒だったので・・・

なお、はじめに「イメージキャプチャ」、「プレビュー」などを使って、日付分けされていない状態で、ごそっとMacにインポートする必要があります。

機能

  • iPhoneからは、予め画像をインポートしておく必要あり
  • 取り込み済み画像を、日付ごとのフォルダに分けてそちらに移動 (mv)
  • 日付はファイル作成日時を元に判断
  • 日付ごとのフォルダは out/フォルダ内に自動生成される
  • out/は自動生成される
  • 拡張子のフォーマットチェックをかける
  • 2回目の実行時など、出力先にファイルが存在したらSkipする

手順

  • 以下の様にスクリプトを配置
├── script/allocator.php

└── pict_data/
  /*ここにiPhoneよりインポートしておく*/
  image01.jpg
  image02.jpg
  image03.jpg
  image04.jpg
  • 実行

$ php script/allocator.php

image01.jpg:Allocated file to 2016-01-19
image02.jpg:Allocated file to 2016-01-30
image03.jpg:Allocated file to 2016-01-31
image04.jpg:Skip /* もしすでにファイルが存在する場合はSkipされる */
└── out/
     └── 2016-01-19/
             └── image01.jpg
     └── 2016-01-30/
             └── image02.jpg
     └── 2016-01-31/
             └── image03.jpg

注意

日付の取得は、lsコマンドを元にawkで無理やり引っ張ってきているので、環境によってはうまく取得できない可能性あり。
また、定義されていない拡張子はSkipされてしまう。

環境

$ php --version
PHP 5.5.9 (cli) (built: Feb 13 2014 01:17:07) 

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.11.1

スクリプト

allocator.php

<?php

/*
 * pict_data/ に写真を配置
 * $ php script/allocator
 * out/が生成され、日付ごとに写真が振り分けられる
 * out/にすでに存在する場合はSkipされる
 * 拡張子チェックNGはSkipされる
 * 拡張子の許可はcheckFileFormat の$extensionsに追記する
 */

define("OUTPUT_DIR", __DIR__ . '/../out/'); 
define("PICT_DATA", __DIR__ . "/../pict_data/");

$output =  shell_exec("ls -lT " . PICT_DATA . " | awk '{print $9\"-\"$6\"-\"$7\",\"$10}'");

$array = preg_split('/\n|\r|\r\n/', $output, -1, PREG_SPLIT_NO_EMPTY);

allocate($array);

function allocate($array)
{
    foreach ($array as $k => $v) {
        try {
            $info = explode(",", $v);
            $date = date("Y-m-d", strtotime($info[0]));      
            $file = $info[1];
            $dir = OUTPUT_DIR . $date;
            $path = OUTPUT_DIR .  $date . "/" . $file;     

            if (!file_exists($dir)) {
                mkdir($dir, 0777, true);
            }

            if (checkDatetimeFormat($date)
                && checkFileFormat($file)
                && !file_exists($path)) {
                # 移動ではなくコピーにしたい場合は mv→cpに
                shell_exec("mv " . PICT_DATA . $file . " " . $path);
                echo $file . ":Allocated file to " . $date . PHP_EOL;
            } else {
                echo $file . ":Skip" . PHP_EOL;
            }
        } catch(\Exception $e) {
            echo $e->getMessage() . PHP_EOL;
        }
    }
}

function checkDatetimeFormat($datetime) {
    \DateTime::createFromFormat("Y-m-d", $datetime);
    $info = \DateTime::getLastErrors();
    return !$info['errors'] && !$info['warnings'];
}

function checkFileFormat($file)
{
    #念のための拡張子チェック 必要に応じて追記
    $extensions = array("JPG", "JPEG", "jpg","jpeg","mov","MOV","png","PNG","gif","GIF");
    $path_parts = pathinfo($file);
    return in_array($path_parts['extension'], $extensions);
}

Gist

3
4
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
3
4