見出し画像

Insta360 Go3用 クイックリーダー入手&SDカードにコピーした時にファイル作成日がずれる問題を解決する方法

クイックリーダーをゲット


7月初めにInsta360 GO3sを購入しました。
内臓メモリは128GBと大きい方を選んだのですが、それでも4Kを多用すると1日でストレージがなくなってしまいます。バッテリーに加えてストレージも死活問題になると予想はついていたので、当初からクイックリーダーを購入しようと考えていたのですが、在庫切れで本体のみ購入していました。

この度(7/25日現在)、公式ストアと楽天市場で在庫が復活していたので購入しました。

楽天の方は送料がかからないのでおすすめです。
(どちらもアフィリンクではありません。)

ファイルコピー時にファイル変更日がずれる問題

これはクイックリーダーと本体だけで、microSDにファイルをコピーする際に起こる不具合です。
ずれるというよりはファイルをコピーした日がファイルの作成日・更新日になってしまいます。
海外のYouTubeのレビューでその問題を説明している動画があります。

この動画では、外出先でどうしてもストレージを確保したいとき以外、microSDへのコピー機能は使わない方が良いでしょう。みたいなことが言われていました(多分)。

しかしながら背に腹は変えられないのでmicroSDへのコピーもしたい….
ということで、その対策を考えました。

ファイル名が撮影日時だから、それを使ってメタデータを書き換えればいいのでは

とりあえず書く時間がないのでコードだけ貼り付けておきます。
全てChatGPTに作ってもらったものです。
Mac用のコードです。実行可能にする手順も併せて貼り付けています。

#!/bin/bash

# チェック:引数が一つ渡されたかどうか
if [ "$#" -ne 1 ]; then
    echo "使用法: $0 <フォルダパス>"
    exit 1
fi

# ターゲットフォルダ
TARGET_DIR="$1"

# サポートされているファイル形式
FILE_PATTERNS=("*.jpg" "*.dng" "*.lrv" "*.mp4")

# ファイルの処理
for PATTERN in "${FILE_PATTERNS[@]}"; do
    for FILE in "$TARGET_DIR"/$PATTERN; do
        # ファイルが存在するかどうかを確認
        if [ ! -e "$FILE" ]; then
            continue
        fi
        
        # ファイル名から日時を抽出
        BASENAME=$(basename "$FILE")
        echo "Processing: $BASENAME"  # デバッグメッセージ

        if [[ "$BASENAME" =~ ^IMG_([0-9]{8})_([0-9]{6}) ]]; then
            DATE="${BASH_REMATCH[1]}"
            TIME="${BASH_REMATCH[2]}"
        elif [[ "$BASENAME" =~ ^LRV_([0-9]{8})_([0-9]{6}) ]]; then
            DATE="${BASH_REMATCH[1]}"
            TIME="${BASH_REMATCH[2]}"
        elif [[ "$BASENAME" =~ ^PRO_LRV_([0-9]{8})_([0-9]{6}) ]]; then
            DATE="${BASH_REMATCH[1]}"
            TIME="${BASH_REMATCH[2]}"
        elif [[ "$BASENAME" =~ ^VID_([0-9]{8})_([0-9]{6}) ]]; then
            DATE="${BASH_REMATCH[1]}"
            TIME="${BASH_REMATCH[2]}"
        elif [[ "$BASENAME" =~ ^PRO_VID_([0-9]{8})_([0-9]{6}) ]]; then
            DATE="${BASH_REMATCH[1]}"
            TIME="${BASH_REMATCH[2]}"
        else
            echo "Skipped: $FILE (no valid date in filename)"
            continue
        fi

        DATE="${DATE:0:4}-${DATE:4:2}-${DATE:6:2}"
        TIME="${TIME:0:2}:${TIME:2:2}:${TIME:4:2}"
        DATETIME="$DATE $TIME"
        
        # EXIFデータを更新
        if [[ "$FILE" == *.jpg ]] || [[ "$FILE" == *.dng ]]; then
            echo "Updating EXIF data for: $FILE to $DATETIME"  # デバッグメッセージ
            exiftool -overwrite_original -AllDates="$DATETIME" "$FILE"
            if [ $? -ne 0 ]; then
                echo "Error: Failed to update EXIF data for $FILE"
            fi
        fi
        
        # touchコマンドの形式: [[CC]YY]MMDDhhmm
        FORMATTED_DATE="${DATE//-/}${TIME//:/}"
        FORMATTED_DATE="${FORMATTED_DATE:0:12}"  # 秒を省略
        echo "Formatted Date: $FORMATTED_DATE"  # デバッグメッセージ
        
        # ファイルの作成日と更新日を更新
        touch -t "$FORMATTED_DATE" "$FILE" 2>&1
        if [ $? -eq 0 ]; then
            echo "Updated: $FILE to $DATETIME"
        else
            echo "Error: Failed to update file dates for $FILE"
            echo "Command: touch -t \"$FORMATTED_DATE\" \"$FILE\""
            touch -t "$FORMATTED_DATE" "$FILE" 2>&1  # 詳細なエラーメッセージを表示
        fi
    done
done


ご覧いただきありがとうございます。まだ記事は少ないですが、サポート頂けましたらこれからの発信に役立てます。