Como renomear arquivos e pastas no Amazon S3?

209

Existe alguma função para renomear arquivos e pastas no Amazon S3? Quaisquer sugestões relacionadas também são bem-vindas.

Shan
fonte

Respostas:

62

Não existe um método direto para renomear um arquivo no S3. O que você precisa fazer é copiar o arquivo existente com um novo nome (basta definir a chave de destino) e excluir o antigo.

Naaz Muhammadh
fonte
112
Dê um exemplo com sua resposta, caso contrário, faça um comentário.
EternalHour
38
@EternalHour seria legal .. mas não é necessário .. A pergunta nem tem indicação sobre o idioma .. então qual é o sentido de fazer um exemplo?
Lipis
50
Esta é uma resposta errada. Você pode mover arquivos no S3 usando o mv. mv = renomear
Nicolo
17
Esta é uma resposta errada por dois motivos: 1) você pode usar a GUI para clicar com o botão direito do mouse e renomear o arquivo; e 2) como foi mencionado antes de poder mover o arquivo com o comando move ou por meio de um sdk.
Maximus
11
Você não pode clicar com o botão direito do mouse no nome de uma pasta para renomeá-la no S3.
area51
460

Acabei de testar isso e funciona:

aws s3 --recursive mv s3://<bucketname>/<folder_name_from> s3://<bucket>/<folder_name_to>
bennythejudge
fonte
10
É atômico? O segundo (e o mesmo) comando falhará enquanto o primeiro estiver em execução?
21716 Alex B #
13
Nenhuma AWS não possui uma operação de movimentação atômica
AP.
1
Obrigado! Por que precisamos --recursive?
Aziz Alto
2
@AzizAlto Caso haja uma estrutura de pastas mais profunda s3://<bucketname>/<folder_name_from>, por exemplo s3://<bucketname>/<folder_name_from>/some/deeper/folders.
Ville
1
@JohnEikenberry Não acredito que o comentário errado de Raj tenha 15 votos positivos. Deve ser excluído. Edit: E agora foi excluído. Agradável.
Doug S
32
aws s3 cp s3://source_folder/ s3://destination_folder/ --recursive
aws s3 rm s3://source_folder --recursive
Thang Tran
fonte
6
É cpseguido por rmpreferível mv?
Pyderman 7/09/15
12
Prefiro cp / rm sobre mv, pois você pode verificar se a cópia foi feita com êxito antes de fazer qualquer exclusão.
Thang Tran
2
Você pode usar o sinalizador --dryrun para verificar a saída do comando sem executá-lo.
kmundnic
26

Você pode usar os comandos AWS CLI para mvos arquivos

Cavaz
fonte
15

Você pode usar o comando AWS CLI ou s3cmd para renomear os arquivos e pastas no bucket do AWS S3.

Usando o S3cmd, use a seguinte sintaxe para renomear uma pasta,

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

Usando a AWS CLI, use a seguinte sintaxe para renomear uma pasta,

aws s3 --recursive mv s3://<s3_bucketname>/<old_foldername>/ s3://<s3_bucketname>/<new_folder_name>
Basheer.O
fonte
1
E se eu precisar renomear todos os arquivos .csv. como eu vou?
LUZO 22/0318
14

Acabei de fazer isso funcionar. Você pode usar o AWS SDK para PHP assim:

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
fonte
Para imitar completamente a renomeação (em vez de copiar e depois excluir a pasta original), você conseguiu tornar a origem e o destino iguais? Ou você teve que diferenciá-los e excluir a pasta original?
Pyderman
Acho que fiz uma cópia e apague o original. De memória, escrevi esta resposta para minha própria referência - a resposta aceita diz o mesmo, mas não deu o exemplo de código. Por outro lado, aconselho que você tenha uma nova visão dos documentos da AWS, pois eles estão desenvolvendo novas opções o tempo todo.
Tom
Este exemplo 'apenas' mostra a funcionalidade de cópia, em vez de 'mover' (ou 'renomear'). Sei que tem alguns anos, mas alguma chance de atualizá-lo com a funcionalidade completa? Observe que o S3 criará o objeto 'movido' como um novo objeto com novos registros de data e hora, etc. (iirc).
JamesBB 02/07/19
10

Temos duas maneiras pelas quais podemos renomear um arquivo no armazenamento do AWS S3 -

1.Usando a ferramenta CLI -

aws s3 --recursive mv s3: // nome do bloco / nome do diretório / arquivo antigo s3: // nome do bloco / nome do diretório / arquivo novo

2.Usando o SDK

$s3->copyObject(array(
'Bucket'     => $targetBucket,
'Key'        => $targetKeyname,
'CopySource' => "{$sourceBucket}/{$sourceKeyname}",));
POÇÃO
fonte
8

Não há como renomear uma pasta por meio da GUI, a maneira mais rápida (e mais fácil, se você gosta da GUI) de conseguir isso é executar uma cópia antiga simples. Para conseguir isso: crie a nova pasta no S3 usando a GUI, acesse a pasta antiga, selecione tudo, marque "copiar" e, em seguida, navegue até a nova pasta e escolha "colar". Quando terminar, remova a pasta antiga.

Esse método simples é muito rápido, pois é uma cópia do S3 para si mesmo (não é necessário fazer o upload novamente ou algo assim) e também mantém as permissões e os metadados dos objetos copiados, como você esperaria.

