俺の外付けHDD

外付けHDDではなくはてなのサーバーラックの中でした

フォルダ内の複数写真の撮影日を参照して一括リネームするバッチ

D&Dしたフォルダ内のファイル(iphoneで撮った画像たちを処理したかった。IMG_xxxxみたいに連番になっちゃってて不便だった。)に対しそれらの日付時刻をチョキチョキペタペタしたのを使ってリネームするという作業を繰り返す。分の位まで重複しちゃったら連番付。ImageMagickを使えば秒の位まで見られるポだけど処理遅いからdosのみで処理。100ファイル1秒くらい?

バッチ本体

拡張子.batで保存。Shift-JISで頼む。
※このままでは動作しません。環境に合わせる必要があるので下の解説をご覧ください。

@echo off
cd %1
for %%a in ( *.* ) do (
    call :sub "%%a"
)
exit /b

:sub
set EXIF=%~t1
set EXIF=%EXIF:~0,2%%EXIF:~3,2%%EXIF:~6,2%_%EXIF:~13,2%%EXIF:~16,2%
if not exist %EXIF%%~x1 (
    ren %1 %EXIF%%~x1
) else if exist %EXIF%%~x1 (
    set cnt=0
    :loop
    set /a cnt=cnt+1
    if not exist %EXIF%_%cnt%%~x1 (
        ren %1 %EXIF%_%cnt%%~x1
    ) else if exist %EXIF%_%cnt%%~x1 (
        goto :loop
    )
)
exit /b

解説

cd %1 D&Dしたフォルダをカレントディレクトリに
for %%a in ( *.* ) do call :sub "%%a" フォルダ内の全てのファイル*.*に対し再帰的に:subを呼び出す
set EXIF=%~t1 環境変数EXIFにファイルの日付時刻%~t1を指定
%EXIF:~0,2% 環境変数EXIFの前から0文字目~0から2文字2取得

私はここ↑で日付時刻の形式を変更しているので,これ↓にすると変な名前になっちゃう。あと英語版OSでもまた違ったりと…。
set EXIF=%EXIF:~0,2%%EXIF:~3,2%%EXIF:~6,2%_%EXIF:~13,2%%EXIF:~16,2% 例:17/08/30 (水) 17:35->170830_1735
多分初期設定ならこれ↓であってるはず。
set EXIF=%EXIF:~2,2%%EXIF:~5,2%%EXIF:~8,2%_%EXIF:~11,2%%EXIF:~14,2% 例:2017/08/30 17:35 -> 170830_1735

if not exist %EXIF%%~x1 (
    ren %1 %EXIF%%~x1
)

例:カレントディレクトリに170830_1735.jpgがなかったら170830_1735.jpgにリネーム

else if exist %EXIF%%~x1 (
    set cnt=0
    :loop
    set /a cnt=cnt+1
    if not exist %EXIF%_%cnt%%~x1 (
        ren %1 %EXIF%_%cnt%%~x1
    ) else if exist %EXIF%_%cnt%%~x1 (
        goto :loop
    )
)

例:カレントディレクトリに170830_1735.jpgがあったら170830_1735_1.jpgにリネーム,170830_1735_1.jpgがあったら170830_1735_2.jpg
callで呼ばれたif文内の%~x1とかって補完されなかった()けどcallで呼ばずに組み込めば動いた

応用

先程のバッチをちょっと弄るだけで,ファイル名からリネームしたりも出来るよ!

2017-08-30 17-35-29 -> 170830_1735

@echo off
cd %1
for %%a in ( *.* ) do call :sub "%%a"
exit /b

:sub
set EXIF=%~n1
set EXIF=%EXIF:~2,2%%EXIF:~5,2%%EXIF:~8,2%_%EXIF:~11,2%%EXIF:~14,2%
if not exist %EXIF%%~x1 (
    ren %1 %EXIF%%~x1
) else if exist %EXIF%%~x1 (
    set cnt=0
    :loop
    set /a cnt=cnt+1
    if not exist %EXIF%_%cnt%%~x1 (
        ren %1 %EXIF%_%cnt%%~x1
    ) else if exist %EXIF%_%cnt%%~x1 (
        goto :loop
    )
)
exit /b

[改訂新版]Windowsコマンドプロンプトポケットリファレンス

[改訂新版]Windowsコマンドプロンプトポケットリファレンス

Copyright © 2016-2017 俺の外付けHDD All Rights Reserved.