Bagaimana Cara Mengganti Nama Banyak Foto dan Video Berdasarkan Data EXIF?

11

Saya sering mengimpor foto dan video (kebanyakan memiliki ekstensi JPG dan MOV) dari kamera digital dan tablet ke PC saya, dan saya ingin melihatnya diurutkan berdasarkan tanggal dan waktu pengambilannya sudah ada dalam data EXIF ​​mereka. Dan karenanya saya ingin mengubah nama mereka semua lebih disukai menggunakan Script Nautilus sederhana dengan lebih disukai memasukkan tanggal dan waktu prangko sebelum setiap nama file.

Sejauh ini saya hanya berhasil menyatukan Script Nautilus berikut, yang saya percaya masih jauh dari sempurna:

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

Apa yang saya tidak suka dalam metode penggantian nama ini adalah titik dua yang digunakan dalam stempel tanggal dan waktu EXIF (mis. "2013: 09: 03 20: 55: 09_IMG_0108.JPG") yang mungkin menimbulkan masalah saat mentransfer file ini nanti ke lingkungan lain ( misalnya Windows).

Perintah ini (menggunakan exiv2 bukannya exiftool ) dengan mudah memungkinkan manipulasi prangko tanggal dan waktu tetapi kekurangannya adalah ia tidak bekerja pada file video (misalnya MOV) :

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

Jadi saya berharap seseorang dapat menemukan solusi yang lebih baik. Dan itu akan ajaib jika bahkan berhasil mengubah nama file dan ekstensi asli menjadi huruf kecil juga!

Sadi
sumber
Selain jawaban hebat di bawah ini, Anda juga harus memeriksa pyRenamer . Saya tidak punya pengalaman menggunakannya dengan file video, (apakah mereka memiliki data EXIF?) Tetapi saya dapat mengatakan itu sangat baik untuk foto. Itu dapat mengubah ekstensi file menjadi huruf kecil juga.
Tom Brossman

Jawaban:

6

Apa yang saya tidak suka dalam metode penggantian nama ini adalah titik dua yang digunakan dalam stempel tanggal dan waktu EXIF ​​(mis. "2013: 09: 03 20: 55: 09_IMG_0108.JPG") yang mungkin menimbulkan masalah saat mentransfer file ini nanti ke lingkungan lain ( misalnya Windows).

Anda dapat menjalankan skema penamaan melalui sed, untuk mengganti titik dua dengan tanda hubung dan spasi dengan garis bawah, seperti:

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

Sedangkan untuk membuat semuanya menjadi huruf kecil, Anda bisa menggunakan rename:

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

Atau Anda bisa melakukannya dalam skrip Anda menggunakan sed, seperti pada:

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

... dan kemudian gunakan $jvariabel sebagai pengganti akhir baris $iAnda mv. Cara sed ini sedikit lebih portabel (jika itu penting bagi Anda) karena distro linux yang berbeda memiliki perintah ganti nama yang berbeda, sementara sed bersifat universal.

Atau, sebagai alternatif, skrip dapat dimodifikasi sebagai berikut untuk melakukan konversi nama file menjadi huruf kecil pada awalnya menggunakan 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

Untuk melakukan perintah yang sedikit berbeda untuk jenis file yang berbeda, pernyataan kasus bash dapat digunakan dalam skrip ini. Sebagai contoh:

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

Dalam contoh ini, penggantian nama file MOV yang memiliki cap waktu CreateDate SETIAP JUMLAH jam SETELAH ATAU SEBELUM file JPG disesuaikan dengan menggunakan data EXIF ​​(-tur) lainnya dan menghapus bahwa akhiran perbedaan waktu itu, dan mungkin perlu mengubah bagian -tur sesuai dengan lokasi yang diatur dalam sistem.

