Катологизация фотографий по категориям

Опубликовано: Комментариев: 0
Катологизация фотографий по категориям

Хоть сама проблема и не относится непосредственно к теме веб-разработки, но я хотел бы поделиться с читателями моим взглядом на то, как можно отсортировать множество фотографий товаров (изделий) по папкам в зависимости от вида категории, к которой относится тот или иной товар средствами SQL, PHP и Linux'а. Задача: есть множество фотосессий с товарами и мне нужно каждый товар поместить в определенную папку в зависимости от категории. В одной папке с фотосессии товар, естественно, может быть сфотографирован более 1 раза и в различных фотосессиях могут встречаться одинаковые товары, а один и тот же товар может относиться к двум и более категориям. И да, в папке с фотосессией есть и лишние фотографии, которые никуда перемещать не нужно. В моем случае было 3663 файла в 27 папках. Я решил попробовать автоматизировать поставленную задачу, чтобы при появлении новых фотосессий уже не тратить так много времени на этот процесс. Задумка такова, что все фотографии нужно перенести в одну папку, фотографии должны быть сгруппированы по уникальному номеру артикула и затем скриптом распределить их по папкам.

Подготовка к катологизации фотографий

1. Самое важное - база данных SQL, где имеется таблица со списком артикулов товаров, таблица со связками значений "код_товара - код_категории" и таблица с названиями и кодами категорий. Подразумеваю, что у вас это есть. Без этой информации мы не сможем сделать SQL запросы и вывести интересующую информацию. 2. Первым делом я начал переименовывать все фотографии в одном стиле: код-номер. К примеру 5421-1.jpg, 5421-2.jpg, 5421-3.jpg и т.д. Это легко сделать как в Linux, так и в Windows. В Linux Mint выделяю нужный артикул, жму F2 и выбираю "Текст-номер". В Windows можно аналогично нажать F2, предварительно выбрав нужные файлы, и вписать нужный артикул, файлы будут иметь вид 5421 (1), 5421 (2) и т.д. Или в Total Commander нажать CTRL+M и вписать в маске переименования артикул-[C] и получим 5421-1.jpg, 5421-2.jpg. Хорошо, что я каждую новую фотосессию старался сразу же пронумеровать для удобства загрузки фотографий. Но тем не менее, работы было предостаточно. После того как папка с фотосетом пронумерована - я сбрасывал все файлы в новую папку через Total Commander, а при совпадении имен использовал auto-rename copied, дописывая к примеру 5421-1 (2).jpg и тем самым не нарушая общую структуру имён: [caption id="" align="aligncenter" width="570"]Каталогизация фотографий Каталогизация фотографий[/caption] 3. Когда все файлы были переименованы в едином стиле и собраны в одной общей папке я их обработал в LightRoom. Во-первых, чтобы сжать до 1мб (это требовалось по задаче). Во-вторых, на выходе все файлы имели одинаковое расширение *.jpg (в оригинале встречались как jpg так и jpeg), что мне нужно было для решения других задач. 4. Создание нужных каталогов, куда перемещать файлы. Для этого средствами PHP отправил запрос в БД и получил из соответствующей таблицы названия всех категорий (в реальном примере их было около 30), сохранил в массив и вывел в цикле готовую команду к созданию папок для Linux: // код PHP $attribute = ['Красный','Синий','Зеленый','Черный']; for ($i=0; $i < count($attribute) ; $i++) { echo 'mkdir '.$attribute[$i].' '; } И получил на страничке готовый список команд для создания соответствующих директорий mkdir Красный mkdir Синий mkdir Зеленый mkdir Черный Сохранил команды в файл 1_makedirs.sh. Создание запросов к базе данных я опустил, тут ничего сложного нет. Если нужны примеры запросов - пишите в коменты, сделаю demo-версию базы данных со всеми запросами к ней и с php кодом для наглядности, сейчас нет времени на этом заморачиваться. 5. Создание команды для перемещения фотографий сделал аналогичным способом. Получил в запросе из БД связку - id_товара - категория: //код PHP if ($prev_num == $event['item_number']) { $tmpValue=2; echo 'cp '.$event['item_number'].'-* sort-2/ ';} else {$tmpValue=1;} echo 'итерация_'.$tmpValue.' mv '.$event['item_number'].'-* '.$event['fur_name'].'/ '; $prev_num = $event['item_number']; Как я писал выше, некоторые изделия могут быть в двух категориях одновременно. Поэтому для тех изделий, которые сразу в двух категориях - я дописал итерация_2 и команду "скопировать в папку sort-2". Вот что-то в таком духе получилось: итерация_1 mv 9090-* Красный/ итерация_1 mv 5070-* Синий/ cp 5070-* sort-2/ итерация_2 mv 5070-* Зеленый/ Команда mv 5070-* Зеленый означает, что найдя любой файл, где первые 4 символа соответствуют указанному значению, а пятым символом обязательно будет -, то она переместит такие фотки в папку "Зеленый". Знак "-" тут служит неким разграничителем того где заканчивается артикул и начинается информация о порядковом номере товара. Разбил через фильтрацию на 3 отдельных файла и удалил потом маркеры "итерация_1" и "итерация_2": 2_copy.sh - скопировать тех, которые 2й раз будем сортировать. 3_move.sh - тут все итерации №1. 4_move.sh - тут итерации №2. При написании этой статьи пришла в голову другая мысль. Чтобы не париться с сортировкой на итерация_1, итерация_2 вывести результат из PHP в такой последовательности: при условии, если изделие повторяется вывести команду скопировать в папку_1, затем выполнить команду переместить в папку_2. Если будет интересно - скажите, сброшу исправленный вариант. И можно было бы обойтись одним файлом вместо трех вышеописанных

Выполняем катологизацию.

Открываем в терминале директорию, где все фотки. Запускаем создание директорий $ 1_makedirs.sh Папки созданы! Запускаем копирование в папку sort-2 $ 2_copy.sh Теперь делаем первое перемещение $ 3_move.sh Все файлы были перемещены по подпапкам. Теперь заходим в sort-2 и перемещаем из нее все файлы на уровень выше, чтобы снова применить сортировку $ 4_move.sh Ну вот и все! Файлы идеально отсортированы по своим папкам, заказчик доволен! Таким же способом я себе и по коду артикула товары отфильтровал на жестком диске.