Sortuj i zmieniaj nazwy obrazów według daty w informacjach EXIF

9

Mam bałagan w folderze zdjęć; Chcę posortować je według daty w informacjach EXIF ​​i zmienić nazwę według daty (np. 001.jpg, 002.jpg i tak dalej).

Jak mogę to zrobić w systemie Linux? Wcześniej korzystałem z ImageMagick do niektórych podstawowych zadań przetwarzania zbiorczego (konwersja i zmiana rozmiaru itp.). Czy można go użyć do tego zadania?

skazhy
źródło

Odpowiedzi:

21

W systemie Linux można użyć polecenia exiftool . Z jakiegoś powodu instrukcja online nie zawiera sekcji „PRZYKŁADY RENAMINGU”, która dała mi niezbędną wskazówkę.

W przypadku plików JPG wystarczy wykonać następujące wywołanie polecenia:

exiftool -r '-FileName<CreateDate' -d '%Y-%m-%d/%H_%M_%S%%-c.%%le' <yourFolder>

Wyjaśnienie:

  • -r jest do rekurencji
  • '-FileName<CreateDate'mówi exiftool, aby zmienił nazwę pliku zgodnie ze znacznikiem EXIF CreateDate(możesz jednak spróbować innych, takich jak ModifyDate)
  • -d '%Y-%m-%d/%H_%M_%S%%-c.%%le'mówi, jak zbudować ciąg nazwy pliku ze źródła daty „ CreateDate” („ %-c” doda licznik w przypadku kolizji plików, „ %le” oznacza „małe rozszerzenie pliku”)
    • Uwaga : użyłem -FileName<...tutaj „ ” do zmiany nazw plików i przeniesienia ich do innego folderu w ramach jednego kroku. Podręcznik wskazuje, że do -Directory<...operacji na folderach należy używać składni „ ”. Tak mi się jednak udało.

Powinieneś poświęcić trochę czasu na przeczytanie instrukcji obsługi tego potężnego narzędzia. Może jest jeszcze krótsza droga: D

użytkownik285690
źródło
1
Przykłady zmiany nazw w dokumentacji: sno.phy.queensu.ca/~phil/exiftool/… .
rwoo
2

Najprostszym sposobem jest po prostu zaimportowanie plików do jbrout ... a następnie (opcjonalnie) wszystkie pliki mogą mieć zmienione nazwy na zorientowane czasowo. Lub może się okazać, że wcale nie potrzebujesz zmieniać nazw (i wystarczy jbrout).

mcepl
źródło
1

Zrobiłem mały i niezbyt zoptymalizowany skrypt Pythona, który moim zdaniem robi to, co zamierzasz:

1 import pyexiv2, sys, os, time, datetime, random
2 dirname = sys.argv[1]
3 flist=os.listdir(dirname)
4 dic = dict()
5 for fname in flist:
6     metadata = pyexiv2.ImageMetadata(sys.argv[1]+'/'+fname)
7     metadata.read()
8     tag = metadata['Exif.Image.DateTime']
9     timestamp = int(time.mktime(tag.value.timetuple()))
10     #print fname, ' ', tag.value, ' ', timestamp
11     try:
12         dic[timestamp] = fname
13     except:
14         print fname, ' not processed.'
15 
16 keys = dic.keys()
17 keys.sort()
18 i = 0 
19 for k in keys:
20     os.rename(sys.argv[1]+'/'+dic[k], sys.argv[1]+'/'+str(i)+'.jpg')
21     i+=1
celebdor
źródło
Musisz zainstalować tę bibliotekę tilloy.net/dev/pyexiv2
celebdor
1

Aby działało w Debian Lenny, spróbuj:

import pyexiv2, sys, os, time, datetime, random
dirname = sys.argv[1]
flist=os.listdir(dirname)
dic = dict()
for fname in flist:
    image = pyexiv2.Image(sys.argv[1]+'/'+fname) 
    #metadata = pyexiv2.ImageMetadata(sys.argv[1]+'/'+fname)
    #metadata.read()
    image.readMetadata() 
    tag = image['Exif.Image.DateTime']
    timestamp = int(time.mktime(tag.timetuple()))
    #print fname, ' ', tag.value, ' ', timestamp
    try:
    dic[timestamp] = fname
    except:
    print fname, ' not processed.'

keys = dic.keys()
keys.sort()
i = 0 
for k in keys:
    os.rename(sys.argv[1]+'/'+dic[k], sys.argv[1]+'/'+str(i)+'.jpg')
    i+=1
Patrik Wallander
źródło
1

W php zrobiłem coś takiego:

<?php

$path = "./path/to/images";
$files = scandir($path);

foreach ( $files as $file )
{
    if ( $file[0] === "." )
    {
        continue;
    }
    $ext = end(explode(".", $file));

    $suffix = "image";

    $exif = exif_read_data($path."/".$file, 'EXIF');
    $datetime = str_replace("/","-", $exif['DateTimeDigitized']);

    rename($path."/".$file, $path."/".$datetime.$suffix.".".$ext);
}
frankmannen
źródło
0

Podczas gdy jesteśmy przy tym, tutaj jest taki, który jest bardziej w stylu „programowania gonzo”, w bash, używając exiftool, można go puścić w kilku katalogach i / lub pojedynczych plikach za jednym razem. Pomija pliki, które mają nierozpoznane typy MIME.

Zmienia nazwę zdjęć przy użyciu DateTimeOriginalznacznika EXIF ​​(więc wynik nie jest, 001.jpgale 2015-12-22_14:43:15.jpg.

Jeśli istnieje konflikt nazewnictwa, numery indeksowe są stosowane: 2015-12-22_14:50:57.1.jpg.

Może być użyteczny: relabel_photo_with_datetimeoriginal.sh

David Tonhofer
źródło