Macでカメラ写真・動画ファイルの日付別フォルダ自動振り分け整理術

ぐーたらは、ミラーレス一眼カメラやアクションカメラの写真や動画データを日付順に整理しておきたいんです。
基本的にどちらのデータも、NASに保存しているのですが、
写真データは同時にクラウドに保存しているから良いものの、
動画データはあとから、あの時の旅行の動画を作ろう・テーマに沿った動画を作ろう などと考えた時に、日付順に仕分けされていることが非常に重要です。

この記事で紹介しているように、最近までは無理矢理SONY謹製のPlayMemories Homeを使って、日付順にNASにインポートしていました。

ぐーたらガジェット備忘録

SONY謹製のPlayMemories Homeが、macOS Catalina・Big Surでは使えなくなったことで…

ただ、せっかくSDカードスロット付きのM1 Max MacBook Proを導入したというのに、この記事で紹介している方法だとSDカードを認識してくれない。ちなみに、ドッキングステーション経由であれば認識してくれるのですが、これもWindows11になってから不安定。。

というところで、最近は手動でSDカードからデータを取り出して、NAS内に日付フォルダを作成して、ファイルをコピーして・・・というかなり面倒くさい方法でデータを取り込んでいる日々。

しかし、ついに念願の「日付ごと自動振りわけ」を実現し、かつ、使用機種にも枝分かれする形を実現できました。
今回は、AppleScriptやアプリを使用してた方法を備忘したいと思います。

カメラの画像・動画データ、フォルダ振り分け整理の目指したい形

PlayMemories Homeでは、YYYY-MM-DD(例:2022-10-05)の形で、1階層の振り分け整理でした。
これはこれで良いのですが、実はしばらくすると少し不満が出てくることに。

この命名形式だと、データを撮り溜めていると1階層に全時系列が並ぶので、最新のデータ(フォルダ)にたどり着くまでに、Finderでスゴくしたまでスクロールしなくてはいけません。
もちろん、手動で/2020/、/2021/などとフォルダを作って、該当するフォルダを移動すれば良いのですが、それはそれで面倒だしスマートじゃない。

ということで、新たな理想の整理の形として、
2022
├10
├05
├A1
├GoPro
├DJI ACTION 2
のようなフォルダ構造で、それぞれ機種名のフォルダ内に該当ファイルが入っていく形を目指すことにしました。

AppleScriptでファイルの作成日時情報で振り分ける

このように考えましたが、ぐーたらはスクリプトを書けません!
さて、どうしたものかと、ググってみると、同じように考えておられる方がいた!!

レ点腫瘍学ノート

Macの''スクリプトエディタ.app''を使って、デジカメで撮影した写真ファイルなどを半自動で日付毎のフォルダに分類し…

こちらのスクリプトは、[YYYY-MM-DD] とPlayMemories Homeと同じ1階層式。
Finderの整理したいフォルダを開いた状態で、このスクリプトを実行する というもの。

と思ったら、その下に別の方が作成されたと思われる派生版の別のスクリプトが。
しかも、[YYYY/MM/YYYY_MM_DD]と、ぐーたらが理想としている形に近い!

Yahoo!知恵袋

macで日付別フォルダを作成して写真取り込みができるアプリは? MacにiPhoneやデジカメから写真を取り込んで管理す…

こちらのスクリプトを参考に、ぐーたらなりのカスタマイズを加えていきます。

–ファイルを作成日ごとに振り分け(年/月/日付)
tell application “Finder”
set aFol to (insertion location) as alias
if (aFol as string) does not end with “Desktop:” then — デスクトップにあるファイルは処理しない
tell folder aFol

set aList to every file as alias list

repeat with i in aList
set aFile to contents of i
set posixAFile to POSIX path of aFile — POSIX pathに変換
set creationDate to creation date of aFile — 作成日を取得
set aYear to year of creationDate — 年を取得
set aMonth to month of creationDate as number — 月を取得
set aDay to day of creationDate — 日を取得
if aMonth < 10 then set aMonth to “0” & aMonth — 10月以前なら0を付ける
if aDay < 10 then set aDay to “0” & aDay — 10日以前なら0を付ける

if not (exists folder (aYear as text)) then ¬
make new folder at aFol with properties {name:aYear} — 年のフォルダを作成

tell application “Finder”
set yearFolder to (aFol & aYear as text) as alias — 年のフォルダのエイリアス
tell folder yearFolder
if not (exists folder (aMonth as text)) then
make new folder at yearFolder with properties {name:aMonth} — 月のフォルダを作成
end if
end tell

