Bagaimana cara mengganti nama file dan folder di Amazon S3?

209

Apakah ada fungsi untuk mengganti nama file dan folder di Amazon S3? Setiap saran terkait juga diterima.

Shan
sumber

Jawaban:

62

Tidak ada metode langsung untuk mengubah nama file di S3. Yang harus Anda lakukan adalah menyalin file yang ada dengan nama baru (hanya mengatur kunci target) dan menghapus yang lama.

Naaz Muhammadh
sumber
112
Berikan contoh dengan jawaban Anda, jika tidak buat komentar.
EternalHour
38
@EternalHour akan menyenangkan .. tapi itu tidak perlu .. Pertanyaannya bahkan tidak memiliki indikasi tentang bahasa .. jadi apa gunanya melakukan contoh?
Lipis
50
Ini jawaban yang salah. Anda dapat memindahkan file di S3 menggunakan mv. mv = ganti nama
Nicolo
17
Ini adalah jawaban yang salah karena dua alasan: 1) Anda dapat menggunakan GUI untuk mengklik kanan dan mengganti nama file, dan 2) seperti yang telah disebutkan sebelum Anda dapat memindahkan file dengan perintah pindah atau melalui sdk.
Maximus
11
Anda tidak dapat mengklik kanan pada nama folder untuk mengganti nama di S3.
area51
460

Saya baru saja menguji ini dan berhasil:

aws s3 --recursive mv s3://<bucketname>/<folder_name_from> s3://<bucket>/<folder_name_to>
bennythejudge
sumber
10
Apakah itu atom? Akankah perintah kedua (dan yang sama) gagal saat pertama dijalankan?
Alex B
13
Tidak ada AWS yang tidak memiliki operasi pemindahan atom
AP.
1
Terima kasih! Mengapa kita perlu --recursive?
Aziz Alto
2
@ AzizAlto Jika ada struktur folder yang lebih dalam s3://<bucketname>/<folder_name_from>, yaitu s3://<bucketname>/<folder_name_from>/some/deeper/folders.
Ville
1
@JohnEikenberry Saya tidak percaya komentar salah Raj memiliki 15 upvotes Itu harus dihapus. Sunting: Dan itu baru saja dihapus. Bagus.
Doug S
32
aws s3 cp s3://source_folder/ s3://destination_folder/ --recursive
aws s3 rm s3://source_folder --recursive
Thang Tran
sumber
6
Apakah cpdiikuti oleh rmlebih disukai mv?
Pyderman
12
Saya lebih suka cp / rm daripada mv karena Anda dapat memeriksa apakah salinan telah berhasil dibuat sebelum melakukan penghapusan.
Thang Tran
2
Anda dapat menggunakan flag --dryrun untuk memeriksa output dari perintah tanpa benar-benar menjalankannya.
kmundnic
26

Anda dapat menggunakan perintah AWS CLI untuk mvfile

Cavaz
sumber
15

Anda bisa menggunakan perintah AWS CLI atau s3cmd untuk mengganti nama file dan folder dalam AWS S3 bucket.

Menggunakan S3cmd, gunakan sintaks berikut untuk mengubah nama folder,

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

Menggunakan AWS CLI, gunakan sintaks berikut untuk mengubah nama folder,

aws s3 --recursive mv s3://<s3_bucketname>/<old_foldername>/ s3://<s3_bucketname>/<new_folder_name>
Basheer.O
sumber
1
Bagaimana jika saya perlu mengganti nama semua file .csv. kenapa saya lakukan?
LUZO
14

