Ubah nama gambar menjadi waktu exif: Buat nama file unik


11

Jika saya mengubah nama gambar melalui exiv ke waktu tanggal exif, saya melakukan hal berikut:

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

Sekarang mungkin terjadi bahwa gambar memiliki stempel waktu yang sama persis (termasuk detik). Bagaimana saya bisa membuat nama file unik secara otomatis?

Perintah tersebut harus stabil dalam arti bahwa jika saya menjalankannya pada struktur direktori yang sama lagi (mungkin setelah menambahkan gambar baru), gambar yang sudah diganti nama tidak boleh berubah dan jika gambar dengan nama file yang sudah ada ditambahkan, nama file baru harus unik demikian juga.

Upaya pertama saya adalah hanya meninggalkan nama asli di nama file yang dihasilkan, tetapi kemudian perintah tidak akan stabil dalam arti di atas.


1
Ekstrak cap waktu, buat nama file, periksa nama file yang ada, modifikasi (tambahkan akhiran atau sejenisnya) jika ada, kemudian mvfile.
Kusalananda

Apakah ada cara yang lebih langsung dengan menambahkan opsi ke perintah exiv2?
siswa

Jadi jawaban menggunakan ExifTool akan menjadi sesuatu seperti: exiftool '-filename<createdate' -d %Y_%m_%d__%H_%M_%S%%-c.%%le "-filemodifydate<createdate#" -r -progress .. Mungkin Anda bisa mengubah komentar Anda menjadi sebuah jawaban.
siswa

Jawaban:


17

Anda mungkin ingin mencoba jheadyang melakukan out-of-the-box (dengan a, b... zsuffix yang memungkinkan hingga 27 file dengan tanggal yang sama) dan tidak memiliki masalah stabilitas yang disebutkan oleh @meuh:

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

Atau menggunakan exiftool(contoh di halaman manual):

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

(di sini %-cmenjadi akhiran numerik yang dimulai dengan -)


3

Versi saya exiv2(0.25 001900) akan bertanya secara interaktif apa yang harus dilakukan ketika nama file sudah ada.

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

Dengan menambahkan opsi, -Fia akan secara otomatis menambahkan ekstra _1(atau _2dll) ke nama.

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

Jika perintah dijalankan kedua kalinya dikatakan:

This file already has the correct name

dan tidak melakukan apa-apa, tetapi menjadi bingung jika ada _1bagian, dan akan mengganti nama _2. Ini akan beralih seperti ini dengan cara yang tidak merusak pada setiap putaran. Anda dapat mengabaikan ini jika suka, atau mengubah findpola Anda untuk mengabaikan file yang cocok dengan pola tanggal dengan suatu _bagian.

Misalnya, pola regex untuk format tanggal dimulai [0-9]{4}_[0-9]{2}_.... Untuk menyederhanakan, saya hanya akan mencari campuran 20 karakter dari set 0..9dan _, yang merupakan regex [0-9_]{20}. Untuk ini akhiran _diikuti oleh setidaknya 1 digit untuk dicari adalah _[0-9]{1,}.jpg. Karena regex harus cocok dengan seluruh path, dan bukan hanya nama dasarnya, regex terakhir termasuk direktori tersebut .*/[0-9_]{20}_[0-9]{1,}.jpg.

Jadi, Anda dapat menggunakan find seperti:

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

1

Exiv2 dapat menanganinya sendiri. Saya juga menghabiskan banyak waktu mencari bantuan untuk hal ini, sampai saya pergi melihat manual exiv2. Opsi -F memecahkan masalah ini.

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

Ini akan menambahkan _N di akhir jika file sudah ada.

Dan untuk mereka yang mencari opsi yang memungkinkan membuat folder.

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

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.