Skip to content

Instantly share code, notes, and snippets.

@lionello
Last active June 16, 2025 18:04
Show Gist options
  • Save lionello/f322e24135aef81d5ab9c6086c5604cf to your computer and use it in GitHub Desktop.
Save lionello/f322e24135aef81d5ab9c6086c5604cf to your computer and use it in GitHub Desktop.
Python script to delete all versions of objects in an S3 bucket by their prefix
#! /usr/bin/env nix-shell
#! nix-shell -i python3 -p python3Packages.boto3
# Canonical URL: https://gist.github.com/lionello/f322e24135aef81d5ab9c6086c5604cf
import boto3
s3 = boto3.client("s3")
def delete_object_versions(bucket, prefix):
paginator = s3.get_paginator("list_object_versions")
pages = paginator.paginate(Bucket=bucket, Prefix=prefix)
to_delete = []
for page in pages:
for version in page.get("Versions", []):
to_delete.append({"Key": version["Key"], "VersionId": version["VersionId"]})
for marker in page.get("DeleteMarkers", []):
to_delete.append({"Key": marker["Key"], "VersionId": marker["VersionId"]})
# Batch delete in chunks of 1000
for i in range(0, len(to_delete), 1000):
chunk = to_delete[i:i + 1000]
resp = s3.delete_objects(Bucket=BUCKET, Delete={"Objects": chunk})
print(f"Deleted {len(resp.get('Deleted', []))} objects")
if __name__ == "__main__":
# get bucket name and prefix from args
from sys import argv, exit
if len(argv) != 3:
print("Usage: delete-bucket-object-versions.py <bucket-name> <prefix>")
exit(1)
BUCKET = argv[1]
PREFIX = argv[2]
print(f"Deleting all object versions in bucket '{BUCKET}' with prefix '{PREFIX}'...")
delete_object_versions(BUCKET, PREFIX)
print("Deletion complete.")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment