Odpowiedzi:
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.
Właśnie to przetestowałem i działa:
aws s3 --recursive mv s3://<bucketname>/<folder_name_from> s3://<bucket>/<folder_name_to>
--recursive
?
s3://<bucketname>/<folder_name_from>
, tj 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
następnie rm
korzystne mv
?
Można użyć poleceń CLI AWS do mv
plików
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>
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
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}",));
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ć.
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
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
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)
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
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;
}
}
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
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
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;
}
}
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)
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