Yanıtlar:
S3'te bir dosyayı yeniden adlandırmak için doğrudan bir yöntem yoktur. Yapmanız gereken mevcut dosyayı yeni bir adla kopyalamak (sadece hedef anahtarı ayarlayın) ve eskisini silmek.
Ben sadece test ve çalışıyor:
aws s3 --recursive mv s3://<bucketname>/<folder_name_from> s3://<bucket>/<folder_name_to>
--recursive
?
s3://<bucketname>/<folder_name_from>
, yani altında daha derin bir klasör yapısı varsa 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
ardından rm
tercih To mv
?
Sen kullanabilirsiniz AWS CLI komutlarını için mv
dosyalar
AWS S3 grubundaki dosya ve klasörleri yeniden adlandırmak için AWS CLI veya s3cmd komutunu kullanabilirsiniz.
S3cmd kullanarak bir klasörü yeniden adlandırmak için aşağıdaki sözdizimini kullanın,
s3cmd --recursive mv s3://<s3_bucketname>/<old_foldername>/ s3://<s3_bucketname>/<new_folder_name>
AWS CLI kullanarak bir klasörü yeniden adlandırmak için aşağıdaki sözdizimini kullanın,
aws s3 --recursive mv s3://<s3_bucketname>/<old_foldername>/ s3://<s3_bucketname>/<new_folder_name>
Daha yeni çalıştım. AWS SDK'yı PHP için şu şekilde kullanabilirsiniz:
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 depolama alanındaki bir dosyayı yeniden adlandırabilmemiz için 2 yolumuz var -
1. CLI aracını kullanma -
aws s3 - yinelenen mv s3: // grup adı / dizin adı / eski dosya s3: // grup adı / dizin adı / yeni dosya
2. SDK kullanma
$s3->copyObject(array(
'Bucket' => $targetBucket,
'Key' => $targetKeyname,
'CopySource' => "{$sourceBucket}/{$sourceKeyname}",));
Bir klasörü GUI aracılığıyla yeniden adlandırmanın bir yolu yoktur, bunu başarmanın en hızlı (ve GUI'yi seviyorsanız) yolu düz eski bir kopya yapmaktır. Bunu başarmak için: GUI kullanarak S3'te yeni bir klasör oluşturun, eski klasörünüze gidin, tümünü seçin, "kopyala" yı işaretleyin ve sonra yeni klasöre gidin ve "yapıştır" ı seçin. İşiniz bittiğinde, eski klasörü kaldırın.
Bu basit yöntem çok hızlıdır çünkü S3'ten kendisine kopyalar (yeniden yüklemeye gerek yok veya bunun gibi bir şey) ve aynı zamanda beklediğiniz gibi kopyalanan nesnelerin izinlerini ve meta verilerini korur.
.NET ile bunu nasıl yapacağınız aşağıda açıklanmıştır S3 .NET SDK
:
var client = new Amazon.S3.AmazonS3Client(_credentials, _config);
client.CopyObject(oldBucketName, oldfilepath, newBucketName, newFilePath);
client.DeleteObject(oldBucketName, oldfilepath);
PS, okunabilirlik için bunu yapmadıysam bile, mümkün olduğunda istemci yöntemlerinin "Async" sürümlerini kullanmaya çalışın
Bu, aynı klasördeki dosyayı yeniden adlandırmak için çalışır
aws s3 mv s3://bucketname/folder_name1/test_original.csv s3://bucket/folder_name1/test_renamed.csv
Aşağıda, s3'teki dosyayı yeniden adlandırmak için kod örneği verilmiştir. Benim dosya kıvılcım o / p dosyası nedeniyle part-000 *, sonra ben aynı yerde başka bir dosya adına kopyalamak ve part-000 * silmek:
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 konsolunda, S3'e giderseniz klasörlerinizin listelendiğini görürsünüz. Klasöre giderseniz, listelenen nesneleri görürsünüz. sağ tıklayın ve yeniden adlandırabilirsiniz. VEYA, nesnenizin önündeki kutuyu işaretleyebilir, ardından ACTIONS adlı aşağı açılır menüden yeniden adlandırmayı seçebilirsiniz. Sadece benim için çalıştı, 3-31-2019
Naaz tarafından yanıtlandığı gibi, s3'ün doğrudan yeniden adlandırılması mümkün değildir.
tüm içeriği kopyalayacak bir kod snippet'i ekledim
kod çalışıyor sadece aws erişim anahtarınızı ve gizli anahtarınızı ekleyin
İşte kodda ne yaptım
-> kaynak klasör içeriğini (iç içe alt ve klasörler) kopyalayın ve hedef klasöre yapıştırın
-> kopyalama tamamlandığında kaynak klasörü silin
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;
}
}
Dosya ve klasör aslında S3'teki nesnelerdir. Bunları yeniden adlandırmak için PUT OBJECT COPY kullanmalısınız. Bkz. Http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectCOPY.html
Python, Ruby, Java, C#, PHP, Node.js, Android, iOS, browser JavaScript
) yapmak ve bunları kullanmak için hiçbir neden yoktur aws.amazon.com/tools
S3DirectoryInfo bir sahiptir MoveTo bir dizin hareket edecek yöntemini içine başlangıçta olduğu gibi taşınan dizin aynı adı taşıyan diğer dizininin bir alt olacaktır, öyle ki, başka bir dizine.
Aşağıdaki uzantı yöntemi bir dizini başka bir dizine taşıyacaktır, yani taşınan dizin diğer dizine dönüşecektir. Aslında yaptığı yeni dizini oluşturmak, eski dizinin tüm içeriğini dizine taşımak ve sonra eski dizini silmek.
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;
}
}
<<bucket>>/landing
dir içindeki tüm * .csv.err dosyalarını s3cmd ile * .csv dosyalarına yeniden adlandırın
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)
Farklı işlem türlerini gerçekleştirmek için s3 kepçe ile oynayabileceğiniz bir yazılım vardır.
Yazılım Adı: S3 Browser
S3 Tarayıcı Amazon S3 ve Amazon CloudFront için ücretsiz bir Windows istemcisidir. Amazon S3, web üzerindeki herhangi bir yerden, herhangi bir zamanda herhangi bir miktarda veri depolamak ve almak için kullanılabilecek basit bir web hizmetleri arayüzü sağlar. Amazon CloudFront bir içerik dağıtım ağıdır (CDN). Dosyalarınızı global bir uç konum ağı kullanarak iletmek için kullanılabilir.
Yalnızca tek bir süreyse, bu işlemleri gerçekleştirmek için komut satırını kullanabilirsiniz:
(1) Aynı gruptaki klasörü yeniden adlandırın:
s3cmd --access_key={access_key} --secret_key={secret_key} mv s3://bucket/folder1/* s3://bucket/folder2/
(2) Kovayı yeniden adlandırın:
s3cmd --access_key={access_key} --secret_key={secret_key} mv s3://bucket1/folder/* s3://bucket2/folder/
Nerede,
{access_key} = s3 istemcisi için geçerli erişim anahtarınız
{secret_key} = s3 istemcisi için geçerli güvenlik anahtarınız
Sorunsuz çalışıyor.
Teşekkürler