automation-script-generator

Automation Script Generator Skill

Safety Notice

This listing is imported from skills.sh public index metadata. Review upstream SKILL.md and repository scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "automation-script-generator" with this command: npx skills add ntaksh42/agents/ntaksh42-agents-automation-script-generator

Automation Script Generator Skill

繰り返し作業を自動化するスクリプトを生成するスキルです。

概要

このスキルは、日常的な繰り返し作業を自動化するスクリプトを生成します。ファイル操作、データ処理、API連携、バックアップ、監視、レポート生成など、あらゆる定型作業を効率化します。複数のスクリプト言語に対応し、エラーハンドリング、ログ出力、スケジュール実行にも対応します。

主な機能

  • マルチ言語対応: Bash, Python, PowerShell, Node.js, Ruby

  • ファイル操作: 一括リネーム、コピー、移動、圧縮、削除

  • データ処理: CSV/JSON変換、フィルタリング、集計、マージ

  • API連携: REST API呼び出し、認証、エラーハンドリング

  • バックアップ自動化: ファイル、DB、クラウドストレージ

  • 監視・アラート: リソース監視、ヘルスチェック、通知

  • レポート生成: ログ分析、メトリクス集計、HTML/PDFレポート

  • CI/CDスクリプト: ビルド、テスト、デプロイの自動化

  • スケジュール実行: cron, タスクスケジューラ設定

  • エラーハンドリング: 堅牢なエラー処理とリトライ機能

スクリプトタイプ

  1. ファイル操作

一括リネーム(Bash)

#!/bin/bash

画像ファイルを日付順にリネーム

使用例: ./rename_images.sh /path/to/images

set -euo pipefail

SOURCE_DIR="${1:-.}" PREFIX="photo" EXTENSION="jpg"

カウンター初期化

counter=1

ファイルを更新日時順でソート

find "$SOURCE_DIR" -type f -name "*.$EXTENSION" -print0 |
sort -z |
while IFS= read -r -d '' file; do # 新しいファイル名を生成(ゼロパディング) new_name=$(printf "%s_%04d.%s" "$PREFIX" "$counter" "$EXTENSION") new_path="$SOURCE_DIR/$new_name"

# リネーム実行
if [ "$file" != "$new_path" ]; then
  mv -v "$file" "$new_path"
  echo "Renamed: $(basename "$file") -> $new_name"
fi

((counter++))

done

echo "✓ リネーム完了: $((counter - 1)) ファイル"

ファイル整理(Python)

#!/usr/bin/env python3 """ ダウンロードフォルダを拡張子別に整理 使用例: python organize_files.py ~/Downloads """

import os import shutil from pathlib import Path from datetime import datetime import logging

ログ設定

logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s' )

拡張子とフォルダのマッピング