orcaman
fonte
@Trisped No meu teste, há pouco, os arquivos podem ser renomeados usando a GUI da web, mas não as pastas .
rinogo 17/02
7

Agora é possível para Arquivos, selecione o arquivo e selecione Mais> Renomear na GUI.

Para renomear uma pasta, você precisa criar uma nova pasta, selecionar o conteúdo da antiga e copiar / colar (em "Mais" novamente)

Jethro
fonte
5

Veja como você faz isso no .NET, usando S3 .NET SDK:

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

O PS tenta usar as versões "Async" dos métodos do cliente sempre que possível, mesmo que eu não tenha feito isso para facilitar a leitura.

Alex
fonte
4

Isso funciona para renomear o arquivo na mesma pasta

aws s3  mv s3://bucketname/folder_name1/test_original.csv s3://bucket/folder_name1/test_renamed.csv
Suporte técnico
fonte
1
Não necessariamente na mesma pasta. O comando que você forneceu funciona como um encanto. Obrigado.
precisa saber é
3

Abaixo está o exemplo de código para renomear o arquivo no s3. Meu arquivo era parte 000 * por causa do arquivo spark o / p, então eu o copio para outro nome de arquivo no mesmo local e excluo a 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
fonte
Basta notar que esta é usando python
f.khantsis
2

No console da AWS, se você navegar para o S3, verá suas pastas listadas. Se você navegar para a pasta, verá o (s) objeto (s) listado (s). clique com o botão direito e você pode renomear. OU, você pode marcar a caixa na frente do seu objeto e, no menu suspenso chamado AÇÕES, você pode selecionar renomear. Acabei de trabalhar para mim, 31/03/2019

1082E1984
fonte
"renomear" está acinzentado para pastas e a Internet está cheia de perguntas como "por que renomear está acinzentado para pastas no navegador S3?"
Steve
1

Como respondido por Naaz, renomear diretamente s3 não é possível.

Anexei um trecho de código que copiará todo o conteúdo

código está funcionando basta adicionar sua chave de acesso aws e chave secreta

aqui está o que eu fiz no código

-> copie o conteúdo da pasta de origem (filho e pastas aninhados) e cole na pasta de destino

-> quando a cópia estiver concluída, exclua a pasta de origem

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
fonte
2
Considere editar seu código, pois esta implementação não retorna todo o conteúdo, como você sugeriu, porque quando você chama o listObjects (bucketName, keyName), ele retorna no máximo 1000 itens, você deve chamar o método ObjectListing.isTruncated () para saber se uma nova chamada de solicitação for necessária. Considere isso como uma referência docs.aws.amazon.com/AmazonS3/latest/dev/…
le0diaz
Isso funciona, mas eu também concordo com o comentário acima. Basta substituir List <S3ObjectSummary> fileList = s3client.listObjects (bucketName, keyName) .getObjectSummaries (); com ObjectListing objectListing = s3.listObjects (bucketName, keyName); List <S3ObjectSummary> fileList = new ArrayList <> (); fileList.addAll (objectListing.getObjectSummaries ()); while (objectListing.isTruncated ()) {objectListing = s3.listNextBatchOfObjects (objectListing); fileList.addAll (objectListing.getObjectSummaries ()); }
Karthik
0

Arquivo e pasta são de fato objetos no S3. Você deve usar PUT OBJECT COPY para renomeá-los. Consulte http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectCOPY.html

okwap
fonte
1
enquanto algumas línguas não têm um SDK oferecida pela AWS, os grandes ( Python, Ruby, Java, C#, PHP, Node.js, Android, iOS, browser JavaScript) fazer e não há nenhuma razão para não usá-los aws.amazon.com/tools
Don Cheadle
3
O Java SDK da AWS é muito grande (e monolítico) para aplicativos do lado do cliente.
Jesse Barnum
0

S3DirectoryInfo possui um método MoveTo que moverá um diretório para outro diretório, de modo que o diretório movido se torne um subdiretório do outro diretório com o mesmo nome que originalmente.

O método de extensão abaixo moverá um diretório para outro, ou seja, o diretório movido se tornará o outro diretório. O que ele realmente faz é criar o novo diretório, mover todo o conteúdo do diretório antigo para ele e excluir o antigo.

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
fonte
0

renomeie todos os arquivos * .csv.err no <<bucket>>/landingdiretório para arquivos * .csv com 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
fonte
-2

Há um software em que você pode jogar com o bucket s3 para executar diferentes tipos de operação.

Nome do software: S3 Browser

O S3 Browser é um cliente Windows gratuito para o Amazon S3 e o Amazon CloudFront. O Amazon S3 fornece uma interface simples de serviços da web que pode ser usada para armazenar e recuperar qualquer quantidade de dados, a qualquer momento, de qualquer lugar da web. O Amazon CloudFront é uma rede de entrega de conteúdo (CDN). Ele pode ser usado para entregar seus arquivos usando uma rede global de locais de borda.


Se for apenas uma vez, você poderá usar a linha de comando para executar estas operações:

(1) Renomeie a pasta no mesmo bucket:

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

(2) Renomeie o balde:

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

Onde,

{chave de acesso} = Sua chave de acesso válida para o cliente s3

{chave secreta} = Sua chave scret válida para o cliente s3

Está funcionando bem sem nenhum problema.

obrigado

Radadiya Nikunj
fonte