概要
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);
}