¿Cómo renombrar archivos y carpetas en Amazon S3?

210

¿Hay alguna función para cambiar el nombre de archivos y carpetas en Amazon S3? Cualquier sugerencia relacionada también es bienvenida.

Shan
fuente

Respuestas:

63

No hay un método directo para cambiar el nombre de un archivo en S3. Lo que tiene que hacer es copiar el archivo existente con un nuevo nombre (solo configure la clave de destino) y elimine el antiguo.

Naaz Muhammadh
fuente
112
Proporcione un ejemplo con su respuesta, de lo contrario haga un comentario.
EternalHour
38
@EternalHour sería bueno ... pero no es necesario ... La pregunta ni siquiera tiene ninguna indicación sobre el idioma ... entonces, ¿qué sentido tiene hacer un ejemplo?
Lipis
50
Esta es una respuesta incorrecta. Puede mover archivos en S3 usando mv. mv = rename
Nicolo
17
Esta es una respuesta incorrecta por dos razones: 1) puede usar la GUI para hacer clic derecho y cambiar el nombre del archivo, y 2) como se ha mencionado antes, puede mover el archivo con el comando de movimiento o mediante un SDK.
Maximus
11
No puede hacer clic derecho en el nombre de una carpeta para cambiarle el nombre en S3.
area51
460

Acabo de probar esto y funciona:

aws s3 --recursive mv s3://<bucketname>/<folder_name_from> s3://<bucket>/<folder_name_to>
bennythejudge
fuente
10
¿Es atómico? ¿El segundo (y el mismo) comando fallará mientras se ejecuta primero?
Alex B
13
No AWS no tiene una operación de movimiento atómico
AP.
1
¡Gracias! ¿Por qué necesitamos --recursive?
Aziz Alto
2
@AzizAlto En caso de que haya una estructura de carpetas más profunda debajo s3://<bucketname>/<folder_name_from>, es decir s3://<bucketname>/<folder_name_from>/some/deeper/folders.
Ville
1
@JohnEikenberry No puedo creer que el comentario equivocado de Raj tenga 15 votos a favor. Debería ser eliminado. Editar: Y ahora se eliminó. Agradable.
Doug S
32
aws s3 cp s3://source_folder/ s3://destination_folder/ --recursive
aws s3 rm s3://source_folder --recursive
Thang Tran
fuente
66
Es cpseguido por rmpreferible a mv?
Pyderman
12
Prefiero cp / rm sobre mv, ya que puede verificar si la copia se realizó correctamente antes de eliminarla.
Thang Tran
2
Puede usar el indicador --dryrun para verificar la salida del comando sin ejecutarlo realmente.
kmundnic
15

Puede usar AWS CLI o el comando s3cmd para cambiar el nombre de los archivos y carpetas en el bucket de AWS S3.

Con S3cmd, use la siguiente sintaxis para cambiar el nombre de una carpeta,

s3cmd --recursive mv s3://<s3_bucketname>/<old_foldername>/ s3://<s3_bucketname>/<new_folder_name>

Con AWS CLI, use la siguiente sintaxis para cambiar el nombre de una carpeta,

aws s3 --recursive mv s3://<s3_bucketname>/<old_foldername>/ s3://<s3_bucketname>/<new_folder_name>
Basheer.O
fuente
1
¿Qué sucede si necesito cambiar el nombre de todos los archivos .csv? ¿Cómo es que lo hago?
LUZO
14

Acabo de hacer que esto funcione. Puede usar AWS SDK para PHP de esta manera:

use Aws\S3\S3Client;

$sourceBucket = '*** Your Source Bucket Name ***';
$sourceKeyname = '*** Your Source Object Key ***';
$targetBucket = '*** Your Target Bucket Name ***';
$targetKeyname = '*** Your Target Key Name ***';        

// Instantiate the client.
$s3 = S3Client::factory();

// Copy an object.
$s3->copyObject(array(
    'Bucket'     => $targetBucket,
    'Key'        => $targetKeyname,
    'CopySource' => "{$sourceBucket}/{$sourceKeyname}",
));

http://docs.aws.amazon.com/AmazonS3/latest/dev/CopyingObjectUsingPHP.html

