スマートフォンで撮った画像ファイルを更新日時に変更したくなったのでパワーシェルで実現してみました。
スマートフォン で撮るとDSC_0001.JPGなどの連番でファイル名が付けられますが、新しい スマートフォンに機種変更したりするとPCにバックアップする時、過去の画像ファイルと同名となりコピーをスキップしたり間違えて上書きしちゃったりするかもしれません。
ファイル数が少なければ手動で一意となるようにファイル名を変更したり保存フォルダを変更すればいいですが、写真は日々増えていくので自動で一括変更して楽していきます。
一括リネームの要件
一括でファイル名を変更する条件は以下のようにしました。
- 指定のフォルダ内に格納されているファイルが対象(サブフォルダ含む)
- 拡張子が.JPG、またはPNG
- ファイルの更新日時をファイル名にする
- ファイル名のフォーマットはyyyyMMdd_HHmmss (例:20210123_123456)
なぜファイル名を日時にする?
更新日時にすることで基本的にファイル名は一意になります。
細かいことを言うと同一時間に撮影された画像ファイルが存在した場合は同一ファイル名となってしまい、エラーとなりますが今回は気にしないことにします。
パワーシェルで書いてみる
ファイル一覧を取得する
- 指定のフォルダ内に格納されているファイルが対象(サブフォルダ含む)
- 拡張子が.JPG、またはPNG
最初にこの2点についてです。
確認のためにパワーシェルを起動し、以下のコマンドを実行してください。
> cd C:\gomibako\rename
> ls -R -File -Include *.PNG,*.JPG
cd コマンドにより変換を行いたいフォルダに移動し、2行目のlsコマンドでファイルの一覧を表示します。Get-ChildItemコマンドでも可能です。
ls の各オプションについては以下となります。
-R | サブフォルダがあれば再帰的に処理する |
-File | ファイルのみを対象にする(フォルダは除く) |
-Include | フィルターのようなもの ワイルドカードを使って対象を絞り込むことができる |
実行するとこのようにファイルの一覧が表示されます。
ファイルの更新日時を取得する
- ファイルの更新日時をファイル名にする
- ファイル名のフォーマットはyyyyMMdd_HHmmss (例:20210123_123456)
次にこちらです。
同じように 以下のコマンドを実行してください。
> $files = ls -R -File -Include *.PNG,*.JPG
> $files[0].LastWriteTime.ToString("yyyyMMdd_HHmmss")
ls で取得した一覧を files という変数に格納し、一覧の一番先頭にあるファイルの更新日時を LastWriteTime で取得します。
作成日時を使用したい場合は CreationTime としてください。
その後、 ToString で yyyyMMdd_HHmmss の形式に変換しています。
実行するとこうなります。
ファイル名を変更する
最後にリネームするためのコマンドです。
以下のコマンドでリネームできます。
> ren $files[0] "新しいファイル名.jpg"
パワーシェルを実行して一括処理していく
以上で大体必要な部品は揃いました。残りは取得したファイル一覧をループさせる処理のみとなります。今回はforeachを使用していきます。
以下がパワーシェルのソース全文です。
実行する場合はファイル名を変更したいフォルダにパワーシェルのファイルを作成して実行してください。パワーシェルのファイルが格納されているフォルダ以外を対象としたい場合は2行目の cd コマンドの “.” をパスに変更してください。
# リネーム対象のフォルダに移動
cd .
# ファイルの一覧を取得
$files = ls -R -File -Include *.PNG,*.JPG
foreach ($file in $files) {
# LastWriteTimeで更新日時を取得
# 作成日時でリネームする場合はCreationTimeを使用する
$name = $file.LastWriteTime.ToString("yyyyMMdd_HHmmss") + $file.Extension
echo $file.Name " --> " $name
# リネーム実行
ren $file $name
}
# エンターを押下するまで待機
pause
こちらを実行するとこうなります。
-Includeで大文字で拡張子を指定していますが、どうやら大文字小文字は気にしないみたいです。
以上です。
コメント