EXIF Verilerine Göre Birden Fazla Fotoğraf ve Video Nasıl Yeniden Adlandırılır?


11

Sık sık fotoğraf ve videoları (çoğunlukla JPG ve MOV uzantılarına sahip) dijital kameralardan ve tabletlerimden PC'ye aktarıyorum ve ideal olarak, EXIF ​​verilerinde zaten mevcut oldukları tarih ve saatlere göre sıralandıklarını görmek istiyorum . Bu nedenle , tercihen her bir dosya adından önce tarih ve saat damgalarını ekleyerek hepsini tercihen basit bir Nautilus Script'i kullanarak yeniden adlandırmak istiyorum .

Şimdiye kadar sadece mükemmel olmaktan uzak olduğunu düşündüğüm aşağıdaki Nautilus Senaryosunu bir araya getirmeyi başardım:

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

Bu yeniden adlandırma yönteminde sevmediğim, bu dosyaları daha sonra başka ortamlara aktarırken sorun yaratabilecek EXIF tarih ve saat damgalarında kullanılan sütunlardır (örn. "2013: 09: 03 20: 55: 09_IMG_0108.JPG"). örneğin Windows).

Bu komut ( exiftool yerine exiv2 kullanarak ), tarih ve saat damgalarının değiştirilmesini kolaylaştırır, ancak dezavantajı video (örn. MOV) dosyalarında çalışmaz :

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

Birisinin daha iyi bir çözüm bulabileceğini umuyorum. Ve orijinal dosya adlarını ve uzantılarını küçük harfe de dönüştürmeyi başarsa bile sihir olurdu!


Aşağıdaki harika yanıtlara ek olarak pyRenamer'ı da kontrol etmelisiniz . Video dosyaları ile kullanma konusunda hiçbir deneyimim yok, (EXIF verileri var mı?) Ama fotoğraflar için mükemmel olduğunu söyleyebilirim. Dosya uzantılarını da küçük harfe çevirebilir.
Tom Brossman

Yanıtlar:


6

Bu yeniden adlandırma yönteminde sevmediğim, bu dosyaları daha sonra başka ortamlara aktarırken sorun yaratabilecek EXIF ​​tarih ve saat damgalarında kullanılan sütunlardır (örn. "2013: 09: 03 20: 55: 09_IMG_0108.JPG"). örneğin Windows).

sedİki nokta üst üste işaretlerini ve boşlukları alt çizgi ile değiştirmek için adlandırma şemasını çalıştırabilirsiniz :

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

Her şeyi küçük harf yapmaya gelince, şunları kullanabilirsiniz rename:

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

Veya şu şekilde kullanarak komut dosyanız sediçinde yapabilirsiniz:

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

... ve daha sonra kullanmak $jnihai yerine değişken $isenin bir mvçizgi. Sed evrensel olsa da, farklı linux dağıtımlarının farklı yeniden adlandırma komutları olduğundan, bu sed yolu (sizin için önemliyse) biraz daha taşınabilir.

Alternatif olarak, komut dosyası başlangıçta küçük harfe dosya adı dönüşümü gerçekleştirmek için aşağıdaki gibi değiştirilebilir 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

Farklı dosya türleri için biraz farklı komutlar gerçekleştirmek için, bu komut dosyasında bir bash case deyimi kullanılabilir. Örneğin:

#! /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

Bu örnekte, CreateDate zaman damgalarına sahip MOV dosyalarının yeniden adlandırılması JPG dosyalarından SONRA VEYA ÖNCE HERHANGİ BİR saat saati başka bir (-tur) EXIF ​​verisi kullanılarak ve bu zaman farkı sonekini kaldırarak ayarlanır ve -tur parçasını değiştirmek gerekebilir. sistemde ayarlanan konuma göre.


