Come rinominare più foto e video in base ai dati EXIF?


11

Importa spesso foto e video (principalmente con estensioni JPG e MOV) da fotocamere digitali e tablet sul mio PC, e idealmente mi piacerebbe vederli ordinati in base alle date e alle ore in cui sono stati presi già presenti nei loro dati EXIF. E quindi il mio desiderio di rinominarli tutti preferibilmente usando un semplice script Nautilus inserendo preferibilmente la data e l'ora prima di ogni nome di file.

Finora sono riuscito solo a mettere insieme il seguente script Nautilus, che credo sia tutt'altro che perfetto:

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

Quello che non mi piace in questo metodo di ridenominazione sono i due punti utilizzati nei timbri data e ora EXIF (ad es. "2013: 09: 03 20: 55: 09_IMG_0108.JPG") che potrebbero creare problemi durante il trasferimento di questi file in seguito in altri ambienti ( ad es. Windows).

Questo comando (usando exiv2 invece di exiftool ) abilita convenientemente la manipolazione di data e ora, ma il suo svantaggio è che non funziona su file video (es. MOV) :

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

Quindi spero che qualcuno possa trovare una soluzione migliore. E sarebbe magico se riuscisse anche a convertire i nomi di file e le estensioni originali anche in minuscolo!


Oltre alle ottime risposte di seguito, dovresti anche dare un'occhiata a pyRenamer . Non ho esperienza con i file video (hanno dati EXIF?) Ma posso dire che è eccellente per le foto. Può anche modificare le estensioni dei file in minuscolo.
Tom Brossman,

Risposte:


6

Quello che non mi piace in questo metodo di ridenominazione sono i due punti utilizzati nei timbri data e ora EXIF ​​(ad es. "2013: 09: 03 20: 55: 09_IMG_0108.JPG") che potrebbero creare problemi durante il trasferimento di questi file in seguito in altri ambienti ( ad es. Windows).

È possibile eseguire lo schema di denominazione sedper sostituire i due punti con trattini e spazi con caratteri di sottolineatura, in questo modo:

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

Per quanto riguarda il rendere tutto minuscolo, è possibile utilizzare rename:

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

Oppure potresti farlo all'interno del tuo script usando sed, come in:

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

... e poi usa la $jvariabile al posto della finale $idella tua mvlinea. Questo modo sed è leggermente più portatile (se questo è importante per te) poiché diverse distribuzioni Linux hanno comandi di rinomina diversi, mentre sed è universale.

Oppure, in alternativa, lo script può essere modificato come segue per eseguire la conversione del nome file in minuscolo all'inizio usando trinvece:

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

Per eseguire comandi leggermente diversi per diversi tipi di file, in questo script è possibile utilizzare un'istruzione case bash. Per esempio:

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

In questo esempio, la ridenominazione dei file MOV che hanno i timestamp CreateDate QUALSIASI NUMERO di ore DOPO O PRIMA dei file JPG viene regolata usando altri dati EXIF ​​(-tur) e rimuovendo quel suffisso di tale differenza temporale, e potrebbe essere necessario cambiare -tur parte in base alla posizione impostata nel sistema.


Sfortunatamente non sono riuscito a capire come convertire i nomi dei file in minuscolo come suggerisci (inserendo quella riga sopra e cambiando l'ultimo $iper $jnon fare nulla). Invece, ho inserito la conversione del nome file in minuscolo all'inizio e mi sono preso la libertà di aggiungere questo come un'altra opzione (che ha funzionato almeno per me) alla fine della tua risposta in modo che io possa accettare la tua risposta. Ovviamente puoi modificare ulteriormente la tua risposta come desideri.
Sadi,

@sadi guardandolo con occhi nuovi, posso vedere cosa stavo facendo male con il comando sed. L'ultima versione funzionerà, anche se ovviamente il metodo tr funziona per te va bene (ho il sospetto furbo che la soluzione tr potrebbe essere leggermente più efficiente in realtà, anche se quella sed gestirà meglio i caratteri non inglesi)
evilsoup

Grazie. Mi chiedo se puoi anche aiutarmi a migliorare ulteriormente questo script usando un comando per i file MOV e un altro per gli altri lungo la linea: se [l'estensione è MOV] blah blah; altrimenti blah blah. Il motivo è che ho appena realizzato il timbro "CreateDate" nei miei file MOV (da iPad) che stranamente hanno +4 ore e ho bisogno di usare un'altra opzione (CreateDate-tur) per ottenere un ordine preciso di foto e video .
Sadi,

Il modo migliore per farlo (secondo me) è usare un'istruzione case; ecco qualcosa per iniziare. È inoltre possibile utilizzare un'istruzione if, ma le istruzioni case possono essere espanse più facilmente per estensioni di file aggiuntive. Cerca in Internet "case bash statement" per maggiori informazioni.
evilsoup,

Grazie mille!!! Aggiungerò anche questa opzione alla risposta, se non ti dispiace.
Sadi,

13

Avevo bisogno di rinominare le mie foto e ho trovato questa domanda qui - ho appena scoperto che lo exiftoolgestisce nativamente:

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

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

Se vuoi tenere traccia del nome file originale e scrivere l'estensione in minuscolo:

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

Lo stesso vale anche con l'intero nome del file in minuscolo:

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

DIR deve essere la cartella in cui sono allocate le foto. Se abbiamo già aperto un Terminale nella Cartella in cui vogliamo eseguire il comando, dobbiamo sostituire DIR per. E se si desidera aggiungere un prefisso, al Nome file (cioè IMG_) questo deve essere inserito prima della catena di date senza alcuna citazione. Ecco un esempio: exiftool -d IMG_% Y% m% d_% H% M% S %% - c. %% e "-filename <CreateDate".
Nothor,


1

Userei krenameper questo. esso

  • mostra l'anteprima dal vivo
  • consente di annullare
  • può andare ricorsivamente in dir
  • consente più pattern di rinomina
  • consente globs e regexps nei pattern
  • ricorda la storia

0

Il pyrenamer non funzionerà sul mio nuovo Ubuntu 16.04 installato, quindi devo trovare un altro modo per risolvere anche questo problema.

Ho file come IMG_0001.JPG, IMG_0002.JPG, ... in una cartella. Controlla questo sito, /programming/917260/can-var-parameter-expansion-expressions-be-nested-in-bash

Installare prima "exiv2" e ho scritto la seguente riga di comando:

per img in $ (ls *. [Jj] [Pp] [Gg] 2> / dev / null); do exiv2 -r '% Y% m% d_% H% M% S _' "$ (tmp = $ {img %%. *}; echo $ {tmp ## * _})" rinomina "$ img"; fatto

I nomi dei file di output sono AAAAMMGG_HHMMSS_0001.JPG, AAAAMMGG_HHMMSS_0002.JPG, ecc. Anche le foto sono state scattate nello stesso secondo, il numero di serie della foto originale farà la differenza.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.