delete_students.py(フォルダ内の中身だけ削除)

delete_students.py は、受講生フォルダ /var/www/html/<folder>中身だけを削除 する自動化スクリプトです。

フォルダ本体は残し、Maildir も削除しません。 授業のリセットや、次の課題の準備に最適です。

本スクリプトは、本サイト管理者と AI(Microsoft Copilot)との共同制作教材として作成されました。

delete_students.zip をダウンロード

最終更新:

目次

スクリプトの配置方法(/usr/local/bin/ へのコピー)

本スクリプトは管理者用ツールとして /usr/local/bin/ に配置することを推奨しています。 Windows PC で ZIP をダウンロードした後、展開したスクリプト(delete_students.py) を USB メモリー経由で Linux Mint にコピーします。

手順 1:Windows で ZIP をダウンロードし、展開する

  • 本サイトから delete_students.zip をダウンロード
  • ZIP を展開し、script フォルダ内の delete_students.py を取り出す
  • USB メモリーに delete_students.py をコピー

手順 2:Linux Mint に USB を挿す

USB は自動的にデスクトップに表示されます。 例:/media/ユーザー名/USBNAME/

手順 3:スクリプトを /usr/local/bin/ にコピー

sudo cp /media/ユーザー名/USBNAME/delete_students.py /usr/local/bin/

手順 4:実行権限を付与

sudo chmod +x /usr/local/bin/delete_students.py

手順 5:どこからでも実行可能に

sudo delete_students.py

/usr/local/bin/ は Linux の標準的な管理者用スクリプト置き場であり、 教育現場での再現性が高く、管理もしやすいため推奨しています。

1. このスクリプトでできること

  • /var/www/html/<folder> の中身だけを削除
  • フォルダ本体は残す(授業のリセットに最適)
  • Maildir は削除しない(メール環境を維持)
  • CSV の一覧から複数フォルダを一括処理
  • ログを /var/log/delete_students.log に出力

2. CSV の形式

CSV の 1 行目(ヘッダー行)は 必須 です。

以下のような形式で作成してください。

folder,username,password
pc01,pc01,pc01
pc02,pc02,pc02
pc03,pc03,pc03
        

delete_students.py では folder 列のみ使用 しますが、 create_students.py と同じ CSV を使えるように、 folder,username,password の 3 列構成に統一しています。

3. 実行方法

delete_students.py は、受講生フォルダの 中身だけを削除 するスクリプトです。 フォルダ本体や Maildir は削除しません。

1. 実行権限を付ける

sudo chmod +x /usr/local/bin/delete_students.py

2. 実行する(Mint の標準的な方法)

sudo delete_students.py

※ /usr/local/bin/ に置いた場合、./ は不要です。
PATH に含まれているため、通常のコマンドと同じように実行できます。

(参考)カレントディレクトリから実行する場合

スクリプトがカレントディレクトリにある場合のみ、次のように実行します。

sudo ./delete_students.py

4. コード全文(著作権表記入り)

→ delete_students.zip をダウンロード

コード全文を表示
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# Created by Inajin (InaPC Linux Lab)
# AI(Microsoft Copilot)との共同制作教材
#
# Copyright (c) 2026  Inajin
# 本スクリプトは教育目的での利用・改変を自由に行えます。
# ただし、著作権表記は削除せず残してください。
#

import csv
import os
import subprocess
import sys
from datetime import datetime
from tkinter import Tk, filedialog

DOCUMENT_ROOT = "/var/www/html"
LOG_FILE = "/var/log/delete_students.log"


def log(message):
    timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    with open(LOG_FILE, "a") as f:
        f.write(f"[{timestamp}] {message}\n")
    print(message)


def select_csv_file():
    root = Tk()
    root.withdraw()
    file_path = filedialog.askopenfilename(
        title="CSVファイルを選択してください",
        filetypes=[("CSV Files", "*.csv")]
    )
    return file_path


def delete_folder_contents(path):
    if not os.path.exists(path):
        log(f"フォルダが存在しないためスキップ: {path}")
        return

    # 中身だけ削除(フォルダ本体は残す)
    for item in os.listdir(path):
        target = os.path.join(path, item)
        subprocess.run(["rm", "-rf", target])
        log(f"削除: {target}")

    log(f"中身削除完了: {path}")


def main():
    # root 権限チェック(安全装置)
    if os.geteuid() != 0:
        print("エラー:このスクリプトは sudo で実行する必要があります。")
        print("例: sudo delete_students.py")
        sys.exit(1)

    csv_path = select_csv_file()
    if not csv_path:
        print("キャンセルされました。処理を終了します。")
        sys.exit(0)

    log("=== フォルダ内の中身削除開始 ===")
    log(f"選択された CSV: {csv_path}")

    with open(csv_path, newline="", encoding="utf-8") as csvfile:
        reader = csv.reader(csvfile)
        next(reader)

        for row in reader:
            folder = row[0]
            folder_path = os.path.join(DOCUMENT_ROOT, folder)

            log(f"--- {folder} の処理開始 ---")
            delete_folder_contents(folder_path)

    log("=== 全処理完了 ===")


if __name__ == "__main__":
    main()

← 自動化スクリプト一覧に戻る