Last active
March 5, 2024 09:53
-
-
Save wknapik/191619bfa650b8572115cd07197f3baf to your computer and use it in GitHub Desktop.
Empty an s3 bucket of all object versions and delete markers in batches of 400
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env bash | |
set -eEo pipefail | |
shopt -s inherit_errexit >/dev/null 2>&1 || true | |
if [[ ! "$#" -eq 2 || "$1" != --bucket ]]; then | |
echo -e "USAGE: $(basename "$0") --bucket <bucket>" | |
exit 2 | |
fi | |
# $@ := bucket_name | |
empty_bucket() { | |
local -r bucket="${1:?}" | |
for object_type in Versions DeleteMarkers; do | |
local opt=() next_token="" | |
while [[ "$next_token" != null ]]; do | |
page="$(aws s3api list-object-versions --bucket "$bucket" --output json --max-items 400 "${opt[@]}" \ | |
--query="[{Objects: ${object_type}[].{Key:Key, VersionId:VersionId}}, NextToken]")" | |
objects="$(jq -r '.[0]' <<<"$page")" | |
next_token="$(jq -r '.[1]' <<<"$page")" | |
case "$(jq -r .Objects <<<"$objects")" in | |
'[]'|null) break;; | |
*) opt=(--starting-token "$next_token") | |
aws s3api delete-objects --bucket "$bucket" --delete "$objects";; | |
esac | |
done | |
done | |
} | |
empty_bucket "${2#s3://}" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
When you have files with very long name, it will fail with
Argument list too long
, even with a very low bunch of--max-items
So I rewrite a bit your function. Thanks anyway, it helps ! so I share mine. It's very slow as it loop over each file, but at least it works