Tom
fuente
Para imitar completamente el cambio de nombre (en lugar de copiar y luego tener que eliminar la carpeta original), ¿pudo hacer que la fuente y el destino fueran los mismos? ¿O tuvo que hacerlos diferentes y luego eliminar la carpeta original?
Pyderman
Creo que hice una copia y luego eliminé el original. De memoria escribí esta respuesta para mi propia referencia: la respuesta aceptada dice lo mismo, pero no dio el ejemplo del código. Por otro lado, le aconsejaría que revise los documentos de AWS, ya que están desarrollando nuevas opciones todo el tiempo.
Tom
Este ejemplo 'solo' muestra la funcionalidad de copia, en lugar de 'mover', (o 'renombrar'). Sé que tiene algunos años, pero ¿hay alguna posibilidad de que pueda actualizarlo con la funcionalidad completa? Tenga en cuenta que S3 creará el objeto 'movido' como un nuevo objeto con nuevas marcas de tiempo, etc. (iirc).
JamesBB
10

Tenemos 2 formas de cambiar el nombre de un archivo en el almacenamiento de AWS S3

1.Utilizando la herramienta CLI -

aws s3 - mv recursivo s3: // nombre-cubo / dirname / oldfile s3: // nombre-cubo / dirname / newfile

2.Utilizando SDK

$s3->copyObject(array(
'Bucket'     => $targetBucket,
'Key'        => $targetKeyname,
'CopySource' => "{$sourceBucket}/{$sourceKeyname}",));
VENENO
fuente
8

No hay forma de cambiar el nombre de una carpeta a través de la GUI, la forma más rápida (y más fácil si lo desea) es realizar una copia antigua simple. Para lograr esto: cree la nueva carpeta en S3 usando la GUI, acceda a su carpeta anterior, seleccione todo, marque "copiar" y luego navegue a la nueva carpeta y elija "pegar". Cuando termine, elimine la carpeta anterior.

Este método simple es muy rápido porque se copia de S3 a sí mismo (no es necesario volver a cargarlo ni nada por el estilo) y también mantiene los permisos y metadatos de los objetos copiados como cabría esperar.

orcaman
fuente
@Trisped En mis pruebas hace un momento, los archivos pueden renombrarse usando la GUI web, pero no las carpetas .
Rinogo
7

Esto ahora es posible para Archivos, seleccione el archivo y luego seleccione Más> Cambiar nombre en la GUI.

Para cambiar el nombre de una carpeta, debe crear una nueva carpeta, seleccionar el contenido de la antigua y copiarla / pegarla (en "Más" nuevamente)

Jetro
fuente
5

Así es como lo haces en .NET, usando S3 .NET SDK:

var client = new Amazon.S3.AmazonS3Client(_credentials, _config);
client.CopyObject(oldBucketName, oldfilepath, newBucketName, newFilePath);
client.DeleteObject(oldBucketName, oldfilepath);

PD: intente usar versiones "asíncronas" de los métodos del cliente cuando sea posible, aunque no lo he hecho para facilitar la lectura

Alex
fuente
4

Esto funciona para renombrar el archivo en la misma carpeta

aws s3  mv s3://bucketname/folder_name1/test_original.csv s3://bucket/folder_name1/test_renamed.csv
Apoyo técnico
fuente
1
No necesariamente en la misma carpeta. El comando que proporcionó funciona a las mil maravillas. Gracias.
R. Cha
3

A continuación se muestra el ejemplo de código para cambiar el nombre del archivo en s3. Mi archivo era parte 000 * debido al archivo spark o / p, luego lo copio a otro nombre de archivo en la misma ubicación y elimino la parte 000 *:

import boto3
client = boto3.client('s3')
response = client.list_objects(
Bucket='lsph',
MaxKeys=10,
Prefix='03curated/DIM_DEMOGRAPHIC/',
Delimiter='/'
)
name = response["Contents"][0]["Key"]
copy_source = {'Bucket': 'lsph', 'Key': name}
client.copy_object(Bucket='lsph', CopySource=copy_source, 
Key='03curated/DIM_DEMOGRAPHIC/'+'DIM_DEMOGRAPHIC.json')
client.delete_object(Bucket='lsph', Key=name)
Vikas
fuente
solo tenga en cuenta que esto está usando python
f.khantsis
2

