delete_students.py(フォルダ内の中身だけ削除)
delete_students.py は、受講生フォルダ
/var/www/html/<folder> の
中身だけを削除 する自動化スクリプトです。
フォルダ本体は残し、Maildir も削除しません。 授業のリセットや、次の課題の準備に最適です。
本スクリプトは、本サイト管理者と AI(Microsoft Copilot)との共同制作教材として作成されました。
最終更新:
目次
スクリプトの配置方法(/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. コード全文(著作権表記入り)
コード全文を表示
#!/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()