เปลี่ยนชื่อภาพเป็นเวลา exif: สร้างชื่อไฟล์ที่ไม่ซ้ำกัน


11

หากฉันเปลี่ยนชื่อภาพผ่าน exiv เป็นเวลาวันที่ exif ฉันจะทำสิ่งต่อไปนี้:

find . -iname \*jpg -exec exiv2 -v -t -r '%Y_%m_%d__%H_%M_%S' rename {} \;

ขณะนี้อาจเกิดขึ้นได้ว่ารูปภาพมีเวลาประทับที่แน่นอน (รวมถึงวินาที) ฉันจะทำให้ชื่อไฟล์เป็นแบบอัตโนมัติได้อย่างไร

คำสั่งควรมีเสถียรภาพในแง่ที่ว่าถ้าฉันดำเนินการในโครงสร้างไดเรกทอรีเดียวกันอีกครั้ง (อาจหลังจากเพิ่มรูปภาพใหม่) รูปภาพที่เปลี่ยนชื่อแล้วไม่ควรเปลี่ยนและถ้ารูปภาพที่มีชื่อไฟล์ที่มีอยู่แล้วถูกเพิ่มชื่อไฟล์ใหม่ควรไม่ซ้ำกัน เช่นกัน

ความพยายามครั้งแรกของฉันคือเพียงแค่ปล่อยให้ชื่อเดิมในชื่อไฟล์ที่ได้มา แต่จากนั้นคำสั่งจะไม่มั่นคงในความหมายข้างต้น


1
แตกเวลาประทับสร้างชื่อไฟล์ตรวจสอบชื่อไฟล์ที่มีอยู่แก้ไข (เพิ่มคำต่อท้ายหรือคล้ายกัน) หากมีอยู่จากนั้นmvไฟล์
Kusalananda

มีวิธีที่ตรงกว่านี้ด้วยการเพิ่มตัวเลือกในคำสั่ง exiv2 หรือไม่?
นักเรียน

ดังนั้นคำตอบโดยใช้ exiftool exiftool '-filename<createdate' -d %Y_%m_%d__%H_%M_%S%%-c.%%le "-filemodifydate<createdate#" -r -progress .จะเป็นสิ่งที่ชอบ บางทีคุณสามารถเปลี่ยนความคิดเห็นเป็นคำตอบได้
นักเรียน

คำตอบ:


17

คุณอาจต้องการที่จะลองjheadแทนซึ่งไม่ว่าออกจากกล่อง (มีa, b... zต่อท้ายทำให้ได้ถึง 27 ไฟล์ที่มีวันเดียวกัน) และไม่ได้มีปัญหาความมั่นคงกล่าวถึงโดย @meuh:

find . -iname '*jpg' -exec jhead -n%Y_%m_%d__%H_%M_%S {} +

หรือใช้exiftool(ตัวอย่างในหน้าคน):

exiftool -ext jpg '-FileName<CreateDate' -d %Y_%m_%d__%H_%M_%S%%-c.%%e .

(นี่%-cคือการต่อท้ายตัวเลขเริ่มต้นด้วย-)


3

เวอร์ชันของฉันexiv2(0.25 001900) จะถามว่าจะทำอย่างไรเมื่อชื่อไฟล์มีอยู่แล้ว

exiv2: File `./2013_06_19__14_03_13.jpg' exists. [O]verwrite, [r]ename or [s]kip? 

โดยการเพิ่มตัวเลือก-Fมันจะเพิ่มพิเศษ_1(หรือ_2อื่น ๆ ) ลงในชื่อแทนโดยอัตโนมัติ

Renaming file to ./2013_06_19__14_01_53_1.jpg, updating timestamp

หากคำสั่งรันครั้งที่สองจะมีข้อความแจ้งว่า:

This file already has the correct name

และไม่ทำอะไรเลย แต่มันได้รับสับสนหากมีเป็นส่วนหนึ่งและจะเปลี่ยนชื่อ_1 _2มันจะสลับเป็นแบบนี้โดยไม่ทำลายในการวิ่งแต่ละครั้ง คุณสามารถละเว้นสิ่งนี้ได้หากคุณต้องการหรือเปลี่ยนfindรูปแบบของคุณเพื่อเพิกเฉยต่อไฟล์ที่ตรงกับรูปแบบวันที่ด้วยชิ้น_ส่วน

ตัวอย่างเช่นรูปแบบการ regex [0-9]{4}_[0-9]{2}_...สำหรับรูปแบบวันที่เริ่มต้น เพื่อลดความซับซ้อนผมก็จะมองหาผสม 20 ตัวอักษรจากชุด0..9และ_ซึ่งเป็น [0-9_]{20}regex นี้ต่อท้ายของ_ตามมาด้วยอย่างน้อย 1 _[0-9]{1,}.jpgบาทจะมองหาเป็น ตั้งแต่ regex มีเพื่อให้ตรงกับเส้นทางทั้งหมดและไม่เพียง basename ที่ regex .*/[0-9_]{20}_[0-9]{1,}.jpgสุดท้ายรวมทั้งไดเรกทอรี

ดังนั้นคุณสามารถใช้การค้นหาเช่น:

find . -regextype posix-extended ! -iregex '.*/[0-9_]{20}_[0-9]{1,}.jpg' -iname '*.jpg' ...

1

Exiv2 สามารถจัดการได้ด้วยตัวเอง ฉันใช้เวลามากมายในการค้นหาความช่วยเหลือจนกระทั่งฉันไปดูคู่มือ exiv2 ตัวเลือก -F แก้ปัญหานี้

exiv2 -r'%Y_%m_%d__%H_%M_%S' -F *.jpg

มันจะผนวก _N ท้ายไฟล์ถ้ามีอยู่แล้ว

และสำหรับผู้ที่กำลังมองหาตัวเลือกที่อนุญาตให้สร้างโฟลเดอร์

exiftool -r '-FileName<DateTimeOriginal' -d %Y/%m/%d/%%f%%-c.%%e *

0

pyrenamer จะไม่ทำงานบน Ubuntu 16.04 ที่ติดตั้งใหม่ของฉันดังนั้นฉันต้องหาวิธีอื่นเพื่อแก้ไขปัญหานี้เช่นกัน

ฉันมีไฟล์เช่น IMG_0001.JPG, IMG_0002.JPG, ... ในโฟลเดอร์เดียว ตรวจสอบเว็บไซต์นี้ /programming/917260/can-var-parameter-expansion-expressions-be-nested-in-bash

ติดตั้ง "exiv2" ก่อนและฉันเขียนบรรทัดคำสั่งต่อไปนี้:

สำหรับ img เป็น $ (ls *. [Jj] [Pp] [Gg] 2> / dev / null); ทำ exiv2 -r '% Y% m% d_% H% M% S _' "$ (tmp = $ {img %%. *}; echo $ {tmp ## * _})" เปลี่ยนชื่อ "$ img"; เสร็จแล้ว

ชื่อไฟล์ที่ส่งออกคือ YYYYMMDD_HHMMSS_0001.JPG, YYYYMMDD_HHMMSS_0002.JPG, ... ฯลฯ แม้กระทั่งรูปที่ถ่ายในวินาทีเดียวกันหมายเลขซีเรียลของรูปภาพดั้งเดิมจะสร้างความแตกต่าง

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