Ne yazık sana önerdiği gibi küçük harfe dosya dönüştürme nasıl çözemedim (Yukarıdaki satırı ekleyerek ve son değişen $ihiç $jbir şey yapmak değildi). Bunun yerine, başlangıçta dosya adı dönüşümünü küçük harfe ekledim ve cevabınızı kabul edebilmem için cevabınızın sonuna başka bir seçenek olarak (en azından benim için çalışan) ekleme özgürlüğünü aldım. Elbette cevabınızı dilediğiniz gibi düzenleyebilirsiniz.
Sadi

@sadi ona taze gözlerle bakıyor, sed komutuyla neyi yanlış yaptığımı görebiliyorum. En son sürüm, elbette tr yöntemi sizin için işe
yarıyorsa işe yarayacak

Teşekkür ederim. Ben de MOV dosyaları için bir komut ve satır boyunca diğerleri için başka bir komut kullanarak bu komut dosyası geliştirmek bana yardımcı olabilir merak ediyorum: eğer [uzantı MOV ise] blah blah; başka falan filan. Bunun nedeni, MOV dosyalarındaki (iPad'den) "CreateDate" damgasını garip bir şekilde +4 saat olduğunu fark ettim ve doğru bir fotoğraf ve video sırası elde etmek için başka bir seçenek (CreateDate-tur) kullanmam gerekiyor .
Sadi

Bunun için en iyi yol (bence) bir vaka ifadesi kullanmaktır; İşte başlamanız için bir şey . Bir if ifadesi de kullanabilirsiniz, ancak vaka ifadeleri ek dosya uzantıları için daha kolay genişletilebilir. Daha fazla bilgi için internette 'bash case deyimi' arayın.
evilsoup

Milyonlarca kez teşekkürler!!! Sakıncası yoksa bu seçeneği yanıta ekleyeceğim.
Sadi

13

Fotoğraflarımı yeniden adlandırmam gerekiyordu ve bu soruyu burada buldum - sadece exiftoolyerel olarak ele aldığını öğrendim :

Gönderen http://www.sno.phy.queensu.ca/~phil/exiftool/filename.html

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

Orijinal dosya adını izlemek ve uzantı küçük harf yazmak istiyorsanız:

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

Aynı şey tüm dosya adı ile küçük harfle de geçerlidir:

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

DIR, Fotoğrafların tahsis edildiği Klasör olmalıdır. Klasörde Komutu yürütmek istediğimiz bir Terminal açmışsak, DIR yerine geçmeliyiz. Ve bir Önek eklemek istiyorsanız, Dosya Adına (yani IMG_), bu tarih zincirinin önüne herhangi bir alıntı yapılmadan eklenmelidir. İşte bir örnek: exiftool -d IMG_% Y% m% d_% H% M% S %% - c. %% e "-filename <CreateDate".
Nothor


1

Bunun krenameiçin kullanırdım . O

  • canlı önizlemeyi gösterir
  • geri almaya izin verir
  • tekrar tekrar dirine gidebilir
  • çoklu yeniden adlandırma düzenlerine izin verir
  • kalıplarda glob ve regexps'e izin verir
  • geçmişi hatırlar

0

Pyrenamer yeni kurulan Ubuntu 16.04 üzerinde çalışmayacak, bu yüzden bu sorunu da çözmek için başka bir yol bulmam gerekiyor.

Bir klasörde IMG_0001.JPG, IMG_0002.JPG, ... gibi dosyalarım var. Bu siteyi kontrol edin, /programming/917260/can-var-parameter-expansion-expressions-be-nested-in-bash

Önce "exiv2" yi yükleyin ve aşağıdaki komut satırını yazdım:

img için $ (ls *. [Jj] [Pp] [Gg] 2 / dev / null); exiv2 -r '% Y% m% d_% H% M% S _' "$ (tmp = $ {img %%. *}; echo $ {tmp ## * _})" yeniden adlandır "$ img"; tamam

Çıktı dosya adları YYYYMMDD_HHMMSS_0001.JPG, YYYYMMDD_HHMMSS_0002.JPG, ... vb. Fotoğraflar aynı saniyede çekilmiş olsa bile orijinal fotoğraf seri numarası fark yaratacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.