Заметки код


Фотофайлы

Мой телефон даёт фотографиям имена в английском формате даты (сначала месяц):

<месяц><число><год><час><минута><секунда>.jpg

Само собой, куча сделанных снимков после копирования на компьютер (по умолчанию стоит упорядочивание файлов по имени) оказывается отсортированной по месяцу: январь прошлого года, январь текущего года, февраль позапрошлого года, февраль прошлого года, февраль текущего года… Это не очень хорошо, учитывая тот факт, что любому нормальному человеку хочется видеть в фотографий в хронологическом порядке. Да чего любезничать — это очень плохо, ребят.

Конечно, нужно отдать должное разработчикам, что имена фотографиям не присваиваются в формате:

<число><месяц><год><час><минута><секунда>.jpg

Но эта милость программистов, скорее всего, обусловлена тем, что в моём телефоне нет русского языка, в котором дата обычно записывается как раз в формате день.месяц.год. Иначе я бы получил полностью бесполезный список, в котором сначала шли бы фотки за первые числа всех месяцев всех лет, потом за вторые числа всех месяцев всех лет, и так далее.

Чтобы исправить ситуацию, я недавно написал небольшой скрипт, который переименовывает фотографии по следующему шаблону:

<год>-<месяц>-<число>_<час>-<минута>-<секунда>.jpg

Таким образом, при обычной сортировке файлов по имени мы получаем упорядоченные в хронологическом порядке фотографии без скачков дат туда-сюда.

  1. <?
  2. /**
  3.  * Переименование фотографий с телефона, чтобы названия файлов были
  4.  * не в формате
  5.  *     <месяц><число><год><час><минута><секунда>.jpg
  6.  * а в формате
  7.  *     <год>-<месяц>-<число>_<час>-<минута>-<секунда>.jpg
  8.  * Необходимо для того, чтобы при упорядочивании файлов по имени
  9.  * они выстраивались в хронологическом порядке, а не по месяцам.
  10.  *
  11.  * @author MaximAL
  12.  * @date 2012-01-08
  13.  * @time 4:15
  14.  * @copyright MaximAL 2012
  15.  */
  16. // $argv — массив со списком файлов, переданных в команде
  17. foreach ($argv as $filename) {
  18.     // Проверяем, подходит ли имя файла под шаблон (12 цифр)
  19.     if (preg_match('/(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)\.jpg$/i', $filename, $matches)) {
  20.         // Переставляем местами цифры даты, добавляем '20' к году для полноты.
  21.         // Пары цифр со временем (4-я, 5-я, 6-я), не переставляем.
  22.         $newname = sprintf(
  23.             '20%s-%s-%s_%s-%s-%s.jpg',
  24.             $matches[3],
  25.             $matches[1],
  26.             $matches[2],
  27.             $matches[4],
  28.             $matches[5],
  29.             $matches[6]
  30.         );
  31.         // Заменяем последовательность из 12 цифр на новую.
  32.         // Замена делается не простой заменой подстроки,
  33.         // а регулярным выражением и только в конце имени файла (/...$/),
  34.         // чтобы избежать случайного переименования каталога,
  35.         // если он имеет имя вида <12 цифр>.jpg (ну, вдруг);
  36.         // например, 123456789012.jpg
  37.         $newname = preg_replace(
  38.             '/' . preg_quote($matches[0]) . '$/',
  39.             $newname, $filename
  40.         );
  41.         // Выводим имена и переименовываем файл
  42.         echo $filename, ' => ', $newname, PHP_EOL;
  43.         rename($filename, $newname);
  44.     }
  45. }

Как оказалось немалая часть моделей телефонов делает такую гадость, поэтому скрипт может оказаться полезным не только мне. При запуске необходимо передать список файлов для переименования:

$ php tel-photo-ren.php  010109003000.jpg  010110003000.jpg  010111003000.jpg

или:

$ php tel-photo-ren.php  Фотографии/фото-с-телефона/*

В первом случае на выходе получим три фотографии с более-менее понятными именами:

  • 2009-01-01_00-30-00.jpg (1 января 2009, 00:30);
  • 2010-01-01_00-30-00.jpg (1 января 2010, 00:30);
  • 2011-01-01_00-30-00.jpg (1 января 2011, 00:30).

Во втором случае скрипт переименует все фотографии в папке фото-с-телефона.