GNU/Linux >> Linux の 問題 >  >> Ubuntu

Exifデータに基づいて複数の写真やビデオの名前を変更するにはどうすればよいですか?

私はよく写真やビデオをインポートします (主にJPGおよびMOV拡張子が付いています)デジタルカメラおよびタブレットから 私のPCに送信します。理想的には、撮影された日時に従って並べ替えてもらいたいと思います。 EXIFデータにすでに存在します。したがって、すべての名前を変更したいと思います。 できれば、単純なノーチラススクリプトを使用してください できれば、各ファイル名の前に日付と時刻のスタンプを挿入してください。

私はこれまで、次のノーチラススクリプトをまとめることしかできませんでしたが、これは完璧にはほど遠いと思います。

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

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

このコマンド( exiv2 を使用) exiftoolの代わりに )日付と時刻のスタンプを簡単に操作できますが、その欠点はビデオ(MOVなど)ファイルでは機能しないことです。 :

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

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

承認された回答:

この名前変更方法で私が気に入らないのは、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/')

…そして$jを使用します 最後の$iの代わりに変数 あなたのmv ライン。 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

ファイルタイプごとにわずかに異なるコマンドを実行するために、このスクリプトでbashcaseステートメントを使用できます。例:

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

この例では、作成日タイムスタンプがJPGファイルの前後の任意の時間数を持つMOVファイルの名前変更は、別の(-tur)EXIFデータを使用し、その時差サフィックスを削除することで調整されます。変更が必要になる場合があります -tur システムに設定された場所に応じて分割します。


Ubuntu
  1. Linuxで重複する写真を見つけて削除する方法

  2. ユーザーの名前を安全に変更する方法は?

  3. OSWatcher を開始および停止する方法

  1. データが重要である理由とその保護方法

  2. 検索を使用して複数のファイルの名前を変更するにはどうすればよいですか?

  3. Exif画像データで画像を整理/並べ替える方法は?

  1. ローカルおよびリモートのGitブランチの名前を変更する方法

  2. Linuxで一度に複数のファイルの名前を変更する方法

  3. Git ブランチのローカルおよびリモートの名前を変更する方法