Jak zmienić nazwę plików i folderów w Amazon S3?

207

Czy jest jakaś funkcja zmiany nazwy plików i folderów w Amazon S3? Wszelkie powiązane sugestie są również mile widziane.

Shan
źródło

Odpowiedzi:

62

Nie ma bezpośredniej metody zmiany nazwy pliku w S3. Co musisz zrobić, to skopiować istniejący plik pod nową nazwą (wystarczy ustawić klucz docelowy) i usunąć stary.

Naaz Muhammadh
źródło
112
Podaj przykład z odpowiedzią, w przeciwnym razie zrób komentarz.
EternalHour
38
@EternalHour byłby miły .. ale nie jest to konieczne .. Pytanie nie ma nawet żadnych wskazówek na temat języka .. więc po co robić przykład?
Lipis,
49
To zła odpowiedź. Możesz przenosić pliki na S3 za pomocą mv. mv = zmień nazwę
Nicolo
17
To zła odpowiedź z dwóch powodów: 1) możesz użyć GUI, aby kliknąć prawym przyciskiem myszy i zmienić nazwę pliku oraz 2) jak wspomniano, zanim możesz przenieść plik za pomocą polecenia move lub za pomocą sdk.
Maximus
11
Nie można kliknąć prawym przyciskiem myszy nazwy folderu, aby zmienić jego nazwę na S3.
area51
459

Właśnie to przetestowałem i działa:

aws s3 --recursive mv s3://<bucketname>/<folder_name_from> s3://<bucket>/<folder_name_to>
Bennythe Judge
źródło
10
Czy to jest atomowe? Czy drugie (i to samo) polecenie nie powiedzie się podczas wykonywania pierwszego?
Alex B,
13
Żaden AWS nie ma operacji ruchu atomowego
AP.
1
Dzięki! Dlaczego potrzebujemy --recursive?
Aziz Alto,
2
@AzizAlto W przypadku głębszej struktury folderów s3://<bucketname>/<folder_name_from>, tj s3://<bucketname>/<folder_name_from>/some/deeper/folders.
Ville
1
@JohnEikenberry Nie mogę uwierzyć, że zły komentarz Raja ma 15 pozytywnych opinii. Należy go usunąć. Edycja: i właśnie został usunięty. Miły.
Doug S
31
aws s3 cp s3://source_folder/ s3://destination_folder/ --recursive
aws s3 rm s3://source_folder --recursive
Thang Tran
źródło
6
Jest cpnastępnie rmkorzystne mv?
Pyderman,
12
Wolę cp / rm niż mv, ponieważ możesz sprawdzić, czy kopia została wykonana pomyślnie przed wykonaniem jakiegokolwiek usunięcia.
Thang Tran
2
Możesz użyć flagi --dryrun, aby sprawdzić wyjście polecenia bez jego uruchamiania.
kmundnic
15

Możesz użyć polecenia AWS CLI lub polecenia s3cmd, aby zmienić nazwę plików i folderów w segmencie AWS S3.

Korzystając z S3cmd, użyj następującej składni, aby zmienić nazwę folderu,

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

Korzystając z interfejsu AWS CLI, użyj następującej składni, aby zmienić nazwę folderu,

aws s3 --recursive mv s3://<s3_bucketname>/<old_foldername>/ s3://<s3_bucketname>/<new_folder_name>
Basheer.O
źródło
1
Co jeśli będę musiał zmienić nazwę wszystkich plików .csv. jak to robię?
LUZO,
14

Właśnie to działa. Możesz użyć AWS SDK dla PHP w następujący sposób:

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

