Transmission 未做种文件删除脚本

Transmission

PT 站做种久了,磁盘里总会多出一堆“幽灵文件”

种子下完了、做种也做够了,顺手把任务从列表里删掉。结果文件还静静躺在硬盘里,占着空间却没人管。时间一长,下载目录里堆满了这些“已经不在做种、但又没删干净”的文件。

手动一个个找太麻烦,尤其是种子多、目录深的时候,根本分不清哪些还在做种、哪些已经成了孤儿。

以前用nevinee/qbittorrent,有列出未做种文件删除的功能,但是切到Transmission发现没有这个功能。

自备python环境,我是Unraid直接插件安装python,插件autoexec.sh添加pip3 install transmission-rpc这样每次开机都会安装所需依赖。

这两个脚本就是为了解决这个问题:

Unraid直接User Scripts插件添加这两个脚本

脚本1会去问 Transmission:“你现在到底在做种哪些文件?”
然后把本地目录里的文件和它对比,找出那些“本地有、但 Transmission 已经不管了”的文件,生成一个清单。

#!/usr/bin/env python3
"""
Transmission 未做种文件检查脚本
功能:对比本地目录和 Transmission 正在做种的文件,生成可编辑的删除列表
"""

from transmission_rpc import Client
import os

# ====== 配置区域(按需修改) ======
HOST = "127.0.0.1"                          # Transmission RPC 地址,本机用 127.0.0.1
PORT = 9091                                 # Transmission WebUI / RPC 端口
USERNAME = "None"                             # 登录用户名,没有认证就保持 None
PASSWORD = "None"                             # 登录密码,没有认证就保持 None
DOWNLOAD_DIR = "/mnt/library/pt"            # 宿主机上的下载目录(对应容器内的 /pt)
LIST_FILE = "/mnt/library/pt/orphans_to_delete.txt"  # 生成的未做种文件列表路径
# ==================================

client = Client(host=HOST, port=PORT, username=USERNAME, password=PASSWORD)

# 收集 Transmission 当前管理的所有文件
managed = set()
for torrent in client.get_torrents(arguments=["downloadDir", "files", "priorities", "wanted"]):
    # 把容器内路径 /pt 转换成宿主机路径
    host_dir = torrent.download_dir.replace("/pt", DOWNLOAD_DIR, 1)
    for f in torrent.get_files():
        full_path = os.path.normpath(os.path.join(host_dir, f.name))
        managed.add(full_path)

# 收集本地下载目录里的所有文件
local_files = set()
for root, dirs, files in os.walk(DOWNLOAD_DIR):
    for name in files:
        full_path = os.path.normpath(os.path.join(root, name))
        local_files.add(full_path)

# 差集 = 本地有但 Transmission 不在做种的文件
orphans = sorted(local_files - managed)

# 写入列表文件
with open(LIST_FILE, "w", encoding="utf-8") as f:
    for p in orphans:
        f.write(p + "\n")

print(f"共发现 {len(orphans)} 个未做种文件")
print(f"列表已保存到:{LIST_FILE}")
print("请用文本编辑器打开这个文件,删除你不想删除的行,保存后再运行删除脚本。")

脚本2负责根据这份清单删除文件。
删除前你可以先打开清单,把不想删的行手动去掉,确认无误再执行,最大程度避免误删。

#!/usr/bin/env python3
"""
根据列表删除 Transmission 未做种文件
使用前请先运行「01_生成未做种列表.py」,并手动检查 orphans_to_delete.txt
"""

import os

# ====== 配置区域 ======
LIST_FILE = "/mnt/library/pt/orphans_to_delete.txt"  # 上一步生成的列表文件
# ======================

if not os.path.exists(LIST_FILE):
    print(f"列表文件不存在:{LIST_FILE}")
    print("请先运行「01_生成未做种列表.py」")
    exit(1)

with open(LIST_FILE, "r", encoding="utf-8") as f:
    paths = [line.strip() for line in f if line.strip()]

print(f"准备删除 {len(paths)} 个文件...\n")

deleted = 0
failed = 0
total_size = 0

for p in paths:
    if not os.path.exists(p):
        print(f"[跳过] 文件已不存在: {p}")
        continue
    try:
        size = os.path.getsize(p)
        os.remove(p)
        print(f"[已删除] {p}  ({size / 1024 / 1024:.1f} MB)")
        deleted += 1
        total_size += size
    except Exception as e:
        print(f"[失败] {p}  → {e}")
        failed += 1

print(f"\n完成!成功删除 {deleted} 个文件,失败 {failed} 个")
print(f"共释放空间:{total_size / 1024 / 1024 / 1024:.2f} GB")

效果很直接:

  • 快速清理不再做种的垃圾文件
  • 释放被白白占用的硬盘空间
  • 不需要一个个去翻文件夹
  • 全程可控,删之前可以自己把关

简单说就是:让硬盘里只留下真正还在做种的文件,其余的该清理就清理。