私はよく写真とビデオ(ほとんどが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"
だから、誰かがより良い解決策を考え出すことができることを望んでいる。そして、元のファイル名と拡張子を小文字に変換することさえできたら魔法だろう!
この名前変更方法で私が嫌いなのは、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を変更する必要があるかもしれません。
写真の名前を変更する必要があり、ここでこの質問を見つけました-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]
スクリプトを好むと言ったのは知っていますが、無料のJavaアプリケーションを開いている場合は、 AmoK Exif Sorter を使用できます。
これにはkrename
を使用します。それ
ピレナマーは、新しくインストールした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などです。写真が同じ秒で撮影された場合でも、元の写真のシリアル番号によって違いが生じます。