Tomek
źródło
Aby w pełni naśladować zmianę nazwy (w przeciwieństwie do kopiowania, a następnie usuwania oryginalnego folderu), czy byłeś w stanie ustawić źródło i cel tak samo? A może musiałeś je odróżnić, a następnie usunąć oryginalny folder?
Pyderman,
Myślę, że zrobiłem kopię, a następnie usunąłem oryginał. Z pamięci napisałem tę odpowiedź dla własnego odniesienia - zaakceptowana odpowiedź mówi to samo, ale nie podała przykładu kodu. Z drugiej strony radzę jednak przejrzeć dokumenty AWS, ponieważ cały czas rozwijają się nowe opcje.
Tom
W tym przykładzie „po prostu” pokazuje funkcję kopiowania, a nie „przenieś” (lub „zmień nazwę”). Wiem, że ma już kilka lat, ale czy jest szansa, że ​​zaktualizujesz go o pełną funkcjonalność? Zauważ, że S3 utworzy obiekt „przeniesiony” jako nowy obiekt z nowymi znacznikami czasu itp. (Iirc).
JamesBB
10

Mamy 2 sposoby zmiany nazwy pliku w pamięci AWS S3 -

1. Korzystanie z narzędzia CLI -

aws s3 --recursive mv s3: // nazwa-wiadra / nazwa_katalogu / stary plik s3: // nazwa-wiadra / nazwa_katalogu / nowy plik

2.Korzystając z SDK

$s3->copyObject(array(
'Bucket'     => $targetBucket,
'Key'        => $targetKeyname,
'CopySource' => "{$sourceBucket}/{$sourceKeyname}",));
ZATRUĆ
źródło
8

Nie ma możliwości zmiany nazwy folderu za pomocą GUI, najszybszym (i najłatwiejszym, jeśli lubisz GUI) sposobem na osiągnięcie tego jest wykonanie zwykłej starej kopii. Aby to osiągnąć: utwórz nowy folder na S3 za pomocą GUI, przejdź do starego folderu, zaznacz wszystko, zaznacz „kopiuj”, a następnie przejdź do nowego folderu i wybierz „wklej”. Po zakończeniu usuń stary folder.

Ta prosta metoda jest bardzo szybka, ponieważ jest kopią z S3 do siebie (nie trzeba jej ponownie przesyłać itp.), A także zachowuje uprawnienia i metadane kopiowanych obiektów, tak jak można się spodziewać.

orcaman
źródło
@Trisped W moich testach przed chwilą nazwy plików mogą być zmieniane przy użyciu internetowego interfejsu GUI, ale nie folderów .
rinogo
7

Jest to teraz możliwe w przypadku plików, wybierz plik, a następnie wybierz Więcej> Zmień nazwę w GUI.

Aby zmienić nazwę folderu, musisz zamiast tego utworzyć nowy folder, wybrać zawartość starego i skopiować / wkleić go (ponownie w „Więcej”)

Jethro
źródło
5

Oto jak to zrobić w .NET, używając S3 .NET SDK:

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

PS starają się używać wersji „asynchronicznych” metod klienta tam, gdzie to możliwe, nawet jeśli nie zrobiłem tego dla czytelności

Alex
źródło
4

Działa to w przypadku zmiany nazwy pliku w tym samym folderze

aws s3  mv s3://bucketname/folder_name1/test_original.csv s3://bucket/folder_name1/test_renamed.csv
Wsparcie techniczne
źródło
1
Niekoniecznie w tym samym folderze. Podane polecenie działa jak urok. Dziękuję Ci.
R.Cha,
3

Poniżej znajduje się przykład kodu do zmiany nazwy pliku na s3. Mój plik miał część 000 * z powodu pliku Spark o / p, a następnie skopiowałem go do innej nazwy pliku w tej samej lokalizacji i usunąłem część 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)
Vikas
źródło
zwróć uwagę, że używa to Pythona
f. kantis
2

Jeśli w konsoli AWS przejdziesz do S3, zobaczysz swoje foldery na liście. Jeśli przejdziesz do folderu, zobaczysz wymienione obiekty. kliknij prawym przyciskiem myszy i możesz zmienić nazwę. LUB możesz zaznaczyć pole przed obiektem, a następnie z menu rozwijanego o nazwie AKCJE możesz wybrać zmianę nazwy. Właśnie dla mnie pracował, 3-31-2019

1082E1984
źródło
„zmiana nazwy” jest dla mnie wyszarzona dla folderów, a internet pełen jest pytań takich jak „dlaczego zmiana nazwy jest wyszarzona dla folderów w przeglądarce S3?”
Steve
1

