วิธีการเปลี่ยนชื่อภาพถ่ายและวิดีโอหลายรายการตามข้อมูล EXIF


11

ฉันมักจะนำเข้ารูปถ่ายและวิดีโอ (ส่วนใหญ่มีนามสกุล JPG และ MOV) จากกล้องดิจิทัลและแท็บเล็ตไปยังพีซีของฉันและฉันต้องการให้พวกเขาเรียงลำดับตามวันที่และเวลาที่ถ่ายใน EXIF และด้วยเหตุนี้ความปรารถนาของฉันที่จะเปลี่ยนชื่อพวกเขาทั้งหมดควรใช้Nautilus Scriptอย่างง่ายโดยการแทรกการประทับวันที่และเวลาก่อนแต่ละชื่อไฟล์

ฉันมีการจัดการจนถึงเพียงเพื่อรวบรวม Nautilus Script ต่อไปนี้ซึ่งฉันเชื่อว่ายังห่างไกลจากความสมบูรณ์แบบ:

for i in *.*
do
mv -i "$i" "$(exiftool -CreateDate "$i" | awk -F ': ' '{print $2}')_"$i"" 
done

สิ่งที่ฉันไม่ชอบในวิธีการเปลี่ยนชื่อนี้คือโคลอนที่ใช้ในการประทับวันที่และเวลา EXIF (เช่น "2013: 09: 03 20: 55: 09_IMG_0108.JPG") ซึ่งอาจสร้างปัญหาเมื่อถ่ายโอนไฟล์เหล่านี้ไปยังสภาพแวดล้อมอื่น ๆ ในภายหลัง เช่น Windows)

คำสั่งนี้ (ใช้exiv2แทนexiftool ) ช่วยให้สามารถจัดการวันที่และเวลาได้อย่างสะดวกสบาย แต่ข้อเสียเปรียบคือมันไม่ทำงานบนไฟล์วิดีโอ (เช่น MOV) :

exiv2 -k -r '%Y-%m-%d_%H-%M-%S_:basename:' rename "$i"

ดังนั้นฉันหวังว่าจะมีบางคนคิดวิธีที่ดีกว่า และมันคงจะเป็นเรื่องมหัศจรรย์ถ้ามันสามารถแปลงชื่อไฟล์และนามสกุลเดิมให้เป็นตัวพิมพ์เล็กได้เช่นกัน!


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

คำตอบ:


6

สิ่งที่ฉันไม่ชอบในวิธีการเปลี่ยนชื่อนี้คือโคลอนที่ใช้ในการประทับวันที่และเวลา EXIF ​​(เช่น "2013: 09: 03 20: 55: 09_IMG_0108.JPG") ซึ่งอาจสร้างปัญหาเมื่อถ่ายโอนไฟล์เหล่านี้ไปยังสภาพแวดล้อมอื่น ๆ ในภายหลัง เช่น Windows)

คุณสามารถเรียกใช้รูปแบบการตั้งชื่อผ่านsedเพื่อแทนที่เครื่องหมายจุดคู่ด้วยเครื่องหมายขีดคั่นและช่องว่างด้วยเครื่องหมายขีดล่างเช่น:

mv -i "$i" "$(exiftool -CreateDate "$i" | awk -F ': ' '{print $2}' | sed -e 's/:/-/g' -e 's/ /_/g')_$i"

สำหรับการทำให้ตัวพิมพ์เล็กทั้งหมดคุณสามารถใช้rename:

rename 's/(.*)/\L$1/' file.JPG
##  or
rename 's/(.*)/\L$1/' *.*

หรือคุณสามารถทำได้ในสคริปต์ของคุณโดยใช้sedใน:

j=$(echo "$i" | sed -e 's/\(.*\)/\L\1/')

... จากนั้นใช้$jตัวแปรแทนตำแหน่งสุดท้าย$iของmvบรรทัดของคุณ วิธีที่ไม่ดีนี้พกพาได้มากกว่า (ถ้าคุณคิดว่าสำคัญ) เนื่องจาก linux distros ต่าง ๆ มีคำสั่งเปลี่ยนชื่อต่างกันในขณะที่ sed นั้นเป็นสากล

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

for arg 
do
  tmp="$(echo "$arg" | tr '[A-Z]' '[a-z]')"
  mv -i "$arg" "$(exiftool -CreateDate "$arg" | awk -F ': ' '{print $2}' | sed -e 's/:/-/g' -e 's/ /_/g')_$tmp"
done

หากต้องการดำเนินการคำสั่งที่แตกต่างกันเล็กน้อยสำหรับไฟล์ประเภทต่างๆคำสั่ง bash case สามารถใช้ในสคริปต์นี้ ตัวอย่างเช่น:

