How about if you need to delete large quantities of files inside a S3 bucket.
In my case it was about 5 millions files.
Using a python script.

p>Here is the code:

# coding: utf-8
# Original by Bruno Mentges
import time
from boto.s3.connection import S3Connection
access_key = 'asd'
secret_key = 'asd'
#File containing, each line
nome_arquivo = "/root/bin/list/list.csv"
print "Processing list"
objetos_s3 = []
with open(nome_arquivo, "r") as f:
    for linha in f:
        objetos_s3.extend(map(lambda x: x.split("http:///")[-1], linha.split(";")))
print "Numero de urls a apagar: %d" % len(objetos_s3)
f = lambda A, n=1000: [A[i:i+n] for i in range(0, len(A), n)]
mil_em_mil = f(objetos_s3)
print "Tamanho do array teste: %d" % len(mil_em_mil)
print "Tamanho do primeiro item do array teste: %d" % len(mil_em_mil[0])
print "Tamanho do ultimo item do array teste: %d" % len(mil_em_mil[-1])
conn = S3Connection(access_key, secret_key)
try_bucket = conn.lookup('')
if try_bucket is None:
    print "Bucket nao encontrado"
    bucket = conn.get_bucket('')
    resultados = []
    print "Iniciando envio dos requests..."
    counter = 1
    for keys_to_delete in mil_em_mil:
	t0 = time.time()
        print "Enviando request numero %d. Quantidade de chaves a deletar: %d" % (counter, len(keys_to_delete))
        # resultado terao so as keys que deram erro (quiet=True) // mais rapido
        resultado = bucket.delete_keys(keys_to_delete, quiet=True)
        erros = 0
        if resultado:
 	    erros = len(resultado.errors)
	t1 = time.time()
        print "Finalizado o envio numero %d, qtd erros: %d, tempo: %s" % (counter, erros, str(t1-t0))
        counter += 1
    print "Keys que deram erro, abaixo: "
    for resultado in resultados:
        # boto.s3.multidelete.MultiDeleteResult
        if resultado and len(resultado.errors) > 0:
        	print resultado.errors
print "Fim do processamento, sucesso!"

Leave a Reply

Your email address will not be published. Required fields are marked *