จัดเรียงและเปลี่ยนชื่อภาพตามวันที่ในข้อมูล EXIF


9

ฉันมีระเบียบในโฟลเดอร์รูปภาพของฉัน ฉันต้องการจัดเรียงตามวันที่ในข้อมูล EXIF ​​และเปลี่ยนชื่อตามวันที่ (เช่น 001.jpg, 002.jpg และอื่น ๆ )

ฉันจะทำสิ่งนี้ใน Linux ได้อย่างไร ฉันใช้ ImageMagick สำหรับงานการประมวลผลจำนวนมากพื้นฐานก่อน (การแปลงและการปรับขนาด ฯลฯ ) เป็นไปได้ไหมที่จะใช้มันสำหรับงานนี้?

คำตอบ:


21

บน Linux คุณสามารถใช้คำสั่งexiftool ด้วยเหตุผลบางอย่างคู่มือออนไลน์ไม่มีส่วน "RAMAMING EXAMPLES" ซึ่งให้คำแนะนำที่จำเป็นแก่ฉัน

สำหรับไฟล์ JPG เท่านั้นการเรียกใช้คำสั่งต่อไปนี้ควรทำงาน:

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

คำอธิบาย:

  • -r สำหรับการเรียกซ้ำ
  • '-FileName<CreateDate'แจ้งให้ exiftool เปลี่ยนชื่อไฟล์ตามแท็ก EXIF CreateDate(คุณสามารถลองใช้งานแบบอื่น ๆ ได้ModifyDate)
  • -d '%Y-%m-%d/%H_%M_%S%%-c.%%le'บอกวิธีสร้างสตริงชื่อไฟล์จากแหล่งวันที่ " CreateDate" (" %-c" จะต่อท้ายตัวนับในกรณีที่ไฟล์ชนกัน " %le" ย่อมาจาก "นามสกุลไฟล์ที่ต่ำกว่า")
    • หมายเหตุ : ฉันใช้ " -FileName<..." ที่นี่เพื่อเปลี่ยนชื่อไฟล์และย้ายไปยังโฟลเดอร์อื่นภายในขั้นตอนเดียว คู่มือชี้ให้เห็นว่าคุณต้องใช้-Directory<...ไวยากรณ์ "" สำหรับการทำงานของโฟลเดอร์ มันใช้งานได้สำหรับฉันด้วยวิธีนี้

คุณควรใช้เวลาอ่านคู่มือของเครื่องมืออันทรงพลังนี้ อาจมีวิธีที่สั้นกว่านี้: D


1
เปลี่ยนชื่อตัวอย่างในเอกสาร: sno.phy.queensu.ca/~phil/exiftool/...
rwoo


2

วิธีที่ง่ายที่สุดคือเพียงนำเข้าไฟล์เข้าสู่ jbrout ... จากนั้น (เป็นทางเลือก) ไฟล์ทั้งหมดสามารถเปลี่ยนชื่อเป็นบางเวลาได้ หรือคุณอาจพบว่าคุณไม่จำเป็นต้องเปลี่ยนชื่อเลย (และ jbrout ก็เพียงพอแล้ว)


1

ฉันทำสคริปต์หลามขนาดเล็กและไม่ได้รับการปรับให้เหมาะสมอย่างที่ฉันคิดว่าจะทำตามที่คุณต้องการ:

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

คุณต้องติดตั้งไลบรารีนี้tilloy.net/dev/pyexiv2
celebdor

1

เพื่อให้มันทำงานใน Debian Lenny ได้ลองทำสิ่งนี้:

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

1

ใน php ฉันทำอะไรเช่นนี้

<?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);
}

0

ในขณะที่เราอยู่ที่นี่นี่เป็นอีกรูปแบบหนึ่งซึ่งเป็นรูปแบบ "การเขียนโปรแกรม gonzo" ในการbashใช้exiftoolงานมันสามารถปล่อยให้หลวมในหลาย ๆ ไดเรกทอรีและ / หรือแต่ละไฟล์ในครั้งเดียว ข้ามไฟล์ที่มีชนิด mime ที่ไม่รู้จัก

มันเปลี่ยนชื่อภาพถ่ายโดยใช้DateTimeOriginalแท็ก EXIF (เพื่อผลที่ไม่ได้เป็นแต่001.jpg2015-12-22_14:43:15.jpg

2015-12-22_14:50:57.1.jpgหากมีความขัดแย้งการตั้งชื่อหมายเลขดัชนีจะนำไปใช้:

อาจมีประโยชน์: relabel_photo_with_datetimeoriginal.sh

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.