Amazon S3'te dosya ve klasör nasıl yeniden adlandırılır?


208

Amazon S3'te dosya ve klasörleri yeniden adlandırmak için herhangi bir işlev var mı? İlgili herhangi bir öneri de kabul edilir.

Yanıtlar:


62

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.


112
Cevabınıza bir örnek verin, aksi takdirde yorum yapın.
EternalHour

38
@EternalHour iyi olurdu .. ama gerekli değil .. Sorunun dil hakkında bir göstergesi bile yok .. Öyleyse bir örnek yapmanın anlamı nedir?
Lipis

49
Bu yanlış cevap. Sv üzerindeki dosyaları mv kullanarak taşıyabilirsiniz. mv = yeniden adlandır
Nicolo

17
Bu iki nedenden dolayı yanlış bir yanıttır: 1) dosyayı sağ tıklayıp yeniden adlandırmak için GUI'yi kullanabilirsiniz ve 2) dosyayı move komutuyla veya sdk ile taşımadan önce belirtildiği gibi.
Maximus

11
S3'te yeniden adlandırmak için klasör adına sağ tıklayamazsınız.
area51

459

Ben sadece test ve çalışıyor:

aws s3 --recursive mv s3://<bucketname>/<folder_name_from> s3://<bucket>/<folder_name_to>

10
Atomik mi? İlk yürütme sırasında ikinci (ve aynı) komut başarısız olur mu?
Alex B

13
Hayır AWS atomik taşıma işlemi yok
AP.

1
Teşekkürler! Neden ihtiyacımız var --recursive?
Aziz Alto

2
@AzizAlto durumunda s3://<bucketname>/<folder_name_from>, yani altında daha derin bir klasör yapısı varsa s3://<bucketname>/<folder_name_from>/some/deeper/folders.
Ville

1
@JohnEikenberry Raj'ın yanlış yorumunda 15 artış var. Silinmelidir. Düzenleme: Ve şimdi silindi. Güzel.
Doug S

32
aws s3 cp s3://source_folder/ s3://destination_folder/ --recursive
aws s3 rm s3://source_folder --recursive

6
Is cpardından rmtercih To mv?
Pyderman

12
Herhangi bir silme işleminden önce kopyanın başarıyla yapılıp yapılmadığını kontrol edebildiğiniz için mv yerine cp / rm'yi tercih ederim.
Thang Tran

2
Komutun çıktısını gerçekten çalıştırmadan kontrol etmek için --dryrun bayrağını kullanabilirsiniz.
kmundnic


15

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>

1
Tüm .csv dosyalarını yeniden adlandırmam gerekirse ne olur. nasıl yaparım
LUZO

14

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


Yeniden adlandırmayı tamamen taklit etmek için (orijinal klasörü kopyalayıp sonra silmek zorunda kalmanın aksine), kaynağı ve hedefi aynı hale getirebildiniz mi? Ya da onları farklı hale getirmek ve ardından orijinal klasörü silmek zorunda mıydınız?
Pyderman

Sanırım bir kopyasını yaptım ve orijinali sildim. Hafızadan bu cevabı kendi referansım için yazdım - kabul edilen cevap aynı şeyi söylüyor, ancak kod örneğini vermedi. Öte yandan, AWS belgelerine yeni bir göz atmanızı tavsiye ederim, çünkü her zaman yeni seçenekler geliştiriyorlar.
Tom

Bu 'sadece' örneği, 'taşı' (veya 'yeniden adlandır') yerine kopyalama işlevini gösterir. Birkaç yaşında olduğunu biliyorum, ancak tam işlevsellik ile güncelleme şansınız var mı? S3'ün 'taşınan' nesneyi yeni zaman damgaları vs (iirc) ile yeni bir nesne olarak oluşturacağını unutmayın.
JamesBB

10

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}",));

8

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.


@Trisped Testime bir dakika önce, dosyalar web GUI kullanılarak yeniden adlandırılmış olabilir, ancak klasörler değil .
rinogo

7

Bu artık Dosyalar için mümkündür, dosyayı seçin ve ardından GUI'de Diğer> Yeniden Adlandır'ı seçin.

Bir klasörü yeniden adlandırmak için, bunun yerine yeni bir klasör oluşturmanız ve eskisinin içeriğini seçip kopyalayıp yapıştırmanız gerekir ("Diğer" altında)


5

.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


4

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

1
Aynı klasörde olması gerekmez. Verdiğiniz komut bir cazibe gibi çalışır. Teşekkür ederim.
R.Cha

3

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)

sadece bunun python kullandığını unutmayın
f.khantsis

2

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


"yeniden adlandırma" klasörler için benim için gri renkte ve internet "S3 tarayıcısındaki klasörler için yeniden adlandırma neden gri görünüyor?" gibi sorularla dolu.
Steve

1

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;
}

}


2
Bu uygulama, ima ettiğiniz gibi tüm içeriği döndürmediği için lütfen kodunuzu düzenlemeyi düşünün, çünkü listObjects (bucketName, keyName) öğesini çağırdığınızda, en fazla 1000 öğe döndürdüğünden, bilmek için ObjectListing.isTruncated () yöntemini çağırmalısınız. yeni bir talep çağrısı gerekiyorsa. Bunu referans olarak kabul edin docs.aws.amazon.com/AmazonS3/latest/dev/…
le0diaz

Bu işe yarıyor ama yukarıdaki yoruma da katılıyorum. Sadece List <S3ObjectSummary> dosyasını değiştirin. FileList = s3client.listObjects (bucketName, keyName) .getObjectSummaries (); ObjectListing ile objectListing = s3.listObjects (bucketName, keyName); Liste <S3ObjectSummary> fileList = yeni ArrayList <> (); fileList.addAll (objectListing.getObjectSummaries ()); while (objectListing.isTruncated ()) {objectListing = s3.listNextBatchOfObjects (objectListing); fileList.addAll (objectListing.getObjectSummaries ()); }
Karthik

0

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


1
Bazı diller bir SDK Kaynak Birliğinin sunduğu sahip olmayan ederken, büyük olanlar ( 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
Don Cheadle

3
AWS'nin Java SDK'sı istemci tarafı uygulamalar için çok büyük (ve yekpare).
Jesse Barnum

0

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;
    }
}

0

<<bucket>>/landingdir 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)

-2

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.