set monthFolder to (yearFolder & aMonth as text) as alias — 月のフォルダのエイリアス
set thisFolder to aYear & “_” & aMonth & “_” & aDay as text — 年月日のフォルダ名
tell folder monthFolder
if not (exists folder thisFolder) then
make new folder at monthFolder with properties {name:thisFolder} — 年月日のフォルダを作成
end if
end tell
end tell
set bFol to POSIX path of ((aFol & aYear & “:” & aMonth & “:” & thisFolder as text) as alias) — 移動先のフォルダのパス
do shell script “mv ” & quoted form of posixAFile & ” ” & quoted form of bFol — 移動
end repeat

end tell
end if
end tell

ただし、参考にさせていただいたブログに記載がありますが、設定の間違いや環境の差異による挙動の違いなどで、万が一、ファイル消失などが生じても責任は負いかねますので、バックアップを取るなどして、注意して実行ください。

日(DAY)の表示変更と使用機種フォルダの追加

このままのだと、日付(DAY)部分が、YYYY_MM_DD となってしまうので、

set thisFolder to aYear & “_” & aMonth & “_” & aDay as text — 年月日のフォルダ名

set dayFolder to (monthFolder & aDay as text) as alias — 日のフォルダのエイリアス

と変更します。

また、さらに使用機種のフォルダを内包させたいので、

set cName to “(機種名)” as text — カメラ機種名を取得

を追加し、
さらに、いろいろ塩梅良く構成されるようにしたのが、下のスクリプト。

–ファイルを作成日ごとに振り分け(年/月/日/カメラ機種名)
tell application “Finder”
set aFol to (insertion location) as alias
if (aFol as string) does not end with “Desktop:” then — デスクトップにあるファイルは処理しない
tell folder aFolset aList to every file as alias listrepeat with i in aList
set aFile to contents of i
set posixAFile to POSIX path of aFile — POSIX pathに変換
set creationDate to creation date of aFile — 作成日を取得
set aYear to year of creationDate — 年を取得
set aMonth to month of creationDate as number — 月を取得
set aDay to day of creationDate — 日を取得
set cName to “カメラ機種名” as text — カメラ機種名を取得
if aMonth < 10 then set aMonth to “0” & aMonth — 10月以前なら0を付ける
if aDay < 10 then set aDay to “0” & aDay — 10日以前なら0を付けるif not (exists folder (aYear as text)) then ¬
make new folder at aFol with properties {name:aYear} — 年のフォルダを作成tell application “Finder”
set yearFolder to (aFol & aYear as text) as alias — 年のフォルダのエイリアス
tell folder yearFolder
if not (exists folder (aMonth as text)) then
make new folder at yearFolder with properties {name:aMonth} — 月のフォルダを作成
end if
end tellset monthFolder to (yearFolder & aMonth as text) as alias — 月のフォルダのエイリアス
set thisFolder to aDay as text — 日のフォルダ名
tell folder monthFolder
if not (exists folder thisFolder) then
make new folder at monthFolder with properties {name:aDay} — 日のフォルダを作成
end if
end tellset dayFolder to (monthFolder & aDay as text) as alias — 日のフォルダのエイリアス
set thisFolder to cName as text — カメラ機種名
tell folder dayFolder
if not (exists folder thisFolder) then
make new folder at dayFolder with properties {name:thisFolder} — カメラ機種名のフォルダを作成
end if
end tellend tell
set bFol to POSIX path of ((aFol & aYear & “:” & aMonth & “:” & aDay & “:” & thisFolder as text) as alias) — 移動先のフォルダのパス
do shell script “mv ” & quoted form of posixAFile & ” ” & quoted form of bFol — 移動
end repeatend tell
end if
end tell

Automatorでワークフロー化

スクリプトはできましたが、これではSDカードからデータを取り出すたびに、このスクリプトファイルを開いて実行する必要があります。
それも非常に大変なので、Automatorでワークフロー化し、後述するアプリで、特定のフォルダにファイルが入ったらスクリプトが動作するようにします。

Automatorで新規書類を作成。
「ワークフロー」を選びます。

「AppleScriptを実行」を右のエリアにドラッグ&ドロップ

そして、元々記述されている内容をすべて消去し、先程のスクリプトをそのままコピーします。
試しに、テストで整理したいフォルダを開いておき、実行してみるとその動作に感動します。
「整理したいフォルダを開いておき」が大事です!誤ると意図しないフォルダが整理されてしまいます。
が、このあたりの対処策は後述します。