En la consola de AWS, si navega a S3, verá sus carpetas en la lista. Si navega a la carpeta, verá los objetos enumerados. Haga clic derecho y puede cambiar el nombre. O bien, puede marcar la casilla frente a su objeto, luego, desde el menú desplegable llamado ACCIONES, puede seleccionar cambiar el nombre. Acabo de trabajar para mí, 3-31-2019

1082E1984
fuente
"cambiar el nombre" está en gris para mí para las carpetas, e Internet está lleno de preguntas como "¿por qué está cambiar el nombre de las carpetas en gris en el navegador S3?"
Steve
1

Como respondió Naaz, el cambio de nombre directo de s3 no es posible.

He adjuntado un fragmento de código que copiará todo el contenido

el código está funcionando solo agregue su clave de acceso aws y clave secreta

esto es lo que hice en el código

-> copie el contenido de la carpeta de origen (hijo anidado y carpetas) y pegue en la carpeta de destino

-> cuando se complete la copia, elimine la carpeta de origen

package com.bighalf.doc.amazon;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.List;

import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.CopyObjectRequest;
import com.amazonaws.services.s3.model.ObjectMetadata;
import com.amazonaws.services.s3.model.PutObjectRequest;
import com.amazonaws.services.s3.model.S3ObjectSummary;

