Реорганизовать фотографии из существующей структуры папок в новую структуру

У меня есть каталог фотографий, которые ранее были (ре) организованы в структуру каталогов: год / месяц / день.

Помимо того, что для меня это не удобная группировка, в ней есть ошибки. Например; в моей папке 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
    

Как пользоваться

  1. Скрипт использует exif читать метаданные:

    sudo apt-get install exif
    
  2. скопируйте приведенный ниже скрипт в пустой файл.

  3. В разделе заголовка скрипта определите каталог, в который вы хотите скопировать фотографии (целевой каталог):

    #---
    save_to = "/targeted/directory"
    #---
    
  4. сохранить скрипт как reorganize.py,

  5. При необходимости создайте целевой (улучшенный) каталог
  6. Запустите скрипт с исходным каталогом (папка с вашими фотографиями) в качестве аргумента командой:

    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 \
 "-filename 

Exiftool может сделать гораздо больше, чем это.

Другие вопросы по тегам