#! /usr/bin/env bash
for filename in ./*
do
  tmp="$(echo "$filename" | tr '[A-Z]' '[a-z]')"
  case "$filename" in
    *.MOV|*.mov) 
      mv -i "$filename" "$(exiftool -a -s -CreateDate-tur "$filename" | awk -F ': ' '{print $2}' | sed -e 's/\-[0-9][0-9]\:00//g' -e 's/\+[0-9][0-9]\:00//g' -e 's/:/-/g' -e 's/ /_/g')_$tmp"
      ;;
    *.JPG|*.jpg)
      mv -i "$filename" "$(exiftool -a -s -CreateDate "$filename" | awk -F ': ' '{print $2}' | sed -e 's/:/-/g' -e 's/ /_/g')_"$tmp""
      ;;
    *)
      echo 'Not a *.jpg or a *.mov!'
      ;;
  esac
done

ในตัวอย่างนี้เปลี่ยนชื่อไฟล์ MOV ที่มี CreateDate timestamps จำนวนชั่วโมงหลังหรือก่อนไฟล์ JPG จะถูกปรับโดยใช้อื่น (-tur) EXIF ข้อมูลและลบที่ว่าเวลาที่แตกต่างกันต่อท้ายใด ๆ และก็อาจจะมีความจำเป็นต้องเปลี่ยน-turส่วนหนึ่ง ตามตำแหน่งที่ตั้งไว้ในระบบ


แต่น่าเสียดายที่ผมไม่สามารถคิดออกวิธีการแปลงชื่อไฟล์เพื่อพิมพ์เล็กที่คุณแนะนำ (แทรกบรรทัดข้างต้นที่และการเปลี่ยนแปลงที่ผ่านมา$iจะ$jไม่ได้ทำอะไร) แต่ฉันแทรกการแปลงชื่อไฟล์เป็นตัวพิมพ์เล็กที่จุดเริ่มต้นและเอาเสรีภาพในการเพิ่มนี้เป็นตัวเลือกอื่น (ซึ่งทำงานอย่างน้อยสำหรับฉัน) ที่ส่วนท้ายของคำตอบของคุณเพื่อให้ฉันสามารถยอมรับคำตอบของคุณ แน่นอนคุณสามารถแก้ไขคำตอบของคุณเพิ่มเติมตามที่คุณต้องการ
Sadi

@sadi ดูด้วยตาสดฉันสามารถเห็นสิ่งที่ฉันทำผิดกับคำสั่ง sed เวอร์ชั่นล่าสุดจะใช้งานได้ แต่แน่นอนถ้าวิธี tr ทำงานได้ดีสำหรับคุณ (ฉันสงสัยว่าโซลูชัน tr อาจมีประสิทธิภาพมากกว่าเล็กน้อยจริง ๆ แต่รุ่น sed จะจัดการกับตัวละครที่ไม่ใช่ภาษาอังกฤษได้ดีกว่า)
evilsoup

ขอบคุณ. ฉันสงสัยว่าคุณสามารถช่วยฉันปรับปรุงสคริปต์นี้ให้ดีขึ้นได้หรือไม่โดยใช้หนึ่งคำสั่งสำหรับไฟล์ MOV และอีกอันสำหรับคนอื่น ๆ ตามลำดับ: ถ้า [นามสกุลคือ MOV] blah blah; อื่น blah blah เหตุผลก็คือฉันเพิ่งตระหนักว่าตราประทับ "CreateDate" ในไฟล์ MOV ของฉัน (จาก iPad) มีเวลา 4 ชั่วโมงอย่างแปลกประหลาดและฉันต้องใช้ตัวเลือกอื่น (CreateDate-tur) เพื่อให้ได้ภาพและวิดีโอที่แม่นยำ .
Sadi

วิธีที่ดีที่สุดสำหรับสิ่งนั้น (ในความเห็นของฉัน) คือการใช้คำสั่งกรณีและปัญหา นี่คือสิ่งที่จะให้คุณเริ่มต้น คุณยังสามารถใช้คำสั่ง if แต่คำสั่ง case สามารถขยายได้ง่ายขึ้นสำหรับนามสกุลไฟล์เพิ่มเติม ค้นหา 'bash case statement' ทางอินเทอร์เน็ตสำหรับข้อมูลเพิ่มเติม
evilsoup

ขอบคุณล้าน !!! ฉันจะเพิ่มตัวเลือกนี้ในคำตอบหากคุณไม่รังเกียจ
Sadi

13

ฉันต้องการเปลี่ยนชื่อรูปภาพของฉันและพบคำถามนี้ที่นี่ - ฉันเพิ่งพบว่าexiftoolจัดการได้โดยกำเนิด:

จากhttp://www.sno.phy.queensu.ca/~phil/exiftool/filename.html

exiftool -d %Y-%m-%d_%H-%M-%S%%-c.%%e "-filename<CreateDate" DIR 

หากคุณต้องการติดตามชื่อไฟล์ต้นฉบับและเขียนตัวพิมพ์เล็ก

exiftool -d %Y%m%d_%H%M%S%%-c-%%f.%%le "-filename<DateTimeOriginal" [.|DIR]

งานเดียวกันกับชื่อไฟล์ทั้งหมดในตัวพิมพ์เล็ก:

exiftool -d %Y%m%d_%H%M%S%%-c-%%lf.%%le "-filename<DateTimeOriginal" [.|DIR]

DIR จะต้องเป็นโฟลเดอร์ที่จัดสรรรูปถ่าย หากเราได้เปิด Terminal ในโฟลเดอร์ที่เราต้องการเรียกใช้ Command เราต้องแทนที่ DIR และถ้าคุณต้องการเพิ่มคำนำหน้าให้กับชื่อไฟล์ (เช่น IMG_) ต้องแทรกไว้ก่อนหน้าห่วงโซ่วันที่โดยไม่ต้องใส่เครื่องหมายอัญประกาศ นี่คือตัวอย่าง: exiftool -d IMG_% Y% m% d_% H% M% S %% - c .%% e "-filename <CreateDate"
Nothor

2

ฉันรู้ว่าคุณบอกว่าคุณชอบสคริปต์อย่างไรก็ตามถ้าคุณเปิดให้ใช้งานจาวาแอปพลิเคชันฟรีคุณสามารถใช้AmoK Exif Sorter

ป้อนคำอธิบายรูปภาพที่นี่


1

ฉันจะใช้krenameสำหรับสิ่งนี้ มัน

  • แสดงตัวอย่างสด
  • อนุญาตให้เลิกทำ
  • สามารถไปซ้ำใน dir
  • อนุญาตให้ใช้รูปแบบการเปลี่ยนชื่อหลายรายการ
  • ช่วยให้ globs และ regexps ในรูปแบบ
  • จำประวัติศาสตร์

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.