public class Test {

public static boolean renameAwsFolder(String bucketName,String keyName,String newName) {
    boolean result = false;
    try {
        AmazonS3 s3client = getAmazonS3ClientObject();
        List<S3ObjectSummary> fileList = s3client.listObjects(bucketName, keyName).getObjectSummaries();
        //some meta data to create empty folders start
        ObjectMetadata metadata = new ObjectMetadata();
        metadata.setContentLength(0);
        InputStream emptyContent = new ByteArrayInputStream(new byte[0]);
        //some meta data to create empty folders end

        //final location is the locaiton where the child folder contents of the existing folder should go
        String finalLocation = keyName.substring(0,keyName.lastIndexOf('/')+1)+newName;
        for (S3ObjectSummary file : fileList) {
            String key = file.getKey();
            //updating child folder location with the newlocation
            String destinationKeyName = key.replace(keyName,finalLocation);
            if(key.charAt(key.length()-1)=='/'){
                //if name ends with suffix (/) means its a folders
                PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, destinationKeyName, emptyContent, metadata);
                s3client.putObject(putObjectRequest);
            }else{
                //if name doesnot ends with suffix (/) means its a file
                CopyObjectRequest copyObjRequest = new CopyObjectRequest(bucketName, 
                        file.getKey(), bucketName, destinationKeyName);
                s3client.copyObject(copyObjRequest);
            }
        }
        boolean isFodlerDeleted = deleteFolderFromAws(bucketName, keyName);
        return isFodlerDeleted;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return result;
}

public static boolean deleteFolderFromAws(String bucketName, String keyName) {
    boolean result = false;
    try {
        AmazonS3 s3client = getAmazonS3ClientObject();
        //deleting folder children
        List<S3ObjectSummary> fileList = s3client.listObjects(bucketName, keyName).getObjectSummaries();
        for (S3ObjectSummary file : fileList) {
            s3client.deleteObject(bucketName, file.getKey());
        }
        //deleting actual passed folder
        s3client.deleteObject(bucketName, keyName);
        result = true;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return result;
}

public static void main(String[] args) {
    intializeAmazonObjects();
    boolean result = renameAwsFolder(bucketName, keyName, newName);
    System.out.println(result);
}

private static AWSCredentials credentials = null;
private static AmazonS3 amazonS3Client = null;
private static final String ACCESS_KEY = "";
private static final String SECRET_ACCESS_KEY = "";
private static final String bucketName = "";
private static final String keyName = "";
//renaming folder c to x from key name
private static final String newName = "";

public static void intializeAmazonObjects() {
    credentials = new BasicAWSCredentials(ACCESS_KEY, SECRET_ACCESS_KEY);
    amazonS3Client = new AmazonS3Client(credentials);
}

public static AmazonS3 getAmazonS3ClientObject() {
    return amazonS3Client;
}

}

Mateen
fuente
2
Considere editar su código, ya que esta implementación no devuelve todo el contenido, como lo implicó, porque cuando llama a listObjects (bucketName, keyName), devuelve como máximo 1000 elementos, debe llamar al método ObjectListing.isTruncated () para saber si es necesaria una nueva solicitud de llamada. Considere esto como referencia docs.aws.amazon.com/AmazonS3/latest/dev/…
le0diaz
Esto funciona pero también estoy de acuerdo con el comentario anterior. Simplemente reemplace List <S3ObjectSummary> fileList = s3client.listObjects (bucketName, keyName) .getObjectSummaries (); con ObjectListing objectListing = s3.listObjects (bucketName, keyName); Lista <S3ObjectSummary> fileList = new ArrayList <> (); fileList.addAll (objectListing.getObjectSummaries ()); while (objectListing.isTruncated ()) {objectListing = s3.listNextBatchOfObjects (objectListing); fileList.addAll (objectListing.getObjectSummaries ()); }
Karthik
0

Archivo y carpeta son, de hecho, objetos en S3. Debe utilizar PONER OBJETO COPIA para cambiarles el nombre. Ver http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectCOPY.html

okwap
fuente
1
mientras que algunos idiomas no tienen un SDK ofrecido por AWS, los grandes ( Python, Ruby, Java, C#, PHP, Node.js, Android, iOS, browser JavaScript) sí lo tienen y no hay razón para no usarlos aws.amazon.com/tools
Don Cheadle
3
El SDK de Java de AWS es demasiado grande (y monolítico) para aplicaciones del lado del cliente.
Jesse Barnum
0

S3DirectoryInfo tiene un método MoveTo que moverá un directorio a otro directorio, de modo que el directorio movido se convertirá en un subdirectorio del otro directorio con el mismo nombre que tenía originalmente.

El siguiente método de extensión moverá un directorio a otro directorio, es decir, el directorio movido se convertirá en el otro directorio. Lo que realmente hace es crear el nuevo directorio, mover todos los contenidos del directorio anterior y luego eliminar el antiguo.

public static class S3DirectoryInfoExtensions
{
    public static S3DirectoryInfo Move(this S3DirectoryInfo fromDir, S3DirectoryInfo toDir)
    {
        if (toDir.Exists)
            throw new ArgumentException("Destination for Rename operation already exists", "toDir");
        toDir.Create();
        foreach (var d in fromDir.EnumerateDirectories())
            d.MoveTo(toDir);
        foreach (var f in fromDir.EnumerateFiles())
            f.MoveTo(toDir);
        fromDir.Delete();
        return toDir;
    }
}
HansA
fuente
0

cambie el nombre de todos los archivos * .csv.err en el <<bucket>>/landingdirectorio a archivos * .csv con s3cmd

 export aws_profile='foo-bar-aws-profile'
 while read -r f ; do tgt_fle=$(echo $f|perl -ne 's/^(.*).csv.err/$1.csv/g;print'); \
        echo s3cmd -c ~/.aws/s3cmd/$aws_profile.s3cfg mv $f $tgt_fle; \
 done < <(s3cmd -r -c ~/.aws/s3cmd/$aws_profile.s3cfg ls --acl-public --guess-mime-type \
        s3://$bucket | grep -i landing | grep csv.err | cut -d" " -f5)
Yordan Georgiev
fuente
-2

Hay un software donde puedes jugar con el cubo s3 para realizar diferentes tipos de operaciones.

Nombre del software: S3 Browser

S3 Browser es un cliente de Windows gratuito para Amazon S3 y Amazon CloudFront. Amazon S3 proporciona una interfaz de servicios web simple que se puede utilizar para almacenar y recuperar cualquier cantidad de datos, en cualquier momento, desde cualquier lugar de la web. Amazon CloudFront es una red de entrega de contenido (CDN). Se puede usar para entregar sus archivos usando una red global de ubicaciones de borde.


Si es solo una vez, puede usar la línea de comando para realizar estas operaciones:

(1) Cambie el nombre de la carpeta en el mismo depósito:

s3cmd --access_key={access_key} --secret_key={secret_key} mv s3://bucket/folder1/* s3://bucket/folder2/

(2) Cambiar el nombre del cubo:

s3cmd --access_key={access_key} --secret_key={secret_key} mv s3://bucket1/folder/* s3://bucket2/folder/

Dónde,

{access_key} = Su clave de acceso válida para el cliente s3

{secret_key} = Su clave de tornillo válida para el cliente s3

Funciona bien sin ningún problema.

Gracias

Radadiya Nikunj
fuente