Görüntüleri exif zamanına göre yeniden adlandırın: Benzersiz dosya adları oluşturun


11

Exiv ile exif tarih saatine görüntüleri yeniden adlandırırsam, aşağıdakileri yaparım:

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

Şimdi resimlerin tam olarak aynı zaman damgasına sahip olması (saniye dahil) olabilir. Dosya adını otomatik olarak nasıl benzersiz hale getirebilirim?

Komut, aynı dizin yapısında tekrar çalıştırırsam (belki de yeni resimler ekledikten sonra), yeniden adlandırılan resimlerin değişmemesi ve zaten mevcut dosya adlarına sahip resimler eklenirse yeni dosya adlarının benzersiz olması gerektiği açısından kararlı olmalıdır. de.

İlk denemem sonuçta ortaya çıkan dosya adında orijinal taban adını bırakmaktı, ancak komut yukarıdaki anlamda sabit olmazdı.


1
Zaman damgasını çıkarın, dosya adını oluşturun, mevcut dosya adını kontrol edin, varsa değiştirin (sonek veya benzeri ekleyin), sonra mvdosya.
Kusalananda

Ayrıca exiv2 komutuna bir seçenek ekleyerek daha doğrudan bir yol var mı?
Öğrenci

Yani ExifTool kullanarak cevap gibi bir şey olacaktır: exiftool '-filename<createdate' -d %Y_%m_%d__%H_%M_%S%%-c.%%le "-filemodifydate<createdate#" -r -progress .. Belki yorumunuzu bir cevaba çevirebilirsiniz.
öğrenci

Yanıtlar:


17

Sen denemek isteyebilirsiniz jheadyapar ki bunun yerine dışarı-of-the-box (ile a, b... zve @meuh bahsettiği istikrar sorunu yok soneklerden aynı tarihte 27 dosya kadar izin):

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

Veya kullanarak exiftool(kılavuz sayfasındaki örnek):

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

(burada %-cbaşlayarak sayısal bir sonek olarak -)


3

Benim sürümü exiv2(0.25 001900) dosya adı zaten var ne yapacağını etkileşimli soracaktır.

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

Seçenek ekleyerek -F, otomatik olarak isme otomatik olarak bir ekstra _1(veya _2vb.) Ekleyecektir .

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

Komut ikinci kez çalıştırılırsa şöyle der:

This file already has the correct name

ve hiçbir şey yapmaz, ancak _1parça varsa karışır ve yeniden adlandırır _2. Her koşuda tahribatsız bir şekilde bu şekilde değişecektir. İsterseniz bunu göz ardı edebilir veya findtarih deseniyle bir _parçayla eşleşen dosyaları yoksaymak için deseninizi değiştirebilirsiniz .

Örneğin, tarih biçimi için normal ifade kalıbı başlar [0-9]{4}_[0-9]{2}_.... Basitleştirmek için, setten 20 karakterlik bir karışım arayacağım 0..9ve _regex [0-9_]{20}. Bunun _için aramak için en az 1 basamaklı sonek vardır _[0-9]{1,}.jpg. Normal ifade yalnızca temel adla değil tüm yolla eşleşmesi gerektiğinden, dizini içeren son normal ifade kullanılır .*/[0-9_]{20}_[0-9]{1,}.jpg.

Böylece şöyle bir bulma kullanabilirsiniz:

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

1

Exiv2 kendi başına halledebilir. Ben de exiv2 kılavuzunu görene kadar bu konuda yardım aramak için çok zaman harcadım. -F seçeneği bu sorunu çözer.

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

Dosya zaten varsa sonuna _ _ ekler.

Ve klasör oluşturmaya izin veren bir seçenek arayanlar için.

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

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.