Jak odpowiedział Naaz, bezpośrednia zmiana nazwy s3 nie jest możliwa.

załączyłem fragment kodu, który skopiuje całą zawartość

kod działa, po prostu dodaj swój klucz dostępu aws i tajny klucz

oto co zrobiłem w kodzie

-> skopiuj zawartość folderu źródłowego (zagnieżdżone dziecko i foldery) i wklej do folderu docelowego

-> po zakończeniu kopiowania usuń folder źródłowy

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
źródło
2
Rozważ edycję kodu, ponieważ ta implementacja nie zwraca całej zawartości, jak sugerowałeś, ponieważ gdy wywołujesz listObjects (bucketName, keyName), zwraca co najwyżej 1000 elementów, powinieneś wywołać metodę ObjectListing.isTruncated (), aby wiedzieć jeśli konieczne jest nowe żądanie połączenia. Potraktuj to jako odniesienie docs.aws.amazon.com/AmazonS3/latest/dev/…
le0diaz
To działa, ale zgadzam się również z powyższym komentarzem. Po prostu zamień List <S3ObjectSummary> fileList = s3client.listObjects (nazwa_kopy, nazwa_klucza) .getObjectSummaries (); z ObjectListing objectListing = s3.listObjects (bucketName, keyName); List <S3ObjectSummary> fileList = new ArrayList <> (); fileList.addAll (objectListing.getObjectSummaries ()); while (objectListing.isTruncated ()) {objectListing = s3.listNextBatchOfObjects (objectListing); fileList.addAll (objectListing.getObjectSummaries ()); }
Karthik
0

Plik i folder są w rzeczywistości obiektami w S3. Powinieneś użyć PUT OBJECT COPY, aby zmienić ich nazwę. Zobacz http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectCOPY.html

okwap
źródło
1
podczas gdy w niektórych językach nie ma zestawu SDK oferowanego przez AWS, duże ( Python, Ruby, Java, C#, PHP, Node.js, Android, iOS, browser JavaScript) mają i nie ma powodu, aby nie używać ich aws.amazon.com/tools
Don Cheadle
3
Java SDK z AWS jest zbyt duży (i monolityczny) dla aplikacji po stronie klienta.
Jesse Barnum
0

S3DirectoryInfo ma metodę MoveTo , która przenosi jeden katalog do innego katalogu, tak że przeniesiony katalog stanie się podkatalogiem innego katalogu o takiej samej nazwie, jak pierwotnie.

Poniższa metoda rozszerzenia przeniesie jeden katalog do innego, tzn. Przeniesiony katalog stanie się drugim katalogiem. W rzeczywistości tworzy nowy katalog, przenosi do niego całą zawartość starego katalogu, a następnie usuwa stary.

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
źródło
0

zmień nazwę wszystkich plików * .csv.err w katalogu na pliki <<bucket>>/landing* .csv za pomocą 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
źródło
-2

Jest jedno oprogramowanie, w którym możesz grać z łyżką s3 do wykonywania różnych rodzajów operacji.

Nazwa oprogramowania: S3 Browser

S3 Browser to darmowy klient Windows dla Amazon S3 i Amazon CloudFront. Amazon S3 zapewnia prosty interfejs usług internetowych, za pomocą którego można przechowywać i pobierać dowolną ilość danych w dowolnym czasie i z dowolnego miejsca w sieci. Amazon CloudFront to sieć dostarczania treści (CDN). Może być używany do dostarczania plików przy użyciu globalnej sieci lokalizacji brzegowych.


Jeśli jest to tylko jeden raz, możesz użyć wiersza polecenia do wykonania następujących operacji:

(1) Zmień nazwę folderu w tym samym segmencie:

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

(2) Zmień nazwę wiadra:

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

Gdzie,

{access_key} = Twój prawidłowy klucz dostępu do klienta s3

{secret_key} = Twój prawidłowy klucz scret dla klienta s3

Działa bez problemu.

Dzięki

Radadiya Nikunj
źródło