Puedo obtener los últimos cinco archivos actualizados de AWS S3 con el siguiente comando

aws s3 ls s3://somebucket/ --recursive | sort | tail -n 5 | awk '{print $4}'

Ahora necesito eliminar todos los archivos en AWS S3 excepto los últimos 5 archivos que se obtienen del comando anterior en AWS.

Digamos que el comando obtiene 1.txt,2.txt,3.txt,4.txt,5.txt. Necesito eliminar todo de AWS S3 excepto 1.txt,2.txt,3.txt,4.txt,and 5.txt.

1
user3123372 30 dic. 2016 a las 09:04

3 respuestas

La mejor respuesta

Utilice AWS s3 rm con múltiples comandos {{X0 }} opciones (supongo que los últimos 5 archivos no se encuentran dentro de un patrón)

aws s3 rm s3://somebucket/ --recursive --exclude "somebucket/1.txt" --exclude "somebucket/2.txt" --exclude "somebucket/3.txt" --exclude "somebucket/4.txt" --exclude "somebucket/5.txt"

PRECAUCIÓN : asegúrese de probarlo con la opción --dryrun, verifique que los archivos que se eliminarán no incluyan los 5 archivos antes de eliminarlos realmente.

4
helloV 30 dic. 2016 a las 06:15

Combiné varias soluciones y se me ocurrió esto para eliminar todos menos los últimos 30 archivos. Tenga en cuenta que se necesitan dos tipos para ordenar por fecha y hora. Esto también maneja archivos con espacios.

aws s3 ls s3://your-bucket/ --recursive | sort -k1 | sort -k2 | head -n -30 | awk '{$1=$2=$3=""; print $0}' | sed 's/^[ \t]*//' | while read -r line ; do
    echo "Removing \"${line}\"";
    aws s3 rm "s3://your-bucket/${line}";
done
0
dw1 19 mar. 2018 a las 23:14

Use un número negativo con head para obtener todas menos las últimas n líneas:

aws s3 ls s3://somebucket/ --recursive | sort | head -n -5 | while read -r line ; do
    echo "Removing ${line}"
    aws s3 rm s3://somebucket/${line}
done
4
bcattle 2 ene. 2018 a las 04:40