2 min read

Find and Delete Empty Folders

This utility recursively scans a directory and deletes any subfolders that are empty. It's useful for cleaning up project directories or file systems after moving or deleting many files.

Modules Used:

  • os: To walk through directories and remove them.
  • argparse: To handle command-line arguments.

The Code

Save this as clean_empty.py.

import os
import argparse
import sys

def find_and_delete_empty(directory, dry_run=False):
    if not os.path.isdir(directory):
        print(f"Error: Directory '{directory}' not found.")
        return

    deleted_count = 0

    # We use topdown=False to process from the deepest directories up
    for root, dirs, files in os.walk(directory, topdown=False):
        # Check if the current directory is empty
        if not dirs and not files:
            try:
                if dry_run:
                    print(f"[DRY RUN] Would delete empty folder: {root}")
                else:
                    os.rmdir(root)
                    print(f"Deleted empty folder: {root}")
                deleted_count += 1
            except OSError as e:
                print(f"Error deleting {root}: {e}")

    if deleted_count == 0:
        print("No empty folders found.")
    else:
        print(f"\nCleanup complete. Deleted {deleted_count} empty folders.")

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="Find and Delete Empty Folders")
    parser.add_argument("directory", help="The root directory to scan")
    parser.add_argument("--dry-run", action="store_true", help="Show what would be deleted without actually deleting")

    args = parser.parse_args()

    find_and_delete_empty(args.directory, args.dry_run)

Usage

# First, always run a dry run to see what will be deleted
python clean_empty.py ./my_project --dry-run

# If you are happy with the dry run, execute the deletion
python clean_empty.py ./my_project

How it works: The script uses os.walk(directory, topdown=False). The topdown=False argument is crucial because it makes the function traverse the directory tree from the bottom up. This ensures that a folder containing an empty subfolder is not considered empty until after its empty subfolder has been deleted.

programming/python/python