チャッピーさんに書いてもらいました。最近Androidに変えたし、iCloudの容量追加サブスクを解約しようかな…と思ってきました。
はじめに
iOSやmacOS の「ボイスメモ」アプリ、便利ですが、録音が増えてくると iCloudやiPhoneストレージ容量を圧迫 してしまいます。
そこで、古い録音をMacOS内のFinderからGoogle Driveや外付けHDDにコピーしようとしても、ボイスメモアプリのファイルは、タイトルが保持されないという仕様。
20241120 123456.m4a
20241119 091234.m4a
これでは、どの録音が何の内容なのか、録音時間はどれくらいなのか、全く分かりません。
この記事では、この問題を解決する 録音日・タイトル・録音時間をファイル名へ自動付与するスクリプトを紹介します。
これにより、iCloud から解放しつつ、大量のボイスメモを効率的に整理・管理できるようになります。
こんなファイル名に変換できます
2025-11-20_会議メモ_15m30s.m4a
2025-11-19_アイデア_03m12s.m4a
2025-11-18_インタビュー_45m08s.m4a
できること:
- 録音日が一目で分かる
- タイトルで内容を識別できる
- 録音時間(分秒)で長さが分かる
- Finder での並び順が録音順に統一される
- 元ファイルは保持され、安全に処理できる
- Google Drive や外付けHDDに移行して iCloudやiPhoneストレージ容量を削減できる
動作環境:
- macOS 15 (Sequoia) 以降で動作確認済み
- それ以前のバージョンでも動作する可能性がありますが未検証
実践編:手順に従って実行
この章では、技術的な説明は省略し、手順だけを記載しています。
理解していなくても、このとおりに進めれば完了します。
ステップ1:ボイスメモデータをコピー
- Finder で「移動」メニューから `Option (⌥)` キーを押しながら「ライブラリ」を選択
- `Group Containers` → `group.com.apple.VoiceMemos.shared` → `Recordings` と進む
- `Recordings` フォルダをコピー
- デスクトップに `VoiceMemos_Work` フォルダを作成してペースト
重要: 元のデータは削除されません。
ステップ2:ターミナルを開く
ターミナルとは、Mac でコマンドを入力して操作するアプリです。
手順:
- Spotlight 検索を開く(`Command ⌘ + Space`)
- 「ターミナル」と入力
- 「ターミナル.app」をクリック
黒い(または白い)ウィンドウが開けば成功です。
ステップ3:スクリプトファイルを作成
手順:
- テキストエディットを開く(Spotlight で「テキストエディット」と検索)
- 新規ファイルを作成
- メニューから「フォーマット」→「標準テキストにする」を選択(重要!)
- 以下のスクリプトをすべてコピーしてテキストエディットに貼り付け
#!/bin/zsh
DB="$HOME/Desktop/VoiceMemos_Work/Recordings/CloudRecordings.db"
SRC_DIR="$HOME/Desktop/VoiceMemos_Work/Recordings"
OUT_DIR="$HOME/Desktop/VoiceMemos_Work/output"
mkdir -p "$OUT_DIR"
sqlite3 -separator "|" "$DB" '
SELECT
ZPATH,
ZCUSTOMLABEL,
ZENCRYPTEDTITLE,
CAST(ZDATE AS INTEGER) AS ZDATE
FROM ZCLOUDRECORDING;
' | while IFS="|" read -r ZPATH ZCUSTOMLABEL ZENCRYPTEDTITLE ZDATE; do
[ -z "$ZPATH" ] && continue
SRC_FILE="$SRC_DIR/$ZPATH"
[ ! -f "$SRC_FILE" ] && continue
EXT="${ZPATH##*.}"
# タイトル決定(ISO形式は除外)
RAW_TITLE="$ZENCRYPTEDTITLE"
[[ -z "$RAW_TITLE" ]] && RAW_TITLE="$ZCUSTOMLABEL"
if echo "$RAW_TITLE" | grep -Eq '^[0-9]{4}-[0-9]{2}-[0-9]{2}T'; then
SAFE_TITLE="Untitled"
else
SAFE_TITLE=$(printf "%s" "$RAW_TITLE" | tr '/:' '_' | tr -d '\n\r')
[ -z "$SAFE_TITLE" ] && SAFE_TITLE="Untitled"
fi
# 録音日
EPOCH=$((ZDATE + 978307200))
DATE=$(date -r "$EPOCH" +"%Y-%m-%d")
# 録音時間(duration)
DURATION_RAW=$(afinfo "$SRC_FILE" | awk '/estimated duration/ {print $3; exit}')
if [ -z "$DURATION_RAW" ]; then
DURATION_STR="00m00s"
else
SEC=$(printf "%.0f" "$DURATION_RAW")
DURATION_STR=$(printf "%02dm%02ds" $((SEC/60)) $((SEC%60)))
fi
NEW_NAME="${DATE}_${SAFE_TITLE}_${DURATION_STR}.${EXT}"
cp "$SRC_FILE" "$OUT_DIR/$NEW_NAME"
# 作成日/更新日を録音日時に書き換え
TOUCH_DATE=$(date -r "$EPOCH" +"%Y%m%d%H%M.%S")
touch -t "$TOUCH_DATE" "$OUT_DIR/$NEW_NAME"
done
- ファイルを保存:
- 保存場所:デスクトップの `VoiceMemos_Work` フォルダ
- ファイル名:`rename.sh`
- 「.txt を追加しない」にチェック(表示される場合)
ステップ4:スクリプトを実行
ターミナルに以下をコピー&ペーストして `Enter` を押してください:
cd ~/Desktop/VoiceMemos_Work && chmod +x rename.sh && ./rename.sh
copy
処理が始まります。ファイル数によっては数分かかる場合があります。
ステップ5:結果を確認
処理が完了すると、デスクトップの `VoiceMemos_Work/output` フォルダに、整理されたファイルが保存されています。
確認方法:
- デスクトップの `VoiceMemos_Work` フォルダを開く
- `output` フォルダを開く
- ファイル名が以下のように変わっているはずです:
2025-11-15_会議メモ_15m30s.m4a
2025-11-16_アイデア_03m12s.m4a
2025-11-18_インタビュー_45m08s.m4a
これで完了です!
整理されたファイルを Google Drive や外付けHDDに移動できます。
解説編:技術的な背景を理解する
ここからは、スクリプトの仕組みを理解したい方向けの解説です。
実行だけが目的の方は読む必要はありません。
処理の仕組み
データの取得元
このスクリプトは、ボイスメモアプリが内部で使用している SQLite データベースから情報を取得します。
CloudRecordings.db の主要カラム:
- `ZENCRYPTEDTITLE`:録音タイトル(ユーザーが設定したタイトル)
- `ZCUSTOMLABEL`:カスタムラベル(タイトルが未設定の場合の代替)
- `ZDATE`:録音日時(macOS 独自の epoch 形式)
- `ZPATH`:実際のファイルパス
処理の流れ
- データベースクエリ:SQLite から録音情報を取得
- タイトル処理:
- ISO 形式の日付(`2025-11-20T12:34:56`)は `Untitled` に置換
- ファイル名に使えない文字(`/`, `:`)をアンダースコアに変換
- 日時変換:macOS epoch(2001年1月1日基準)を Unix epoch に変換
- 録音時間取得:`afinfo` コマンドで M4A ファイルの実際の長さを取得
- ファイル生成:新しいファイル名でコピーを作成
- メタデータ更新:ファイルの作成日・更新日を録音日時に書き換え
技術的なポイント
macOS Epoch の変換
EPOCH=$((ZDATE + 978307200))
macOS の Core Data は 2001年1月1日 00:00:00 UTC を基準とする独自の epoch を使用しています。
Unix epoch(1970年1月1日)との差分は `978307200` 秒です。
この値を加算することで Unix timestamp に変換しています。
afinfo コマンド
afinfo "$SRC_FILE" | awk '/estimated duration/ {print $3; exit}'
`afinfo` は macOS 標準のオーディオファイル情報取得コマンドです。
`estimated duration` 行から録音時間(秒数)を抽出し、この値を分秒形式(`15m30s`)に変換しています。
ファイル名の安全化
SAFE_TITLE=$(printf "%s" "$RAW_TITLE" | tr '/:' '_' | tr -d '\n\r')
`/` と `:` はファイル名に使用できないため `_` に置換し、改行文字(`\n`, `\r`)を削除しています。
トラブルシューティング
データベースが見つからない
症状: スクリプトが動作しない、エラーが出る
解決策:
- ステップ1でボイスメモデータが正しくコピーされているか確認
- `VoiceMemos_Work/Recordings` フォルダ内に `CloudRecordings.db` ファイルがあるか確認
afinfo コマンドが見つからない
症状: `command not found: afinfo`
解決策:
`afinfo` は macOS 標準コマンドです。Xcode Command Line Tools がインストールされているか確認してください:
xcode-select --install
ファイルが出力されない
解決策:
- ボイスメモアプリでタイトルを設定しているか確認
- `Recordings` フォルダ内に `.m4a` ファイルがあるか確認
まとめ
このスクリプトを使うことで:
- 録音日・タイトル・録音時間で自動リネーム
- duration 付きで一覧性が大幅に向上
- Finder の並び順が録音順に統一
- 元ファイルを壊さず安全に処理
- ファイルのメタデータも録音日時に統一
大量のボイスメモを効率的に整理・アーカイブできます。
応用例
iCloud ストレージ管理
整理したファイルを Google Drive に移行し、ボイスメモアプリから古い録音を削除して iCloud 容量を削減
バックアップ
定期的に実行して整理済みアーカイブを作成
クラウド同期
整理したファイルを Dropbox や Google Drive に保存
検索性向上
タイトルと日付で簡単に目的の録音を見つけられる
ぜひお試しください!