Saya baru saja bekerja. Anda dapat menggunakan AWS SDK untuk PHP seperti ini:

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
sumber
Untuk sepenuhnya meniru penamaan ulang (bukan menyalin dan kemudian harus menghapus folder asli), apakah Anda dapat membuat sumber dan menargetkan yang sama? Atau Anda harus membuatnya berbeda, lalu hapus folder aslinya?
Pyderman
Saya pikir saya sudah menyalin lalu menghapus yang asli. Dari memori saya menulis jawaban ini untuk referensi saya sendiri - jawaban yang diterima mengatakan hal yang sama, tetapi tidak memberikan contoh kode. Di sisi lain, saya akan menyarankan Anda untuk memiliki pandangan baru melalui dokumen AWS, karena mereka terus mengembangkan opsi baru.
Tom
Contoh 'hanya' ini menunjukkan fungsionalitas penyalinan, alih-alih 'pindah', (atau 'mengganti nama'). Saya tahu ini berumur beberapa tahun, tetapi apakah Anda dapat memperbaruinya dengan fungsionalitas lengkap? Perhatikan bahwa S3 akan membuat objek yang 'dipindahkan' sebagai objek baru dengan stempel waktu baru, dll. (Iirc).
JamesBB
10

Kami memiliki 2 cara dimana kami dapat mengganti nama file di penyimpanan AWS S3 -

1. Menggunakan alat CLI -

aws s3 - rekursif mv s3: // bucket-name / dirname / oldfile s3: // bucket-name / dirname / newfile

2.Menggunakan SDK

$s3->copyObject(array(
'Bucket'     => $targetBucket,
'Key'        => $targetKeyname,
'CopySource' => "{$sourceBucket}/{$sourceKeyname}",));
MERACUNI
sumber
8

Tidak ada cara untuk mengganti nama folder melalui GUI, cara tercepat (dan termudah jika Anda suka GUI) untuk mencapai ini adalah dengan melakukan salinan lama. Untuk mencapai ini: buat folder baru di S3 menggunakan GUI, buka folder lama Anda, pilih semua, tandai "salin" dan kemudian navigasikan ke folder baru dan pilih "tempel". Setelah selesai, hapus folder lama.

Metode sederhana ini sangat cepat karena merupakan salinan dari S3 ke dirinya sendiri (tidak perlu mengunggah kembali atau semacamnya) dan juga mempertahankan izin dan metadata dari objek yang disalin seperti yang Anda harapkan.

orcaman
sumber
@Trisped Dalam pengujian saya beberapa saat yang lalu, file dapat diubah namanya menggunakan GUI web, tetapi tidak folder .
rinogo
7

Ini sekarang memungkinkan untuk File, pilih file lalu pilih Lainnya> Ganti nama di GUI.

Untuk mengganti nama folder, Anda harus membuat folder baru, dan memilih konten yang lama dan menyalin / menempelkannya di (Di bawah "Lainnya")

Yitro
sumber
5

Inilah cara Anda melakukannya di .NET, menggunakan S3 .NET SDK:

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

PS mencoba menggunakan versi "Async" dari metode klien jika memungkinkan, meskipun saya belum melakukannya untuk keterbacaan

Alex
sumber
4

Ini berfungsi untuk mengganti nama file di folder yang sama

aws s3  mv s3://bucketname/folder_name1/test_original.csv s3://bucket/folder_name1/test_renamed.csv
Dukungan teknologi
sumber
1
Belum tentu di folder yang sama. Perintah yang Anda berikan berfungsi seperti mantra. Terima kasih.
R.Cha
3

Di bawah ini adalah contoh kode untuk mengganti nama file di s3. File saya adalah bagian-000 * karena percikan file / p, maka saya menyalinnya ke nama file lain di lokasi yang sama dan menghapus bagian-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)
Vara
sumber
Catat saja bahwa ini menggunakan python
f.khantsis
2

Di konsol AWS, jika Anda menavigasi ke S3, Anda akan melihat folder Anda terdaftar. Jika Anda menavigasi ke folder, Anda akan melihat objek terdaftar. klik kanan dan Anda dapat mengganti nama. ATAU, Anda dapat mencentang kotak di depan objek Anda, lalu dari menu pull down bernama TINDAKAN, Anda dapat memilih ganti nama. Hanya bekerja untuk saya, 3-31-2019

1082E1984
sumber
"ganti nama" diklik untuk saya untuk folder, dan internet penuh dengan pertanyaan seperti "mengapa diganti nama diklik untuk folder di browser S3?"
Steve
1

