Відповіді:
Немає прямого методу перейменування файлу в S3. Вам потрібно скопіювати існуючий файл з новим іменем (просто встановіть цільову клавішу) та видаліть старий.
Я щойно це перевірив, і це працює:
aws s3 --recursive mv s3://<bucketname>/<folder_name_from> s3://<bucket>/<folder_name_to>
--recursive
?
s3://<bucketname>/<folder_name_from>
, тобто 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
потім rm
краще mv
?
Ви можете використовувати команду AWS CLI або s3cmd для перейменування файлів і папок у відро AWS S3.
Використовуючи S3cmd, використовуйте наступний синтаксис для перейменування папки,
s3cmd --recursive mv s3://<s3_bucketname>/<old_foldername>/ s3://<s3_bucketname>/<new_folder_name>
Використовуючи AWS CLI, використовуйте наступний синтаксис для перейменування папки,
aws s3 --recursive mv s3://<s3_bucketname>/<old_foldername>/ s3://<s3_bucketname>/<new_folder_name>
Я щойно це працюю. Ви можете використовувати AWS SDK для PHP так:
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
У нас є два способи перейменування файлу на сховищі AWS S3 -
1. Використання інструмента CLI -
aws s3 - рекурсивний mv s3: // ім'я відра / dirname / oldfile s3: // ім'я відра / dirname / newfile
2. Використання SDK
$s3->copyObject(array(
'Bucket' => $targetBucket,
'Key' => $targetKeyname,
'CopySource' => "{$sourceBucket}/{$sourceKeyname}",));
Немає можливості перейменувати папку через GUI, найшвидший (і найпростіший, якщо вам подобається GUI) спосіб досягти цього - це виконати звичайну стару копію. Щоб досягти цього: створіть нову папку на S3 за допомогою GUI, перейдіть до вашої старої папки, виберіть усе, позначте «копіювати» та перейдіть до нової папки та виберіть «вставити». Після закінчення видаліть стару папку.
Цей простий метод дуже швидкий, оскільки це копії з S3 до себе (не потрібно повторно завантажувати чи щось подібне), а також підтримує дозволи та метадані скопійованих об'єктів, як ви очікували.
Ось як ви це робите в .NET, використовуючи S3 .NET SDK
:
var client = new Amazon.S3.AmazonS3Client(_credentials, _config);
client.CopyObject(oldBucketName, oldfilepath, newBucketName, newFilePath);
client.DeleteObject(oldBucketName, oldfilepath);
PS намагаються використовувати версії "Async" версій клієнтських методів, де це можливо, хоча я цього не робив для читабельності
Це працює для перейменування файла в одній папці
aws s3 mv s3://bucketname/folder_name1/test_original.csv s3://bucket/folder_name1/test_renamed.csv
Нижче наведено приклад коду для перейменування файлу на s3. Мій файл був частиною-000 * через іскровий файл p / p, потім я копіюю його до іншого імені файлу з того самого місця та видаляю частину-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)
На консолі AWS, якщо ви переходите до S3, ви побачите свої папки в списку. Якщо ви перейдете до папки, ви побачите перелічені об’єкти. клацніть правою кнопкою миші, і ви можете перейменувати. АБО ви можете встановити прапорець перед вашим об'єктом, тоді з випадаючого меню під назвою ДІЇ можна вибрати перейменувати. Просто працював для мене, 3-31-2019
Як відповів Naaz, пряме перейменування s3 неможливо.
я додав фрагмент коду, який буде копіювати весь вміст
код працює просто додайте ключ доступу та секретний ключ
ось що я зробив у коді
-> скопіюйте вміст вихідної папки (вкладені дочірні та папки) та вставте в цільову папку
-> після завершення копіювання видаліть вихідну папку
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;
}
}
Файл і папка насправді є об'єктами в S3. Ви повинні використовувати PUT OBJECT COPY для їх перейменування. Див. Http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectCOPY.html
Python, Ruby, Java, C#, PHP, Node.js, Android, iOS, browser JavaScript
) роблять це, і немає причин не використовувати їх aws.amazon.com/tools
S3DirectoryInfo має метод MoveTo, який перемістить один каталог у інший каталог, так що переміщена директорія стане підкаталогом іншого каталогу з тим самим ім'ям, що і раніше.
Нижче описаний спосіб розширення перемістить один каталог в інший каталог, тобто переміщений каталог стане іншим каталогом. Насправді це створити новий каталог, перемістити до нього весь вміст старого каталогу, а потім видалити старий.
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;
}
}
перейменуйте всі файли * .csv.err у <<bucket>>/landing
dir у * .csv файли з 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)
Є одне програмне забезпечення, де ви можете грати з відро s3 для виконання різних видів операцій.
Назва програмного забезпечення: браузер S3
Браузер S3 - це безкоштовний клієнт Windows для Amazon S3 та Amazon CloudFront. Amazon S3 пропонує простий інтерфейс веб-служб, який можна використовувати для зберігання та отримання будь-якої кількості даних у будь-який час з будь-якої точки Інтернету. Amazon CloudFront - це мережа доставки вмісту (CDN). Він може використовуватися для доставки файлів за допомогою глобальної мережі крайових локацій.
Якщо це лише один раз, тоді ви можете використовувати командний рядок для виконання цих операцій:
(1) Перейменуйте папку в тому ж відрі:
s3cmd --access_key={access_key} --secret_key={secret_key} mv s3://bucket/folder1/* s3://bucket/folder2/
(2) Перейменуйте відро:
s3cmd --access_key={access_key} --secret_key={secret_key} mv s3://bucket1/folder/* s3://bucket2/folder/
Де,
{access_key} = Ваш дійсний ключ доступу для клієнта s3
{secret_key} = Ваш дійсний ключ scret для клієнта s3
Це працює нормально без проблем.
Дякую