Phockupで写真を日付フォルダに整理する-p--qでPhockupを使いましたが写真と動画の撮影日時をExif情報から得る-p--qでみたように動画の場合は9時間ずれて分類されてしまう問題がありました。ExifToolならそれを修正して分類できました。
ExifToolのインストール
sudo apt install libimage-exiftool-perl
PhockupをインストールしてあればExifToolはすでにインストール済です。
ファイル名の変更とフォルダへの分類する方法のマニュアルです。
フォルダへの分類はパスで指定するだけです。
ファイル名やフォルダ名はExif情報の各項目から指定できてその書式も指定できます。
ExifTool Date/Time Shift Module
動画の撮影日時が9時間ずれる問題はCreateDateがUTCなのが原因なのでこのShiftTime関数で9時間加えてJSTにします。
拡張子を指定する-extオプションやExif情報の項目名に大文字小文字の区別はありません。
写真を日付フォルダに整理するコマンド
写真とはつまりJPEG画像です。これはExif情報が付いている写真と付いていない写真を区別してから分類することにします。写真と動画の撮影日時をExif情報から得る-p--qの結果からExif情報があるかないかはDateTimeOriginalがあるかないかで判断することにします。
Exif情報のある写真 (DateTimeOriginalのある写真)
exiftool -ext jpg -ext jpeg -if '$DateTimeOriginal' -d
%Y-%m-%d/%Y%m%d_%H%M%S%%+3c.%%e '-filename<DateTimeOriginal' .
カレントディレクトリにある拡張子jpgまたはjpegファイルについてDateTimeOriginalの項目があればその日時を撮影日時と判断してそれを使って2022-10-24/20221024_112012.JPGといったフォルダ名とファイル名に変更します。拡張子は変更しません。同じファイル名になるときは末尾に_001といった連番がつきます。
Exif情報のない写真 (DateTimeOriginalのない写真)
exiftool -ext jpg -ext jpeg -if 'not $DateTimeOriginal' '-filename<noExif/FileModifyDate${FileModifyDate#;DateFmt("%Y%m%d_%H%M%S")}_%f%+3c.%e' .
これは撮影日時の手がかりは画像そのものをみて判断しないといけないのでnoExifというフォルダに移動させて、一つずつ確認しながら人力で整理することにします。FileModifyDateはファイルを取得した日時に一致することが多いので、元のファイル名の前にFileModifyDateの日時をつけます。smbでマウントしたNASからファイルをコピーするとFileModifyDateが変更されてしまうのでそのときはcifsでマウントしたほうがよいです(NASにあるファイルをKonsoleで引数に使えるようにする-p--q)。
-ifオプションを使わずにワンライナーで処理する
exiftool -ext jpg -ext jpeg '-filename<noExif/FileModifyDate${FileModifyDate#;DateFmt("%Y%m%d_%H%M%S")}_%f%+3c.%e' '-filename<${DateTimeOriginal#;DateFmt("%Y-%m-%d")}/${DateTimeOriginal#;DateFmt("%Y%m%d_%H%M%S")}%+3c.%e' .
-filenameオプションは左のオプションを右のオプションが上書きするという機能があるのでそれを利用すると-if '$DateTimeOriginal'と -if 'not $DateTimeOriginal' は-filenameオプションを2つ使って一つのコマンドで処理できます。
動画を日付フォルダに整理するコマンド
iPhoneで撮影したmovファイルはCreationDateに撮影日時があるのでそれを使います。Redmi Note 9Sで撮影したmp4ファイルはCreationDateがないのでCreateDateをUTCからJSTに変換してファイル名に使うことにします。ただしそれだとLINEからダウンロードしたmp4ファイルと区別がつかないのでGPSPositionの有無で区別することにします。
iPhoneの動画(CreationDateがあるmov動画)
exiftool -ext mov -if '$CreationDate' -d %Y-%m-%d/%Y%m%d_%H%M%S%%+3c.%%e '-filename<CreationDate' .
カレントディレクトリにある拡張子movファイルについてCreationDateの項目があればその日時を撮影日時と判断してそれを使って2022-10-24/20221024_112012.movといったフォルダ名とファイル名に変更します。拡張子は変更しません。同じファイル名になるときは末尾に_001といった連番がつきます。
need Help : The ExtractEmbedded option may find more tags in the movie data
MOVファイルを処理すると The ExtractEmbedded option may find more tags in the movie dataという警告がでてきますが気にしなくてよいようです。
iPhone以外の動画(位置情報のあるmp4動画)
exiftool -ext mp4 -if '$GPSPosition'
'-filename<${CreateDate#;ShiftTime(9);DateFmt("%Y-%m-%d")}/${CreateDate#;ShiftTime(9);DateFmt("%Y%m%d_%H%M%S")}%+3c.%e'
.
カレントディレクトリにある拡張子mp4ファイルについてGPSPositionの項目があればCreateDateを撮影日時のUTCと判断してそれに9時間進めた時間で2022-10-24/20221024_112012.mp4といったフォルダ名とファイル名に変更します。拡張子は変更しません。同じファイル名になるときは末尾に_001といった連番がつきます。ファイル自体のCreateDateは変更しません。
-CreateDate+=9
このオプションをつけるとCreateDateを9時間進めることはできますが変更されるのはファイル名変更後になります。 なので次のようなオプションではいずれもUTCでファイル名がついてしまいます。
-createdate+=9 -d %Y-%m-%d/%Y%m%d_%H%M%S%%+3c.%%e '-filename<CreateDate'
-d %Y-%m-%d/%Y%m%d_%H%M%S%%+3c.%%e '-filename<${CreateDate;ShiftTime(9)}'
-createdate+=9 '-filename<${CreateDate#;DateFmt("%Y-%m-%d")}/${CreateDate#;DateFmt("%Y%m%d_%H%M%S")}%+3c.%e'
上記以外の動画(CreationDateも位置情報もない動画)
exiftool -ext mov -ext mp4 -if 'not $CreationDate' -if 'not $GPSPosition' '-filename<noExif/FileModifyDate${FileModifyDate#;DateFmt("%Y%m%d_%H%M%S")}_%f%+3c.%e' .
これらは撮影日時をファイル情報から得る方法がないのでExif情報のない写真と同じようにFileModifyDateを元のファイル名の先頭につけてnoExifフォルダに移動させます。
-ifオプションを使わずにワンライナーで処理する
exiftool -ext mov '-filename<noExif/FileModifyDate${FileModifyDate#;DateFmt("%Y%m%d_%H%M%S")}_%f%+3c.%e' '-filename<${CreationDate#;DateFmt("%Y-%m-%d")}/${CreationDate#;DateFmt("%Y%m%d_%H%M%S")}%+3c.%e' .
MOVファイルについてはCreationDateの有無で判断できるので一つのコマンドで処理できます。
exiftool -ext mp4 '-filename<noExif/FileModifyDate${FileModifyDate#;DateFmt("%Y%m%d_%H%M%S")}_%f%+3c.%e' -if '$GPSPosition' '-filename<${CreateDate#;ShiftTime(9);DateFmt("%Y-%m-%d")}/${CreateDate#;ShiftTime(9);DateFmt("%Y%m%d_%H%M%S")}%+3c.%e' .
MP4ファイルについてはファイル名には使用しないGPSPositionで判断するので-ifオプションは-filenameオプションのように上書き機能がないのでこのコマンドではGPSPositionがあるファイルしか処理されないことになって一つのコマンドでは処理できません。
写真と動画を日付フォルダに自動整理するシェルスクリプト
#!/bin/bash
# 変換元ディレクトリまたはファイル。
SRC=.
# 整理先ディレクトリ名
DIRNAME=%Y-%m-%d
# ファイル名
FNAME=%Y%m%d_%H%M%S
# Exif情報のないファイルの分類ディレクトリ
DESDIR=noExif
# exiftoolの追加オプション -v:出力表示 -r:再帰検索
OP="-v1"
echo 移動条件にあわないファイルはfailed conditionと表示されます。
echo DateTimeOriginalのあるJPGファイルを移動させます。
exiftool $OP -ext jpg -ext jpeg -if '$DateTimeOriginal' -d ${DIRNAME}/${FNAME}%%+3c.%%e '-filename<DateTimeOriginal' $SRC
echo DateTimeOriginalのないJPGファイルを$DESDIRに移動させます。
exiftool $OP -ext jpg -ext jpeg -if 'not $DateTimeOriginal' '-filename<'$DESDIR'/FileModifyDate${FileModifyDate#;DateFmt("'$FNAME'")}_%f%+3c.%e' $SRC
echo CreationDateのあるMOVファイルを移動させます。
exiftool $OP -ext mov -if '$CreationDate' -d ${DIRNAME}/${FNAME}%%+3c.%%e '-filename<CreationDate' $SRC
echo CreationDateのないMOVファイルを$DESDIRに移動させます。
exiftool $OP -ext mov -if 'not $CreationDate' -directory=$DESDIR $SRC
echo GPSPositionのあるMP4ファイルを移動させます。
exiftool $OP -ext mp4 -if '$GPSPosition' '-filename<${CreateDate#;ShiftTime(9);DateFmt("'$DIRNAME'")}/${CreateDate#;ShiftTime(9);DateFmt("'$FNAME'")}%+3c.%e' $SRC
echo CreationDateのないMOVファイルとGPSPositionのないMP4ファイルを$DESDIRに移動させます。
exiftool $OP -ext mov -ext mp4 -if 'not $CreationDate' -if 'not $GPSPosition' '-filename<'$DESDIR'/FileModifyDate${FileModifyDate#;DateFmt("'$FNAME'")}_%f%+3c.%e' $SRC
出力レベルを-v1にして処理中のファイル名がわかるようにしています。
これだとループが6回まわることになるのでひとつにまとめられるコマンドは一つにまとめます。
#!/bin/bash
# 変換元ディレクトリまたはファイル。
SRC=.
# 整理先ディレクトリ名
DIRNAME=%Y-%m-%d
# ファイル名
FNAME=%Y%m%d_%H%M%S
# Exif情報のないファイルの分類ディレクトリ
DESDIR=noExif
# exiftoolの追加オプション -v:出力表示 -r:再帰検索
OP="-v1"
echo 移動条件にあわないファイルはfailed conditionと表示されます。
echo JPGファイルを移動させます。DateTimeOriginalのないMOVファイルを$DESDIRに移動させます。
exiftool $OP -ext jpg -ext jpeg '-filename<'$DESDIR'/FileModifyDate${FileModifyDate#;DateFmt("'$FNAME'")}_%f%+3c.%e' '-filename<${DateTimeOriginal#;DateFmt("'$DIRNAME'")}/${DateTimeOriginal#;DateFmt("'$FNAME'")}%+3c.%e' $SRC
echo MOVファイルを移動させます。CreationDateのないMOVファイルを$DESDIRに移動させます。
exiftool $OP -ext mov '-filename<'$DESDIR'/FileModifyDate${FileModifyDate#;DateFmt("'$FNAME'")}_%f%+3c.%e' '-filename<${CreationDate#;DateFmt("'$DIRNAME'")}/${CreationDate#;DateFmt("'$FNAME'")}%+3c.%e' $SRC
echo GPSPositionのあるMP4ファイルを移動させます。
exiftool $OP -ext mp4 -if '$GPSPosition' '-filename<${CreateDate#;ShiftTime(9);DateFmt("'$DIRNAME'")}/${CreateDate#;ShiftTime(9);DateFmt("'$FNAME'")}%+3c.%e' $SRC
echo GPSPositionのないMP4ファイルを$DESDIRに移動させます。
exiftool $OP -ext mp4 -if 'not $GPSPosition' '-filename<'$DESDIR'/FileModifyDate${FileModifyDate#;DateFmt("'$FNAME'")}_%f%+3c.%e' $SRC
これでループが4回に減ったと思います。
このままではちょっと使いにくかったので次のようにディレクトリ部分を変更しました。スクリプトファイル名をrenamePhotos.shにしてパーミッションを実行可能にして./renamePhotos.shで実行しています。
#!/bin/bash
# 変換元ディレクトリまたはファイル。
SRC=Photos
# 整理先ディレクトリ名
DIRNAME=${SRC}/%Y-%m-%d
# ファイル名
FNAME=%Y%m%d_%H%M%S
# Exif情報のないファイルの分類ディレクトリ
DESDIR=${SRC}/noExif
# exiftoolの追加オプション -v:出力表示 -r:再帰検索
OP="-v1"
echo 移動条件にあわないファイルはfailed conditionと表示されます。
echo JPGファイルを移動させます。DateTimeOriginalのないMOVファイルを$DESDIRに移動させます。
exiftool $OP -ext jpg -ext jpeg '-filename<'$DESDIR'/FileModifyDate${FileModifyDate#;DateFmt("'$FNAME'")}_%f%+3c.%e' '-filename<${DateTimeOriginal#;DateFmt("'$DIRNAME'")}/${DateTimeOriginal#;DateFmt("'$FNAME'")}%+3c.%e' $SRC
echo MOVファイルを移動させます。CreationDateのないMOVファイルを$DESDIRに移動させます。
exiftool $OP -ext mov '-filename<'$DESDIR'/FileModifyDate${FileModifyDate#;DateFmt("'$FNAME'")}_%f%+3c.%e' '-filename<${CreationDate#;DateFmt("'$DIRNAME'")}/${CreationDate#;DateFmt("'$FNAME'")}%+3c.%e' $SRC
echo GPSPositionのあるMP4ファイルを移動させます。
exiftool $OP -ext mp4 -if '$GPSPosition' '-filename<${CreateDate#;ShiftTime(9);DateFmt("'$DIRNAME'")}/${CreateDate#;ShiftTime(9);DateFmt("'$FNAME'")}%+3c.%e' $SRC
echo GPSPositionのないMP4ファイルを$DESDIRに移動させます。
exiftool $OP -ext mp4 -if 'not $GPSPosition' '-filename<'$DESDIR'/FileModifyDate${FileModifyDate#;DateFmt("'$FNAME'")}_%f%+3c.%e' $SRC
整理する写真と動画が 多すぎて同じフォルダにいれるとどこにスクリプトがあるのかわからなくなったのでスクリプトを置いているフォルダにPhotosというフォルダを作ってそこに整理する写真と動画をいれて実行するようにしました。
#!/bin/bash
# 変換元ディレクトリまたはファイル。
SRC=Photos
# 整理先ディレクトリ名
DIRNAME=${SRC}/%Y-%m-%d
# ファイル名
FNAME=%Y%m%d_%H%M%S
# Exif情報のないファイルの分類ディレクトリ
DESDIR=${SRC}/noExif
# exiftoolの追加オプション -v:出力表示 -r:再帰検索
OP="-v1"
echo 移動条件にあわないファイルはfailed conditionと表示されます。
echo JPGファイルを移動させます。DateTimeOriginalのないMOVファイルを$DESDIRに移動させます。
exiftool $OP -ext jpg -ext jpeg '-filename<'$DESDIR'/FileModifyDate${FileModifyDate#;DateFmt("'$FNAME'")}_%f%+3c.jpg' '-filename<${DateTimeOriginal#;DateFmt("'$DIRNAME'")}/${DateTimeOriginal#;DateFmt("'$FNAME'")}%+3c.jpg' $SRC
echo MOVファイルを移動させます。CreationDateのないMOVファイルを$DESDIRに移動させます。
exiftool $OP -ext mov '-filename<'$DESDIR'/FileModifyDate${FileModifyDate#;DateFmt("'$FNAME'")}_%f%+3c.mov' '-filename<${CreationDate#;DateFmt("'$DIRNAME'")}/${CreationDate#;DateFmt("'$FNAME'")}%+3c.mov' $SRC
echo GPSPositionのあるMP4ファイルを移動させます。
exiftool $OP -ext mp4 -if '$GPSPosition' '-filename<${CreateDate#;ShiftTime(9);DateFmt("'$DIRNAME'")}/${CreateDate#;ShiftTime(9);DateFmt("'$FNAME'")}%+3c.mp4' $SRC
echo GPSPositionのないMP4ファイルを$DESDIRに移動させます。
exiftool $OP -ext mp4 -if 'not $GPSPosition' '-filename<'$DESDIR'/FileModifyDate${FileModifyDate#;DateFmt("'$FNAME'")}_%f%+3c.mp4' $SRC
拡張子の大文字と小文字が混在すると次のWindowsやNASに移動させると「ファイルは既に存在します」といわれる問題が生じるので拡張子はすべて小文字に統一させるようにしました。
WindowsやNASに移動させると「ファイルは既に存在します」といわれる問題
iPhoneのカメラアプリで撮影した画像ファイルの拡張子は 大文字になっています。それに対してRedmi Note 9Sで撮影した画像ファイルの拡張子は小文字になっています。
なので、ファイル名を撮影日時に変更したときに同じ撮影日時であってもiPhoneとRedmi Note 9Sで撮影したファイル同一ファイル名にはならず連番はつきません。
しかしこれらをWindows10やNASに移動させようとするとまず大文字の拡張子のファイルが移動されて、小文字の拡張子のファイルを移動するときに「ファイルは既に存在します」といわれてしまいます。そこで「書き込む」を選択してしまうと先に移動した大文字の拡張子のファイルは消えてしまうことになります。
KDE neonからNASやFATフォーマットのリムーバルディスクに移動させたときに「ファイルは既に存在します」といわれたときはこの問題に気がつくかもしれません。問題はKDE neonでNTFSフォーマットのリムーバルディスクに保存したときです。NTFSフォーマットでは大文字小文字の区別はされるので、KDE neonに繋いでいる限りは問題は起きませんしWindows10に接続していてもファイルを移動させなければ問題はおきません。
しかしWindows10内で大文字と小文字の違いしかない同一ファイル名のファイルを移動させようとすると「ファイルは既に存在します」といわれてしまいます。そこで大文字小文字の違いしかない同一ファイル名の存在に気がつけばよいですが、そういうときはたいがい大量のファイルを移動させているときで「すべてに適用」して「上書き」を選択してしまっていました。なので大文字の拡張子のjpgファイルは上書きしまって失ってしまっているものがあるはずです。
0 件のコメント:
コメントを投稿