import argparse, re from pathlib import Path IMG_EXTS = {".jpg", ".jpeg", ".png", ".bmp", ".webp"} NUM_RE = re.compile(r"^\d+$") # stem must be only digits def main(): ap = argparse.ArgumentParser() ap.add_argument("--root", required=True) ap.add_argument("--dry_run", action="store_true", help="Only print what would be deleted") args = ap.parse_args() root = Path(args.root) to_delete = [] for cls in ["real", "fake"]: cls_dir = root / cls if not cls_dir.exists(): continue for vid_dir in cls_dir.iterdir(): if not vid_dir.is_dir(): continue for p in vid_dir.iterdir(): if not p.is_file(): continue if p.suffix.lower() not in IMG_EXTS: continue if not NUM_RE.match(p.stem): to_delete.append(p) print(f"Found {len(to_delete)} non-numbered frames to delete.") for p in to_delete[:30]: print("DEL", p) if len(to_delete) > 30: print("...") if args.dry_run: print("Dry-run only. No files deleted.") return for p in to_delete: try: p.unlink() except Exception as e: print("FAILED", p, e) print("Done.") if __name__ == "__main__": main()