How to delete S3 key in nested folder?

Viewed 31

I have a bucket with many subfolders. They are designed like this:

bucket_name/nginx_archives/server_name/server_name_date_time.tar.gz

However, all the oldest files are .csv, and I need to remove them.

I can see the keys with:

servers = ['server1', 'server2', 'server3', 'server4', etc, etc]

for server in servers:
   for object in the_bucket.objects.filter(Prefix='nginx_archives/'+server+'/'):
       key = object.key
       if key.endswith('.csv'):
           print(key)
          

It gives me output like this:

nginx_archives/server1/empty.csv
nginx_archives/server2/empty.csv
nginx_archives/server3/empty.csv
nginx_archives/server4/empty.csv
nginx_archives/server5/empty.csv

key.delete() does not work. How can I delete these keys without manually going through every single folder? There are about 50.

Trying to use key.delete() gives me:

AttributeError: 'str' object has no attribute 'delete'

1 Answers

So the result of "object.key" returns a string value for the key not a boto3 object. That's why you're getting the error. You just need to modify your code to create a new boto3 object and run delete. Something like this with your bucket name and the boto3 s3 resource.

servers = ['server1', 'server2', 'server3', 'server4', etc, etc]

for server in servers:
   for s3_object in the_bucket.objects.filter(Prefix='nginx_archives/'+server+'/'):
       key = s3_object.key
       if key.endswith('.csv'):
           s3_object.delete()
Related