連番複製_v001_1.sh

「ダウンロード」ボタンを押してダウンロードしてください。
ファイル名の「.txt」を「.sh」に変更して実行してください。
詳しい手順については以下をご覧ください。
スクリプトの使い方

#!/bin/bash
#連番複製_v001_1.sh
#■実行方法
#① 始めて実行する場合は「実行権限」が必要です。
#②「情報を見る」から「このアプリケーションで開く」項目で「ターミナル」を設定してください。
#不明点がある場合は以下にお問い合わせください!
#このスクリプトの制作者:西尾朱志
#連絡先メール:syushi2@gmail.com
#連絡先電話番号:080-5892-2893
#その他のスクリプトは「https://しゅし.com/scripts」でご覧いただけます。

# 実行確認のダイアログを表示
confirm=$(osascript -e 'tell application "System Events" to display dialog "コピー元のファイルを選択してください" buttons {"はい", "いいえ"} default button "はい" cancel button "いいえ"')

# ユーザーが「いいえ」を選択した場合はスクリプトを終了
if [ "$confirm" = "" ]; then
    osascript -e 'display dialog "キャンセルされました" buttons {"OK"} default button 1'
    exit 0
fi

# ファイル選択ダイアログを表示し、選択されたファイルのパスを取得
source_file=$(osascript -e 'POSIX path of (choose file with prompt "コピー元のファイルを選択してください")')

# ファイルの親ディレクトリを取得
source_dir=$(dirname "$source_file")

# ファイル名と拡張子を取得
filename=$(basename "$source_file")
extension="${filename##*.}"
basename="${filename%.*}"

# ファイル名から正規表現でパターンを抽出
# 例: "cat_t_001_lo.png" -> prefix="cat_t_", number="001", suffix="_lo"
if [[ "$basename" =~ (.*[^0-9])([0-9]+)([^0-9].*)?$ ]]; then
    prefix="${BASH_REMATCH[1]}"
    number="${BASH_REMATCH[2]}"
    suffix="${BASH_REMATCH[3]}"
else
    # ファイル名がパターンに一致しない場合のデフォルト値
    prefix=""
    number="001"
    suffix=""
fi

# numberから桁数を取得
digits=${#number}

# numberを数値として扱い、次の連番を計算
start_num=$((10#$number + 1))

# ダイアログを表示して、連番より前の名前を入力(デフォルトは抽出されたprefix)
prefix=$(osascript -e "text returned of (display dialog \"連番より前の名前を入力してください\" & return & \"例:「prj_cat_」\" default answer \"$prefix\")")

# ダイアログを表示して、連番の桁数を入力(デフォルトは抽出された桁数)
digits=$(osascript -e "text returned of (display dialog \"連番の「桁数」を半角数字で入力してください\" default answer \"$digits\")")

# ダイアログを表示して、連番の最初の番号を入力(デフォルトは次の連番)
start_num=$(osascript -e "text returned of (display dialog \"連番の「最初の番号」を半角数字で入力してください\" default answer \"$start_num\")")

# ダイアログを表示して、連番の最後の番号を入力(最初の連番より大きい値を入力するまで繰り返し)
end_num=$(osascript -e 'tell application "System Events" to display dialog "連番の「最後の番号」を半角数字で入力してください" default answer ""' -e 'text returned of result')

while [[ "$end_num" -le "$start_num" ]]; do
    end_num=$(osascript -e 'tell application "System Events" to display dialog "値は開始番号より大きくしてください" & return & "(開始番号: '"$start_num"')" default answer ""' -e 'text returned of result')
    
    # ユーザーが「いいえ」を選択した場合はスクリプトを終了
    if [ "$end_num" = "" ]; then
        osascript -e 'display dialog "キャンセルされました" buttons {"OK"} default button 1'
        exit 0
    fi
done

# ダイアログを表示して、連番より後の名前を入力(デフォルトは抽出されたsuffix)
suffix=$(osascript -e "text returned of (display dialog \"連番より後の名前を入力してください\" & return & \"例:「_lo」\" default answer \"$suffix\")")

# 親フォルダの一つ上のディレクトリを取得
parent_dir=$(dirname "$source_dir")

# 連番の範囲でループ
for ((i=start_num; i<=end_num; i++)); do
    # ゼロパディングされた連番を作成
    padded_num=$(printf "%0${digits}d" "$i")

    # 新しいファイル名とフォルダ名を作成
    new_name="${prefix}${padded_num}${suffix}.${extension}"
    new_dir="${parent_dir}/${prefix}${padded_num}${suffix}"
    
    # フォルダを作成
    mkdir -p "$new_dir"
    
    # コピー先ファイルが存在しない場合にコピー
    if [ ! -f "${new_dir}/${new_name}" ]; then
        cp "$source_file" "${new_dir}/${new_name}"
    else
        echo "ファイル ${new_dir}/${new_name} が既に存在するためスキップします。"
    fi
done

# 全て完了したことを示すダイアログを表示
osascript -e 'display dialog "全て完了しました。「ターミナル」は手動で閉じてください。" buttons {"OK"} default button 1'