Реорганизовать фотографии из существующей структуры папок в новую структуру
У меня есть каталог фотографий, которые ранее были (ре) организованы в структуру каталогов: год / месяц / день.
Помимо того, что для меня это не удобная группировка, в ней есть ошибки. Например; в моей папке 2007 года есть фотографии с 2010 года.
Я знаю, что есть некоторые программы (например, Shotwell) для организации фотографий, но они борются с большим количеством изображений, которые у меня есть, и, похоже, все они поддерживают существующую файловую структуру.
Я хотел бы вынуть все изображения из их папок и правильно их реорганизовать в соответствии со структурой: год / месяц. Это облегчит мне просмотр и объединит их в альбомы.
Был бы идиотский способ сделать это? Кроме того, ссылка на полезную дискуссию на форуме по этому вопросу может мне очень помочь.
3 ответа
Скрипт для реорганизации фотографий в каталоги / год / месяц
Сценарий ниже делает следующее:
- Определяет месяц, когда была сделана фотография
- Внутри целевого каталога он создает (при необходимости) подкаталоги в год (если были найдены фотографии)
- Внутри этих каталогов года он создает подкаталоги в месяц
- Если скрипт не может найти подходящую дату, он создает папку с именем "undefineded "
Папок в год
Подпапки в месяц
Обработка дубликатов:
Важно позаботиться о дубликатах соответствующим образом: цифровые камеры делают снимки в сериях с одинаковыми именами (например,
IMG_1.jpeg
,IMG_2.jpeg
так далее). Поэтому дубликаты должны быть автоматически переименованы, либо сценарий сломается, либо будет потеряно большое количество фотографий.
Скрипт переименовывает дубликаты как:IMG_1.jpeg, duplicate_1_IMG_1.jpeg, duplicate_2_IMG_1.jpeg etc
Как пользоваться
Скрипт использует
exif
читать метаданные:sudo apt-get install exif
скопируйте приведенный ниже скрипт в пустой файл.
В разделе заголовка скрипта определите каталог, в который вы хотите скопировать фотографии (целевой каталог):
#--- save_to = "/targeted/directory" #---
сохранить скрипт как
reorganize.py
,- При необходимости создайте целевой (улучшенный) каталог
Запустите скрипт с исходным каталогом (папка с вашими фотографиями) в качестве аргумента командой:
python3 /path/to/reorganize.py <source_directory>
Я сделал целевой каталог установленным в скрипте, потому что вы можете добавить другие каталоги (новые изображения) в тот же каталог, организованные автоматически, в то время как исходный каталог будет другим в будущих ситуациях.
Важные заметки
Формат данных может немного отличаться для каждой камеры. В скрипте я учел следующие форматы:
Datum en tijd |2013:08:18 15:58:46
а также
Datum en tijd |2013-08-18 20:21:32
Это может отличаться на других камерах. Если скрипт не работает должным образом, вам нужно опубликовать вывод команды
exif <image>
, но, скорее всего, будет работать как надо.Скрипт в том виде, в котором он есть, копирует фотографии в новый (под) каталог (и), так как вы, вероятно, не хотите связываться с исходным каталогом, пока не проверили, что все прошло хорошо. Если вы хотите переместить файлы, замените строку:
shutil.copyfile(file, newfile)
от:
shutil.move(file, newfile)
Сценарий
#!/usr/bin/env python3
import subprocess
import os
import sys
import shutil
#---
save_to = "/targeted/directory"
#---
directory = sys.argv[1]
if not os.path.exists(save_to):
os.mkdir(save_to)
get = lambda cmd: subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")
def check_dir(dr):
if not os.path.exists(dr):
os.mkdir(dr)
def rename_dups(target_dir, name):
n = 1; name_orig = name
while os.path.exists(target_dir+"/"+name):
name = "duplicate_"+str(n)+"_"+name_orig
n = n+1
return target_dir+"/"+name
for root, dirs, files in os.walk(directory):
for name in files:
file = root+"/"+name
try:
date = [l for l in get("exif "+'"'+file+'"').splitlines()\
if "Dat" in l][0].split("|")[1].split()[0]
if "-" in date:
date = date.split("-")[:2]
elif ":" in date:
date = date.split(":")[:2]
targeted_dir = save_to+"/"+date[0]
check_dir(targeted_dir)
sub_dir = targeted_dir+"/"+date[1]
except:
sub_dir = save_to+"/"+"undetermined"
check_dir(sub_dir)
newfile = rename_dups(sub_dir, name)
shutil.copyfile(file, newfile)
Делаем это с помощью Python Utility
@Andrewning для этой конкретной цели создал инструмент, позволяющий вам позаботиться об этом, а также о любых крайних случаях, с которыми вы столкнулись.
1. Установка
Установка так же проста, как запуск pip install sortphotos
2. Использование
После того, как вы установите его, он существует как команда, вызываемая sortphotos
, Для того, чтобы отсортировать фотографии в соответствии с тем, что вы хотите в вопросе, просто запустите его как
sortphotos -r ./source ./destination --sort %Y/%m-%b
Здесь строка формата, заданная --sort
определяет структуру, в которой фотографии в source
каталог организован в destination
каталог, здесь он сортирует файлы, как показано ниже:
Строка формата может быть указана как используемая в strftime
спецификация с /
(косая черта) разделяющие подкаталоги
3. Дополнительные примечания
Любое столкновение в именах (то есть две фотографии с одним и тем же именем в одном месяце) автоматически добавляется к числу. Если вы хотите просто смоделировать движение файлов, чтобы увидеть, все ли в порядке, просто используйте -t
пометить следующим образом:
sortphotos -tr ./source ./destination --sort %Y/%m-%b
Любые файлы, не имеющие допустимых данных EXIF, хранятся в подпапке с названием Unknown
по умолчанию, но может быть изменено с помощью опции --unknown-dir
http://owl.phy.queensu.ca/~phil/exiftool/
Загрузите пакет.
Найдите "Инструкции по установке" ( http://owl.phy.queensu.ca/~phil/exiftool/install.html).
Непроверенный сценарий bash, используя "exiftool" выше.
$ cat exifto #! / Bin / Баш exiftool -r \ -d $ ГЛАВНАЯ / Изображения / Original_Images /% Y /% m /% d / %% f. %% e \ "-filenameExiftool может сделать гораздо больше, чем это.