Spaces:
Running
Running
| 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() | |