Respostas:
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.
Acabei de testar isso e funciona:
aws s3 --recursive mv s3://<bucketname>/<folder_name_from> s3://<bucket>/<folder_name_to>
--recursive
?
s3://<bucketname>/<folder_name_from>
, por exemplo s3://<bucketname>/<folder_name_from>/some/deeper/folders
.
aws s3 cp s3://source_folder/ s3://destination_folder/ --recursive
aws s3 rm s3://source_folder --recursive
cp
seguido por rm
preferível mv
?
Você pode usar os comandos AWS CLI para mv
os arquivos
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>
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
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}",));
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.
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.
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
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)
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
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;
}
}
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
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
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;
}
}
renomeie todos os arquivos * .csv.err no <<bucket>>/landing
diretó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)
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