Evilsoup
sumber
Sayangnya saya tidak tahu bagaimana mengonversi nama file menjadi huruf kecil seperti yang Anda sarankan (memasukkan baris di atas dan mengubah yang terakhir $iuntuk $jtidak melakukan apa-apa). Sebagai gantinya, saya memasukkan konversi nama file ke huruf kecil di awal dan mengambil kebebasan untuk menambahkan ini sebagai opsi lain (yang paling tidak bekerja untuk saya) di akhir jawaban Anda sehingga saya dapat menerima jawaban Anda. Tentu saja Anda dapat mengedit jawaban Anda lebih lanjut sesuai keinginan.
Sadi
@sadi memandanginya dengan mata segar, saya bisa melihat apa yang saya lakukan salah dengan perintah sed. Versi terbaru akan berfungsi, meskipun tentu saja jika metode tr bekerja untuk Anda, itu tidak masalah (Saya curiga bahwa solusi tr mungkin sedikit lebih efisien sebenarnya, meskipun yang sed akan menangani karakter non-Inggris lebih baik)
evilsoup
Terima kasih. Saya ingin tahu apakah Anda juga dapat membantu saya lebih meningkatkan skrip ini dengan menggunakan satu perintah untuk file MOV dan lainnya untuk yang lain di sepanjang baris: jika [ekstensi adalah MOV] bla bla; lain bla bla. Alasannya adalah saya baru menyadari cap "CreateDate" di file MOV saya (dari iPad) anehnya punya +4 jam dan saya perlu menggunakan opsi lain (CreateDate-tur) agar mereka mencapai urutan foto dan video yang akurat. .
Sadi
Cara terbaik untuk itu (menurut saya) adalah dengan menggunakan pernyataan kasus; inilah sesuatu untuk Anda mulai. Anda juga dapat menggunakan pernyataan if, tetapi pernyataan kasus dapat lebih mudah diperluas untuk ekstensi file tambahan. Cari di internet untuk 'pernyataan kasus bash' untuk informasi lebih lanjut.
evilsoup
Terima kasih banyak!!! Saya juga akan menambahkan opsi ini ke jawabannya, jika Anda tidak keberatan.
Sadi
13

Saya perlu mengganti nama foto saya dan menemukan pertanyaan ini di sini - Saya baru tahu yang exiftoolmenanganinya secara asli:

Dari http://www.sno.phy.queensu.ca/~phil/exiftool/filename.html

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

Jika Anda ingin melacak nama file asli dan menulis huruf kecil ekstensi:

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

Hal yang sama juga berlaku dengan seluruh nama file dalam huruf kecil:

exiftool -d %Y%m%d_%H%M%S%%-c-%%lf.%%le "-filename<DateTimeOriginal" [.|DIR]
DerekC
sumber
DIR haruslah Folder tempat Foto dialokasikan. Jika kita sudah membuka Terminal di Folder tempat kita ingin mengeksekusi Perintah, kita harus mengganti DIR untuk. Dan jika Anda ingin menambahkan Awalan, ke Nama file (yaitu IMG_) ini harus dimasukkan sebelum rantai tanggal tanpa kutipan. Berikut contohnya: exiftool -d IMG_% Y% m% d_% H% M% S %% - c. %% e "-filename <CreateDate".
Nothor
2

Saya tahu Anda mengatakan bahwa Anda lebih suka skrip, namun, jika Anda terbuka untuk aplikasi Java gratis, Anda dapat menggunakan AmoK Exif Sorter

masukkan deskripsi gambar di sini

opticyclic
sumber
1

Saya akan gunakan krenameuntuk ini. Itu

  • menunjukkan pratinjau langsung
  • memungkinkan undo
  • dapat masuk secara rekursif ke dir
  • memungkinkan beberapa pola ganti nama
  • memungkinkan gumpalan dan regexps dalam pola
  • ingat sejarah
Adobe
sumber
0

Pyrenamer tidak akan berfungsi pada Ubuntu 16.04 saya yang baru diinstal, oleh karena itu saya harus mencari cara lain untuk menyelesaikan masalah ini juga.

Saya memiliki file seperti IMG_0001.JPG, IMG_0002.JPG, ... dalam satu folder. Periksa situs ini, /programming/917260/can-var-parameter-expansion-expressions-be-nested-in-bash

Instal "exiv2" terlebih dahulu, dan saya menulis baris perintah berikut:

untuk img dalam $ (ls *. [Jj] [Pp] [Gg] 2> / dev / null); lakukan exiv2 -r '% Y% m% d_% H% M% S _' "$ (tmp = $ {img %%. *}; echo $ {tmp ## * _})" ganti nama "$ img"; selesai

Nama file keluaran adalah YYYYMMDD_HHMMSS_0001.JPG, YYYYMMDD_HHMMSS_0002.JPG, ... dll. Bahkan foto diambil pada detik yang sama, nomor seri foto asli akan membuat perbedaan.

chuck lee
sumber