Sortir dan ganti nama gambar berdasarkan tanggal di info EXIF

9

Saya memiliki kekacauan di folder foto saya; Saya ingin mengurutkannya berdasarkan tanggal pada informasi EXIF ​​dan mengganti nama berdasarkan tanggal (seperti 001.jpg, 002.jpg, dan seterusnya).

Bagaimana saya bisa melakukan ini di Linux? Saya telah menggunakan ImageMagick untuk beberapa tugas pemrosesan massal dasar sebelumnya (mengkonversi dan mengubah ukuran, dll), apakah mungkin untuk menggunakannya untuk tugas ini?

skazhy
sumber

Jawaban:

21

Di Linux Anda dapat menggunakan perintah exiftool . Untuk beberapa alasan manual online tidak mengandung bagian "CONTOH RENAMING" yang memberi saya petunjuk penting.

Untuk file JPG saja, pemanggilan perintah berikut harus melakukan pekerjaan:

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

Penjelasan:

  • -r adalah untuk rekursi
  • '-FileName<CreateDate'memberitahu exiftool untuk mengganti nama file sesuai dengan tag EXIF-nya CreateDate(Anda dapat mencoba yang lain seperti itu ModifyDate)
  • -d '%Y-%m-%d/%H_%M_%S%%-c.%%le'memberitahu cara membuat string nama file dari sumber tanggal " CreateDate" (" %-c" akan menambahkan penghitung jika terjadi tabrakan file, " %le" singkatan dari "ekstensi file cased lebih rendah")
    • Catatan : Saya menggunakan " -FileName<..." di sini untuk mengubah nama file dan memindahkannya ke folder lain dalam satu langkah. Manual menunjukkan bahwa Anda harus menggunakan -Directory<...sintaks " " untuk operasi folder. Ini bekerja untuk saya dengan cara ini.

Anda harus meluangkan waktu membaca manual alat yang ampuh ini. Mungkin ada cara yang lebih pendek: D

pengguna285690
sumber
1
Mengganti nama contoh dalam dokumentasi: sno.phy.queensu.ca/~phil/exiftool/… .
rwoo
2

Cara paling sederhana adalah dengan hanya mengimpor file ke jbrout ... lalu (opsional) semua file dapat diubah namanya menjadi sesuatu yang berorientasi waktu. Atau Anda mungkin menemukan, bahwa Anda tidak perlu mengubah nama sama sekali (dan jbrout sudah cukup).

mcepl
sumber
1

Saya melakukan skrip python kecil dan tidak terlalu dioptimalkan yang menurut saya melakukan apa yang Anda inginkan:

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
sumber
Anda harus menginstal perpustakaan ini tilloy.net/dev/pyexiv2
celebdor
1

Untuk membuatnya bekerja di Debian Lenny coba ini:

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
sumber
1

Di php saya melakukan sesuatu seperti ini:

<?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
sumber
0

Sementara kita berada di sini, ini adalah salah satu yang lebih gaya "pemrograman gonzo", dalam bash, menggunakan exiftool, dapat dilepaskan pada beberapa direktori dan / atau file individual dalam satu waktu. Ini melompati file yang memiliki tipe mime yang tidak dikenal.

Itu mengubah nama foto menggunakan DateTimeOriginaltag EXIF ​​(jadi hasilnya tidak 001.jpgtapi 2015-12-22_14:43:15.jpg.

Jika ada konflik penamaan, angka indeks diterapkan: 2015-12-22_14:50:57.1.jpg.

Semoga bermanfaat: relabel_photo_with_datetimeoriginal.sh

David Tonhofer
sumber