web-dev-qa-db-ja.com

EXIFデータに基づいて複数の写真とビデオの名前を変更する方法は?

私はよく写真とビデオ(ほとんどがJPGとMOVの拡張機能を持っています)デジタルカメラとタブレットからにインポートします。 撮影日時 EXIFデータに既に存在します。したがって、できれば各ファイル名の前に日付とタイムスタンプを挿入することにより、シンプルなNautilus Scriptを使用してすべての名前を変更するにしたいのです。

これまでのところ、次のNautilusスクリプトをまとめることしかできませんでした。

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

この名前変更方法で私が嫌いなのはEXIFの日付と時刻のスタンプで使用されるコロン(例: "2013:09:03 20:55:09_IMG_0108.JPG")で、転送時に問題が発生する可能性がありますこれらのファイルは、後で他の環境(Windowsなど)に送られます。

このコマンドは(exiftoolの代わりにexiv2を使用して)便利に日付とタイムスタンプの操作を有効にしますが、欠点はビデオでは動作しません(例えばMOV )files

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

だから、誰かがより良い解決策を考え出すことができることを望んでいる。そして、元のファイル名と拡張子を小文字に変換することさえできたら魔法だろう!

9
Sadi

この名前変更方法で私が嫌いなのは、EXIFの日付とタイムスタンプで使用されるコロン(例: "2013:09:03 20:55:09_IMG_0108.JPG")で、これらのファイルを後で他の環境に転送するときに問題を引き起こす可能性があります(例:Windows)。

次のように、sedを介して命名スキームを実行し、コロンをダッシュ​​に、スペースをアンダースコアに置き換えることができます。

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

全体を小文字にする場合は、renameを使用できます。

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

または、次のように、sedを使用してスクリプト内で実行できます。

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

...そして、mv行の最後の$jの代わりに$i変数を使用します。このsedの方法は、Linuxディストリビューションごとに異なる名前変更コマンドがあり、sedは普遍的であるため、多少移植性があります(もしあなたにとって重要な場合)。

または、代わりに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

ファイルの種類ごとにわずかに異なるコマンドを実行するには、このスクリプトでbash caseステートメントを使用できます。例えば:

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

この例では、CreateDateのタイムスタンプがOR BEFORE JPGファイルの前に、別の(-tur)EXIFデータを使用して調整し、それを削除することにより、MOVファイルの名前を変更します。その時差接尾辞、およびシステムで設定された場所に応じて-tur partを変更する必要があるかもしれません。

6
evilsoup

写真の名前を変更する必要があり、ここでこの質問を見つけました-exiftoolがネイティブに処理していることがわかりました。

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

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

元のファイル名を追跡し、拡張子を小文字にしたい場合:

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

同じことは、小文字のファイル名全体でも機能します。

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

スクリプトを好むと言ったのは知っていますが、無料のJavaアプリケーションを開いている場合は、 AmoK Exif Sorter を使用できます。

enter image description here

2
opticyclic

これにはkrenameを使用します。それ

  • ライブプレビューを表示します
  • 元に戻すことができます
  • 再帰的にdirに入ることができます
  • 複数の名前変更パターンを許可します
  • パターンでグロブと正規表現を許可します
  • 歴史を覚えている
1
Adobe

ピレナマーは、新しくインストールしたUbuntu 16.04では機能しないため、この問題を解決する別の方法を見つける必要があります。

IMG_0001.JPG、IMG_0002.JPGなどのファイルが1つのフォルダーにあります。このサイトを確認してください https://stackoverflow.com/questions/917260/can-var-parameter-expansion-expressions-be-nested-in-bash

最初に「exiv2」をインストールし、次のコマンドラインを作成しました。

img for $(ls *。[Jj] [Pp] [Gg] 2>/dev/null); do exiv2 -r '%Y%m%d_%H%M%S _' "$(tmp = $ {img %%。*}; echo $ {tmp ## * _})" rename "$ img";やった

出力ファイル名はYYYYMMDD_HHMMSS_0001.JPG、YYYYMMDD_HHMMSS_0002.JPGなどです。写真が同じ秒で撮影された場合でも、元の写真のシリアル番号によって違いが生じます。

0
chuck lee