EXTENSION_MAPPING = { 'Images': ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.svg'], 'Documents': ['.pdf', '.doc', '.docx', '.txt', '.xlsx', '.pptx'], 'Videos': ['.mp4', '.avi', '.mov', '.mkv', '.flv'], 'Audio': ['.mp3', '.wav', '.flac', '.m4a'], 'Archives': ['.zip', '.rar', '.7z', '.tar', '.gz'], 'Code': ['.py', '.js', '.java', '.cpp', '.html', '.css'], }

def organize_files(source_dir: str, dry_run: bool = False): """ファイルを拡張子別に整理""" source_path = Path(source_dir)

if not source_path.exists():
    logging.error(f"ディレクトリが存在しません: {source_dir}")
    return

files_moved = 0

for file_path in source_path.iterdir():
    # ディレクトリはスキップ
    if file_path.is_dir():
        continue

    # 拡張子を取得
    extension = file_path.suffix.lower()

    # 対応するフォルダを特定
    target_folder = None
    for folder, extensions in EXTENSION_MAPPING.items():
        if extension in extensions:
            target_folder = folder
            break

    # マッピングにない拡張子は "Others" に
    if target_folder is None:
        target_folder = "Others"

    # 移動先ディレクトリを作成
    dest_dir = source_path / target_folder
    if not dry_run:
        dest_dir.mkdir(exist_ok=True)

    # ファイルを移動
    dest_path = dest_dir / file_path.name

    # 同名ファイルが存在する場合、タイムスタンプを追加
    if dest_path.exists():
        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
        stem = dest_path.stem
        suffix = dest_path.suffix
        dest_path = dest_dir / f"{stem}_{timestamp}{suffix}"

    if dry_run:
        logging.info(f"[DRY RUN] {file_path.name} -> {target_folder}/")
    else:
        shutil.move(str(file_path), str(dest_path))
        logging.info(f"移動: {file_path.name} -> {target_folder}/")

    files_moved += 1

logging.info(f"✓ 完了: {files_moved} ファイルを整理しました")

if name == "main": import sys

if len(sys.argv) < 2:
    print("使用法: python organize_files.py <ディレクトリパス> [--dry-run]")
    sys.exit(1)

source_dir = sys.argv[1]
dry_run = "--dry-run" in sys.argv

organize_files(source_dir, dry_run)

2. データ処理

CSV to JSON変換(Node.js)

#!/usr/bin/env node /**

  • CSVファイルをJSONに変換
  • 使用例: node csv_to_json.js input.csv output.json */

const fs = require('fs'); const csv = require('csv-parser');

function csvToJson(inputFile, outputFile) { const results = [];

fs.createReadStream(inputFile) .pipe(csv()) .on('data', (data) => results.push(data)) .on('end', () => { // JSONファイルに書き込み fs.writeFileSync( outputFile, JSON.stringify(results, null, 2), 'utf-8' );

  console.log(`✓ 変換完了: ${results.length} レコード`);
  console.log(`出力: ${outputFile}`);
})
.on('error', (error) => {
  console.error('エラー:', error.message);
  process.exit(1);
});

}

// コマンドライン引数 const [inputFile, outputFile] = process.argv.slice(2);

if (!inputFile || !outputFile) { console.error('使用法: node csv_to_json.js <input.csv> <output.json>'); process.exit(1); }

csvToJson(inputFile, outputFile);

データ集計(Python)

#!/usr/bin/env python3 """ ログファイルから統計情報を集計 使用例: python analyze_logs.py access.log """

import re from collections import Counter, defaultdict from datetime import datetime import json

def analyze_access_log(log_file: str): """アクセスログを分析"""

# Apache/Nginx形式のログパターン
log_pattern = re.compile(
    r'(?P&#x3C;ip>[\d.]+) - - \[(?P&#x3C;datetime>[^\]]+)\] '
    r'"(?P&#x3C;method>\w+) (?P&#x3C;path>[^\s]+) HTTP/[\d.]+" '
    r'(?P&#x3C;status>\d+) (?P&#x3C;size>\d+)'
)

stats = {
    'total_requests': 0,
    'status_codes': Counter(),
    'methods': Counter(),
    'paths': Counter(),
    'ips': Counter(),
    'hourly_distribution': defaultdict(int),
}

with open(log_file, 'r') as f:
    for line in f:
        match = log_pattern.match(line)
        if not match:
            continue

        data = match.groupdict()

        stats['total_requests'] += 1
        stats['status_codes'][data['status']] += 1
        stats['methods'][data['method']] += 1
        stats['paths'][data['path']] += 1
        stats['ips'][data['ip']] += 1

        # 時間帯別の集計
        try:
            dt = datetime.strptime(data['datetime'], '%d/%b/%Y:%H:%M:%S %z')
            hour = dt.hour
            stats['hourly_distribution'][hour] += 1
        except ValueError:
            pass

# レポート生成
print("=" * 60)
print("アクセスログ分析レポート")
print("=" * 60)
print(f"\n総リクエスト数: {stats['total_requests']:,}")

print("\n--- ステータスコード別 ---")
for status, count in stats['status_codes'].most_common():
    print(f"{status}: {count:,}")

print("\n--- HTTPメソッド別 ---")
for method, count in stats['methods'].most_common():
    print(f"{method}: {count:,}")

print("\n--- トップ10 パス ---")
for path, count in stats['paths'].most_common(10):
    print(f"{count:,} - {path}")

print("\n--- トップ10 IPアドレス ---")
for ip, count in stats['ips'].most_common(10):
    print(f"{count:,} - {ip}")

print("\n--- 時間帯別分布 ---")
for hour in range(24):
    count = stats['hourly_distribution'][hour]
    bar = '█' * (count // 100)
    print(f"{hour:02d}:00 | {bar} {count:,}")

# JSON出力
output_file = log_file.replace('.log', '_stats.json')
with open(output_file, 'w') as f:
    # Counterをdictに変換
    stats_dict = {
        'total_requests': stats['total_requests'],
        'status_codes': dict(stats['status_codes']),
        'methods': dict(stats['methods']),
        'top_paths': dict(stats['paths'].most_common(20)),
        'top_ips': dict(stats['ips'].most_common(20)),
        'hourly_distribution': dict(stats['hourly_distribution']),
    }
    json.dump(stats_dict, f, indent=2)

print(f"\n✓ 詳細統計を保存: {output_file}")

if name == "main": import sys

if len(sys.argv) &#x3C; 2:
    print("使用法: python analyze_logs.py &#x3C;log_file>")
    sys.exit(1)

analyze_access_log(sys.argv[1])

3. API連携

REST API自動化(Python)

#!/usr/bin/env python3 """ GitHub API経由でリポジトリ情報を取得 使用例: python github_stats.py <username> 環境変数: GITHUB_TOKEN """

import os import requests from datetime import datetime import json

GITHUB_API_BASE = "https://api.github.com"

def get_user_repos(username: str, token: str = None): """ユーザーのリポジトリ一覧を取得"""

headers = {}
if token:
    headers['Authorization'] = f'token {token}'

url = f"{GITHUB_API_BASE}/users/{username}/repos"
params = {'per_page': 100, 'sort': 'updated'}

try:
    response = requests.get(url, headers=headers, params=params)
    response.raise_for_status()
    return response.json()
except requests.exceptions.RequestException as e:
    print(f"エラー: {e}")
    return []

def generate_report(username: str, repos: list): """レポート生成"""

if not repos:
    print("リポジトリが見つかりませんでした")
    return

# 統計計算
total_stars = sum(repo['stargazers_count'] for repo in repos)
total_forks = sum(repo['forks_count'] for repo in repos)
languages = {}

for repo in repos:
    lang = repo.get('language')
    if lang:
        languages[lang] = languages.get(lang, 0) + 1

# レポート出力
print("=" * 60)
print(f"GitHub リポジトリ統計: {username}")
print("=" * 60)
print(f"\n総リポジトリ数: {len(repos)}")
print(f"総スター数: {total_stars:,}")
print(f"総フォーク数: {total_forks:,}")

print("\n--- 使用言語 ---")
for lang, count in sorted(languages.items(), key=lambda x: x[1], reverse=True):
    print(f"{lang}: {count}")

print("\n--- トップ10 スター数 ---")
top_repos = sorted(repos, key=lambda x: x['stargazers_count'], reverse=True)[:10]
for repo in top_repos:
    print(f"{repo['stargazers_count']:,} ⭐ - {repo['name']}")
    print(f"  {repo['html_url']}")

# JSON出力
output_file = f"{username}_github_stats.json"
with open(output_file, 'w') as f:
    json.dump({
        'username': username,
        'total_repos': len(repos),
        'total_stars': total_stars,
        'total_forks': total_forks,
        'languages': languages,
        'top_repos': [
            {
                'name': repo['name'],
                'stars': repo['stargazers_count'],
                'forks': repo['forks_count'],
                'language': repo.get('language'),
                'url': repo['html_url'],
            }
            for repo in top_repos
        ],
        'generated_at': datetime.now().isoformat(),
    }, f, indent=2)

print(f"\n✓ レポートを保存: {output_file}")

if name == "main": import sys

if len(sys.argv) &#x3C; 2:
    print("使用法: python github_stats.py &#x3C;username>")
    sys.exit(1)

username = sys.argv[1]
token = os.environ.get('GITHUB_TOKEN')

repos = get_user_repos(username, token)
generate_report(username, repos)

4. バックアップ自動化

データベースバックアップ(Bash)

#!/bin/bash

PostgreSQLデータベースの自動バックアップ

使用例: ./backup_postgres.sh

set -euo pipefail

設定

DB_NAME="mydb" DB_USER="postgres" BACKUP_DIR="/var/backups/postgres" RETENTION_DAYS=7

タイムスタンプ

TIMESTAMP=$(date +%Y%m%d_%H%M%S) BACKUP_FILE="$BACKUP_DIR/${DB_NAME}_${TIMESTAMP}.sql.gz"

ログ関数

log() { echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1" }

バックアップディレクトリ作成

mkdir -p "$BACKUP_DIR"

バックアップ実行

log "バックアップ開始: $DB_NAME" pg_dump -U "$DB_USER" "$DB_NAME" | gzip > "$BACKUP_FILE"

if [ $? -eq 0 ]; then log "✓ バックアップ成功: $BACKUP_FILE"

ファイルサイズ表示

SIZE=$(du -h "$BACKUP_FILE" | cut -f1) log "ファイルサイズ: $SIZE" else log "✗ バックアップ失敗" exit 1 fi

古いバックアップを削除(保持期間を過ぎたもの)

log "古いバックアップを削除(${RETENTION_DAYS}日以前)" find "$BACKUP_DIR" -name "${DB_NAME}_*.sql.gz" -type f -mtime +$RETENTION_DAYS -delete

現在のバックアップ一覧

log "現在のバックアップ:" ls -lh "$BACKUP_DIR/${DB_NAME}_"*.sql.gz

log "バックアップ処理完了"

クラウドストレージ同期(Python)

#!/usr/bin/env python3 """ ローカルファイルをS3にバックアップ 使用例: python backup_to_s3.py /path/to/local s3://bucket-name/prefix 要件: pip install boto3 """

import os import boto3 from pathlib import Path import logging from datetime import datetime

logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s' )

def backup_to_s3(local_path: str, s3_uri: str): """ローカルディレクトリをS3にバックアップ"""

# S3クライアント
s3 = boto3.client('s3')

# S3 URI解析
if not s3_uri.startswith('s3://'):
    raise ValueError("無効なS3 URI")

parts = s3_uri[5:].split('/', 1)
bucket = parts[0]
prefix = parts[1] if len(parts) > 1 else ''

local_path = Path(local_path)

if not local_path.exists():
    logging.error(f"パスが存在しません: {local_path}")
    return

files_uploaded = 0
total_size = 0

# 再帰的にファイルをアップロード
for file_path in local_path.rglob('*'):
    if file_path.is_file():
        # S3キーを生成
        relative_path = file_path.relative_to(local_path)
        s3_key = f"{prefix}/{relative_path}".replace('\\', '/')

        # ファイルサイズ
        file_size = file_path.stat().st_size

        try:
            # アップロード
            s3.upload_file(
                str(file_path),
                bucket,
                s3_key,
                ExtraArgs={'StorageClass': 'STANDARD_IA'}
            )

            logging.info(f"アップロード: {relative_path} ({file_size:,} bytes)")
            files_uploaded += 1
            total_size += file_size

        except Exception as e:
            logging.error(f"アップロード失敗 {relative_path}: {e}")

logging.info(f"✓ 完了: {files_uploaded} ファイル ({total_size:,} bytes)")

if name == "main": import sys

if len(sys.argv) &#x3C; 3:
    print("使用法: python backup_to_s3.py &#x3C;local_path> &#x3C;s3_uri>")
    sys.exit(1)

local_path = sys.argv[1]
s3_uri = sys.argv[2]

backup_to_s3(local_path, s3_uri)

5. 監視・アラート

サーバー監視(PowerShell)

サーバーリソース監視スクリプト

使用例: .\monitor_server.ps1

閾値設定

$CPU_THRESHOLD = 80 $MEMORY_THRESHOLD = 85 $DISK_THRESHOLD = 90

ログファイル

$LOG_FILE = "C:\Logs\server_monitor.log"

function Write-Log { param($Message) $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss" "$timestamp - $Message" | Out-File -FilePath $LOG_FILE -Append Write-Host "$timestamp - $Message" }

function Send-Alert { param($Subject, $Body) # ここにメール送信やSlack通知のロジックを実装 Write-Log "ALERT: $Subject - $Body" }

CPU使用率チェック

$cpu = (Get-Counter '\Processor(_Total)% Processor Time').CounterSamples.CookedValue if ($cpu -gt $CPU_THRESHOLD) { Send-Alert "CPU使用率が高い" "CPU使用率: $([math]::Round($cpu, 2))%" }

メモリ使用率チェック

$os = Get-CimInstance Win32_OperatingSystem $totalMemory = $os.TotalVisibleMemorySize $freeMemory = $os.FreePhysicalMemory $usedMemoryPercent = (($totalMemory - $freeMemory) / $totalMemory) * 100

if ($usedMemoryPercent -gt $MEMORY_THRESHOLD) { Send-Alert "メモリ使用率が高い" "メモリ使用率: $([math]::Round($usedMemoryPercent, 2))%" }

ディスク使用率チェック

Get-PSDrive -PSProvider FileSystem | Where-Object { $.Used -gt 0 } | ForEach-Object { $usedPercent = ($.Used / ($.Used + $.Free)) * 100

if ($usedPercent -gt $DISK_THRESHOLD) {
    Send-Alert "ディスク使用率が高い" "ドライブ $($_.Name): $([math]::Round($usedPercent, 2))%"
}

}

ステータスログ

Write-Log "監視実行完了 - CPU: $([math]::Round($cpu, 2))% | Memory: $([math]::Round($usedMemoryPercent, 2))%"

  1. CI/CDスクリプト

ビルド&デプロイ(Bash)

#!/bin/bash

Node.jsアプリのビルド&デプロイ

使用例: ./deploy.sh production

set -euo pipefail

ENV="${1:-staging}" PROJECT_NAME="myapp" BUILD_DIR="dist" DEPLOY_SERVER="user@production-server.com" DEPLOY_PATH="/var/www/$PROJECT_NAME"

log() { echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1" }

環境変数読み込み

if [ -f ".env.$ENV" ]; then log "環境変数読み込み: .env.$ENV" export $(cat ".env.$ENV" | xargs) fi

依存関係インストール

log "依存関係インストール中..." npm ci

テスト実行

log "テスト実行中..." npm test

if [ $? -ne 0 ]; then log "✗ テスト失敗 - デプロイ中止" exit 1 fi

ビルド

log "ビルド実行中..." npm run build

if [ ! -d "$BUILD_DIR" ]; then log "✗ ビルド失敗 - $BUILD_DIR が見つかりません" exit 1 fi

バックアップ

log "デプロイ先でバックアップ作成中..." ssh "$DEPLOY_SERVER" "cd $DEPLOY_PATH && tar -czf backup_$(date +%Y%m%d_%H%M%S).tar.gz * || true"

デプロイ

log "デプロイ中: $ENV" rsync -avz --delete "$BUILD_DIR/" "$DEPLOY_SERVER:$DEPLOY_PATH/"

サービス再起動

log "サービス再起動中..." ssh "$DEPLOY_SERVER" "sudo systemctl restart $PROJECT_NAME"

ヘルスチェック

log "ヘルスチェック実行中..." sleep 5

HEALTH_URL="https://production-server.com/health" STATUS=$(curl -s -o /dev/null -w "%{http_code}" "$HEALTH_URL")

if [ "$STATUS" == "200" ]; then log "✓ デプロイ成功 - ヘルスチェックOK" else log "✗ ヘルスチェック失敗 (HTTP $STATUS)" exit 1 fi

スケジュール実行

cron設定例

毎日午前2時にバックアップ実行

0 2 * * * /path/to/backup_script.sh >> /var/log/backup.log 2>&1

毎時0分にログ分析

0 * * * * /usr/bin/python3 /path/to/analyze_logs.py

5分ごとに監視スクリプト実行

*/5 * * * * /path/to/monitor_server.sh

毎週月曜日午前3時にクリーンアップ

0 3 * * 1 /path/to/cleanup_old_files.sh

Windowsタスクスケジューラ(PowerShell)

タスクスケジューラにジョブを登録

$action = New-ScheduledTaskAction -Execute "PowerShell.exe" ` -Argument "-File C:\Scripts\backup.ps1"

$trigger = New-ScheduledTaskTrigger -Daily -At 2am

$principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" ` -LogonType ServiceAccount -RunLevel Highest

Register-ScheduledTask -TaskName "DailyBackup" -Action $action -Trigger $trigger -Principal $principal -Description "毎日午前2時にバックアップを実行"

エラーハンドリング

リトライ機能(Python)

import time from functools import wraps

def retry(max_attempts=3, delay=1, backoff=2): """リトライデコレータ""" def decorator(func): @wraps(func) def wrapper(*args, **kwargs): attempts = 0 current_delay = delay

        while attempts &#x3C; max_attempts:
            try:
                return func(*args, **kwargs)
            except Exception as e:
                attempts += 1
                if attempts >= max_attempts:
                    raise

                print(f"エラー: {e}")
                print(f"リトライ {attempts}/{max_attempts} - {current_delay}秒後に再試行...")
                time.sleep(current_delay)
                current_delay *= backoff

    return wrapper
return decorator

@retry(max_attempts=3, delay=2, backoff=2) def fetch_data_from_api(url): import requests response = requests.get(url, timeout=10) response.raise_for_status() return response.json()

使用例

基本的な使い方

画像ファイルを日付順にリネームするBashスクリプトを生成してください。

具体的なタスク

以下の要件を満たすPythonスクリプトを生成してください:

タスク: ダウンロードフォルダを拡張子別に整理 要件:

  • 拡張子ごとにフォルダを作成(Images, Documents, Videos等)
  • 同名ファイルはタイムスタンプを付与
  • ログ出力
  • ドライラン機能

出力: Python 3.8以上

API連携スクリプト

GitHub APIを使用して、ユーザーのリポジトリ統計を取得するスクリプトを生成してください:

機能:

  • リポジトリ一覧取得
  • スター数、フォーク数集計
  • 使用言語の統計
  • JSON形式でレポート出力
  • 認証トークン対応

言語: Python

バックアップ自動化

PostgreSQLデータベースのバックアップスクリプトを生成してください:

要件:

  • 圧縮バックアップ(gzip)
  • タイムスタンプ付きファイル名
  • 7日以上前のバックアップを自動削除
  • ログ出力
  • エラーハンドリング

言語: Bash 出力: cron設定例も含めて

ベストプラクティス

  • エラーハンドリング: すべての外部コマンド・API呼び出しにエラー処理

  • ログ出力: 実行状況を詳細にログ

  • べき等性: 複数回実行しても安全

  • ドライラン: 実際の処理前に確認可能

  • 設定の外部化: ハードコードせず、環境変数や設定ファイルを使用

  • バックアップ: 破壊的操作の前にバックアップ

  • 通知: 重要な処理の成功/失敗を通知

  • ドキュメント: 使用方法をコメントやREADMEに記載

バージョン情報

  • スキルバージョン: 1.0.0

  • 最終更新: 2025-11-22

使用例まとめ

シンプルな自動化

ファイルをリネームするスクリプトを作成してください。

詳細な要件

以下のタスクを自動化するスクリプトを生成してください: {詳細な要件}

言語: Python/Bash/PowerShell エラーハンドリング: 含む ログ出力: 含む

このスキルで、日々の繰り返し作業を自動化しましょう!

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

Automation

pptx-generator

No summary provided by upstream source.

Repository SourceNeeds Review
Automation

document-summarizer

No summary provided by upstream source.

Repository SourceNeeds Review
Automation

excel-processor

No summary provided by upstream source.

Repository SourceNeeds Review