正常にスクリプトが動作したら、ワークフローファイルを保存します。
ここでは、α1で撮影したファイルを保存したいので、機種名には「A1」とし、ワークフローファイル名は、「sorting_A1.workflow」とします。

ファイルをルールに基づき自動整理してくれるHazel

過去にも紹介したHazelを使って、自動整理を進めていきます。
Hazelって何?という方は、こちらの記事をご覧ください。

ファイルを自動整理・自動削除・自動振り分けしてくれるmacOSアプリ「Hazel」

監視するフォルダとルールを決める

まず、整理したいフォルダを決めます。
ぐーたらは、NAS内の[FOOTAGE]フォルダとしました。
決定したら、Hazelの左カラム「Folders」にドラッグ&ドロップすると、監視フォルダをして登録されます。

続いて、ルールを作成します。
ここでは、
ファイル名 が A1_ で始まる
拡張子 が MP4
のファイル

に対して、

Finderで表示
さらに「Options」をクリックして、「Finderのウィンドウを前面に持ってくる」チェックを入れます。
これをしておかないと、今回のスクリプトの特性である「整理したいフォルダを開いて」が、意図しない形で動作してしまう(例えば、別のフォルダが整理される)ことを防ぐために、ワンクッションのアクションを入れます。

そして、先程のワークフローが動作するように、
Run Automator workflow : sorting_A1.workflow
とします。

ファイルが日付ごと機種ごとに自動整理された!!

実際に、自動整理された挙動です。
見事に、2022/10/05/A1 フォルダにデータが移動されました!

さらに、DJI ACTION 2で撮影したファイルも
2022/10/05/DJI ACTION 2 フォルダに入れたいので、
先程のワークフローファイルを複製して、機種名に「DJI ACTION 2」と入力して保存。
Hazelのルールを追加します。

すると、A1フォルダと同じ階層に、DJI ACTION 2のフォルダが作成され、そこにファイルが移動されました。

注意!別機種のファイルを一度に入れないこと

上記の例では、α1とDJI ACTION 2、それぞれで撮影したデータを、別のフォルダに入れる形にしていました。
ただ、別々の機種で撮影したファイルを同時に入れてしまうと、どちらかのフォルダにまとめて移動されてしまいます。

これは、Hazelのルールとスクリプトに依るものです。

上の例では、
Hazelのルールは、
ファイル名が、A1_ なら sorting_A1.workflow を作動させる
ファイル名が、DJI_ なら sorting_DJI ACTION 2.workflow を作動させる
です。

ただ、スクリプト側には、ファイル名を識別するコードは入っていないので、あくまで該当フォルダのファイルを全て対象としてしまいます。
したがって、紺藍フォルダに入れたファイルの中には、ファイル名がA1_で始まるファイルがあったので、先に「A1_MOVIE」のルールが作動し、
A1フォルダに、全てのファイルが移動してしまったわけです。

ですので、複数機種で分けたい場合は、機種のデータごとに分ける形にしなくてはいけません。
といっても、SDカードからデータを取り出す時には、基本的には、1つのSDカードに1つの機種のデータ なので、このようなケースが少ないことが予想されます。

応用編:より複雑なルールを作成して、もっと楽にファイルを整理する

ここまでで、単純にファイルを日付ごとに整理する 目的は果たすことができました!
感無量!

しかし、実はこの方法は基本を押さえただけで、現実問題はもっと複雑なのです。。

例えば、

  • α1で撮影したSDカーダーにはXMLデータも入っていて、それはいらないけど、MP4ファイルだけ選ぶのは面倒
  • 写真ファイルは、また別の場所に振り分け整理しておきたい
  • DJI製品は、ACTION 2とAIR 2Sのデータがあるけれど、どちらもファイル名が、DJI_XXXX.MP4だから、どちらのファイルか判別できない
  • 今回のスクリプトは、直近にアクティブだったFinderのフォルダが対象だけど、特定のフォルダを監視対象にしたい

などなど。
このあたりの問題を解消していきます。

(つづきは近日追記いたします)

ファイルを自動整理・自動削除・自動振り分けしてくれるmacOSアプリ「Hazel」

GoPro動画を取込時 タイムスタンプ(時間)がずれるのを修正したい

クラウド写真整理術!自動的保存・バックアップで子供の思い出写真をなくさない!