#!/bin/bash
# ============================
# ルート権限チェック
# ============================
if [ "$EUID" -ne 0 ]; then
echo "エラー: root権限が必要です(実行キャンセル)"
echo "sudo ./$0 で実行してください"
exit 1
fi
# ============================
# カレントディレクトリ移動
# ============================
cd /tmp/TEST ; pwd
# ============================
# ユーザー入力を変数にセット
# ============================
echo "*** コピー対象の指定 ***"
read -p "1. 対象のパターン文字列 (例: xxx*): " DIR_PATTERN
read -p "2. 対象の年 (例: 2026): " YEAR
read -p "3. 対象の月 (例: 09): " MONTH
# ============================
# 空入力チェック
# ============================
if [ -z "$DIR_PATTERN" ] || [ -z "$YEAR" ] || [ -z "$MONTH" ]; then
echo "エラー: すべての項目を入力してください(処理中断)"
exit 1
fi
# ============================
# 月の入力形式の補正
# (例: "9" の場合 "09" に補正)
# ============================
if [[ ${#MONTH} -eq 1 ]]; then
MONTH="0${MONTH}"
fi
# ============================
# 月末日付の自動判定
# ============================
case "$MONTH" in
"01"|"03"|"05"|"07"|"08"|"10"|"12")
DAY_RANGE="3[0-1]"
;;
"04"|"06"|"09"|"11")
DAY_RANGE="30"
;;
"02")
# うるう年判定
if (( (YEAR % 4 == 0 && YEAR % 100 != 0) || YEAR % 400 == 0 )); then
DAY_RANGE="2[0-9]"
else
DAY_RANGE="2[0-8]"
fi
;;
*)
echo "エラー: 月の入力不正(01〜12以外は不正)"
exit 1
;;
esac
echo ""
echo "*** コピー処理(開始) ***"
echo "【検索元】カレントディレクトリ ( $(pwd) )"
echo "【ディレクトリ条件】./${DIR_PATTERN}"
echo "【対象日時】${YEAR}年${MONTH}月 (日最大範囲:${DAY_RANGE})"
echo "***************************"
# ============================
# カレントディレクトリ配下でループ
# (パターン文字列に一致する場合)
# ============================
find . -maxdepth 1 -type d -name "${DIR_PATTERN}" | while read -r src_dir; do
# ディレクトリ名のみ抽出
dir_name=$(basename "$src_dir")
dest_dir="/tmp/$dir_name"
echo "(コピー中): $src_dir -> $dest_dir"
# ============================
# コピー先のディレクトリ作成(既存はスキップ)
mkdir -p "$dest_dir"
# ============================
# 対象ファイルのコピー実行(1万件以上でも可)
find "$src_dir" -maxdepth 1 -type f -regextype posix-egrep \
-regex ".*/[^/]*_${YEAR}-?(${MONTH}-?(0[1-9]|[1-2][0-9]|${DAY_RANGE}))_[^/]*" \
-exec cp -a -t "$dest_dir" {} +
done
echo "*** コピー処理(完了) ***"
PR