Seperti yang dijawab oleh Naaz, penggantian nama langsung s3 tidak dimungkinkan.

saya telah melampirkan cuplikan kode yang akan menyalin semua konten

kode berfungsi, tambahkan saja kunci akses aws dan kunci rahasia Anda

inilah yang saya lakukan dalam kode

-> salin isi folder sumber (anak bersarang dan folder) dan disisipkan di folder tujuan

-> ketika penyalinan selesai, hapus folder sumber

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
sumber
2
Harap pertimbangkan untuk mengedit kode Anda karena implementasi ini tidak mengembalikan semua konten, karena Anda tersirat, karena ketika Anda memanggil listObjects (bucketName, keyName), ia mengembalikan paling banyak 1000 item, Anda harus memanggil metode ObjectListing.isTruncated () untuk mengetahui jika diperlukan permintaan panggilan baru. Pertimbangkan ini sebagai referensi docs.aws.amazon.com/AmazonS3/latest/dev/…
le0diaz
Ini berfungsi tetapi saya juga setuju dengan komentar di atas. Cukup ganti List <S3ObjectSummary> fileList = s3client.listObjects (bucketName, keyName) .getObjectSummaries (); dengan ObjectListing objectListing = s3.listObjects (bucketName, keyName); Daftar <S3ObjectSummary> fileList = ArrayList baru <> (); fileList.addAll (objectListing.getObjectSummaries ()); while (objectListing.isTruncated ()) {objectListing = s3.listNextBatchOfObjects (objectListing); fileList.addAll (objectListing.getObjectSummaries ()); }
Karthik
0

File dan folder sebenarnya objek dalam S3. Anda harus menggunakan PUT OBJECT COPY untuk mengganti nama mereka. Lihat http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectCOPY.html

okwap
sumber
1
sementara beberapa bahasa tidak memiliki SDK yang ditawarkan oleh AWS, yang besar ( Python, Ruby, Java, C#, PHP, Node.js, Android, iOS, browser JavaScript) melakukannya dan tidak ada alasan untuk tidak menggunakannya aws.amazon.com/tools
Don Cheadle
3
Java SDK dari AWS terlalu besar (dan monolitik) untuk aplikasi sisi klien.
Jesse Barnum
0

S3DirectoryInfo memiliki metode MoveTo yang akan memindahkan satu direktori ke direktori lain, sehingga direktori yang dipindahkan akan menjadi subdirektori dari direktori lain dengan nama yang sama seperti aslinya.

Metode ekstensi di bawah ini akan memindahkan satu direktori ke direktori lain, yaitu direktori yang dipindahkan akan menjadi direktori lainnya. Apa yang sebenarnya dilakukannya adalah membuat direktori baru, memindahkan semua isi direktori lama ke dalamnya, dan kemudian menghapus yang lama.

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

ganti nama semua file * .csv.err di <<bucket>>/landingdir menjadi file * .csv dengan 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
sumber
-2

Ada satu perangkat lunak tempat Anda dapat bermain dengan s3 bucket untuk melakukan berbagai jenis operasi.

Nama Perangkat Lunak: Browser S3

S3 Browser adalah klien Windows freeware untuk Amazon S3 dan Amazon CloudFront. Amazon S3 menyediakan antarmuka layanan web sederhana yang dapat digunakan untuk menyimpan dan mengambil sejumlah data, kapan saja, dari mana saja di web. Amazon CloudFront adalah jaringan pengiriman konten (CDN). Ini dapat digunakan untuk mengirimkan file Anda menggunakan jaringan global lokasi tepi.


Jika hanya satu kali maka Anda dapat menggunakan baris perintah untuk melakukan operasi ini:

(1) Ganti nama folder dalam ember yang sama:

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

(2) Ganti nama Ember:

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

Dimana,

{access_key} = Kunci akses Anda yang valid untuk klien s3

{secret_key} = Kunci scret Anda yang valid untuk klien s3

Ini berfungsi dengan baik tanpa masalah.

Terima kasih

Radadiya Nikunj
sumber