GNU/Linux >> Znalost Linux >  >> Ubuntu

Jak přejmenovat více fotografií a videí na základě dat Exif?

Často importuji fotografie a videa (většinou s příponami JPG a MOV) z digitálních fotoaparátů a tabletů do mého PC a v ideálním případě bych je rád viděl seřazené podle dat a časů pořízení jsou již obsaženy v jejich EXIF ​​datech. A proto si přeji přejmenovat je všechny nejlépe pomocí jednoduchého Nautilus Script nejlépe vložením data a času před každý název souboru.

Doposud se mi podařilo dát dohromady pouze následující skript Nautilus, který, jak věřím, má k dokonalosti daleko:

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

Co se mi na této metodě přejmenování nelíbí, jsou dvojtečky používané v datech a časech EXIF (např. „2013:09:03 20:55:09_IMG_0108.JPG“), což může způsobit problémy při pozdějším přenosu těchto souborů do jiných prostředí (např. Windows).

Tento příkaz (pomocí exiv2 místo exiftool ) pohodlně umožňuje manipulaci s datovými a časovými razítky, ale jeho nevýhodou je, že nefunguje u souborů videa (např. MOV) :

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

Takže doufám, že někdo přijde s lepším řešením. A bylo by kouzlo, kdyby se mu podařilo převést i původní názvy souborů a přípony na malá písmena!

Přijatá odpověď:

Co se mi na této metodě přejmenování nelíbí, jsou dvojtečky používané v EXIF ​​datech a časových razítkách (např. „2013:09:03 20:55:09_IMG_0108.JPG“), které mohou způsobit problémy při pozdějším přenosu těchto souborů do jiných prostředí ( např. Windows).

Schéma pojmenování můžete spustit pomocí sed , abyste nahradili dvojtečky pomlčkami a mezery podtržítky, například takto:

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

Co se týče psaní celé věci na malá písmena, můžete použít rename :

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

Nebo to můžete udělat ve svém skriptu pomocí sed , jako v:

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

…a pak použijte $j proměnná místo posledního $i z vašeho mv čára. Tento způsob sed je o něco přenosnější (pokud na vás záleží), protože různá linuxová distribuce mají různé příkazy pro přejmenování, zatímco sed je univerzální.

Nebo lze skript upravit následovně a provést převod názvu souboru na malá písmena na začátku pomocí tr místo toho:

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

K provádění mírně odlišných příkazů pro různé typy souborů lze v tomto skriptu použít příkaz bash case. Například:

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

V tomto příkladu je přejmenování souborů MOV, které mají časová razítka CreateDate JAKÝKOLI POČET hodin PO NEBO PŘED JPG soubory, upraveno použitím jiných (-tur) EXIF ​​dat a odstraněním této přípony časového rozdílu a může být nutné změnit -tur část podle umístění nastaveného v systému.


Ubuntu
  1. Proč jsou data důležitá a jak je chránit

  2. Jak najít a odstranit duplicitní fotografie v Linuxu

  3. Jak bezpečně přejmenovat uživatele?

  1. Jak přejmenovat více souborů pomocí funkce Najít?

  2. Jak organizovat/třídit obrázky podle obrazových dat Exif?

  3. Jak přejmenovat více souborů najednou v Linuxu

  1. Jak přejmenovat místní a vzdálenou větev Git

  2. Jak přejmenovat místní a vzdálenou pobočku Git

  3. Jak spustit a zastavit OSWatcher