Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 如何在AmazonS3中重命名文件和文件夹?_Amazon Web Services_Amazon S3 - Fatal编程技术网

Amazon web services 如何在AmazonS3中重命名文件和文件夹?

Amazon web services 如何在AmazonS3中重命名文件和文件夹?,amazon-web-services,amazon-s3,Amazon Web Services,Amazon S3,AmazonS3中是否有重命名文件和文件夹的功能?任何相关的建议都是欢迎的。文件和文件夹实际上是S3中的对象。应该使用“放置对象副本”重命名它们。请参见您可以使用来创建文件我刚刚开始工作。您可以使用AWS SDK for PHP,如下所示: use Aws\S3\S3Client; $sourceBucket = '*** Your Source Bucket Name ***'; $sourceKeyname = '*** Your Source Object Key ***'; $targ

AmazonS3中是否有重命名文件和文件夹的功能?任何相关的建议都是欢迎的。

文件和文件夹实际上是S3中的对象。应该使用“放置对象副本”重命名它们。请参见

您可以使用来创建文件

我刚刚开始工作。您可以使用AWS SDK for PHP,如下所示:

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

在S3中没有直接方法重命名文件。您需要做的是用新名称复制现有文件(只需设置目标键)并删除旧文件。

无法通过GUI重命名文件夹,实现这一点的最快(如果您喜欢GUI,也是最简单的)方法是执行普通的旧副本。要实现这一点:使用GUI在S3上创建新文件夹,进入旧文件夹,选择“全部”,标记“复制”,然后导航到新文件夹并选择“粘贴”。完成后,删除旧文件夹

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

这个简单的方法非常快,因为它可以从S3复制到自身(不需要重新上传或类似的东西),并且它还可以像您所期望的那样维护复制对象的权限和元数据。

我刚刚测试了这个方法,它可以工作:

aws s3 cp s3://source_folder/ s3://destination_folder/ --recursive
aws s3 rm s3://source_folder --recursive
aws s3 --recursive mv s3://<bucketname>/<folder_name_from> s3://<bucket>/<folder_name_to>
aws s3——递归mv s3:///s3:///
正如Naaz所回答的,不可能直接重命名s3

我附加了一个代码片段,它将复制所有的内容

代码正在运行,只需添加aws访问密钥和密钥

下面是我在代码中所做的

->复制源文件夹内容(嵌套的子文件夹和文件夹)并粘贴到目标文件夹中

->复制完成后,删除源文件夹

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;
}
package com.bighhalf.doc.amazon;
导入java.io.ByteArrayInputStream;
导入java.io.InputStream;
导入java.util.List;
导入com.amazonaws.auth.AWSCredentials;
导入com.amazonaws.auth.BasicAWSCredentials;
导入com.amazonaws.services.s3.AmazonS3;
导入com.amazonaws.services.s3.amazon3Client;
导入com.amazonaws.services.s3.model.CopyObjectRequest;
导入com.amazonaws.services.s3.model.ObjectMetadata;
导入com.amazonaws.services.s3.model.PutObjectRequest;
导入com.amazonaws.services.s3.model.S3ObjectSummary;
公开课考试{
公共静态布尔重命名文件夹(字符串bucketName、字符串keyName、字符串newName){
布尔结果=假;
试一试{
AmazonS3 s3client=getAmazonS3ClientObject();
List fileList=s3client.listObjects(bucketName,keyName).getObjectSummaries();
//开始创建空文件夹的某些元数据
ObjectMetadata=新的ObjectMetadata();
metadata.setContentLength(0);
InputStream emptyContent=new ByteArrayInputStream(新字节[0]);
//用于创建空文件夹的某些元数据结束
//最终位置是现有文件夹的子文件夹内容应放在的位置
字符串finalLocation=keyName.substring(0,keyName.lastIndexOf('/')+1)+newName;
用于(S3ObjectSummary文件:文件列表){
String key=file.getKey();
//使用新位置更新子文件夹位置
字符串destinationKeyName=key.replace(keyName,finalLocation);
if(key.charAt(key.length()-1)=='/')){
//如果名称以后缀(/)结尾,则表示其为a文件夹
PutObjectRequest PutObjectRequest=新的PutObjectRequest(bucketName、destinationKeyName、emptyContent、元数据);
s3client.putObject(putObjectRequest);
}否则{
//如果名称未以后缀(/)结尾,则表示它是一个文件
CopyObjectRequest CopyObjectRequest=新的CopyObjectRequest(bucketName,
file.getKey(),bucketName,destinationKeyName);
s3client.copyObject(copyObjRequest);
}
}
布尔值isFodlerDeleted=deleteFolderFromAws(bucketName,keyName);
返回已删除;
}捕获(例外e){
e、 printStackTrace();
}
返回结果;
}
公共静态布尔deleteFolderFromAws(字符串bucketName、字符串keyName){
布尔结果=假;
试一试{
AmazonS3 s3client=getAmazonS3ClientObject();
//删除文件夹子项
List fileList=s3client.listObjects(bucketName,keyName).getObjectSummaries();
用于(S3ObjectSummary文件:文件列表){
s3client.deleteObject(bucketName,file.getKey());
}
//删除实际传递的文件夹
s3client.deleteObject(bucketName、keyName);
结果=真;
}捕获(例外e){
e、 printStackTrace();
}
返回结果;
}
公共静态void main(字符串[]args){
初始化对象();
布尔结果=重命名文件夹(bucketName、keyName、newName);
系统输出打印项次(结果);
}
私有静态AWSCredentials凭证=null;
私有静态AmazonS3 amazonS3Client=null;
私有静态最终字符串访问_KEY=“”;
私有静态最终字符串SECRET_ACCESS_KEY=“”;
私有静态最终字符串bucketName=“”;
私有静态最终字符串keyName=“”;
//将文件夹c从密钥名重命名为x
私有静态最终字符串newName=“”;
publicstaticvoid initializemazonobjects(){
凭证=新的基本凭证(访问密钥、机密访问密钥);
amazonS3Client=新的amazonS3Client(凭证);
}
公共静态AmazonS3 getAmazonS3ClientObject(){
返回amazonS3Client;
}

}

您可以使用AWS CLI或s3cmd命令重命名AWS S3存储桶中的文件和文件夹

使用S3cmd,使用以下语法重命名文件夹

s3cmd --recursive mv s3://<s3_bucketname>/<old_foldername>/ s3://<s3_bucketname>/<new_folder_name>
aws s3 --recursive mv s3://<s3_bucketname>/<old_foldername>/ s3://<s3_bucketname>/<new_folder_name>
s3cmd——递归mv s3:///s3:///
使用AWS CLI,使用以下语法重命名文件夹

s3cmd --recursive mv s3://<s3_bucketname>/<old_foldername>/ s3://<s3_bucketname>/<new_folder_name>
aws s3 --recursive mv s3://<s3_bucketname>/<old_foldername>/ s3://<s3_bucketname>/<new_folder_name>
aws s3——递归mv s3:///s3:///
以下是您如何在.NET中使用
S3.NET SDK进行此操作的方法

var client = new Amazon.S3.AmazonS3Client(_credentials, _config);
client.CopyObject(oldBucketName, oldfilepath, newBucketName, newFilePath);
client.DeleteObject(oldBucketName, oldfilepath);
另外,尽可能使用“异步”版本的客户端方法,即使我没有这样做以提高可读性
s3cmd --access_key={access_key} --secret_key={secret_key} mv s3://bucket1/folder/* s3://bucket2/folder/
 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)
$s3->copyObject(array(
'Bucket'     => $targetBucket,
'Key'        => $targetKeyname,
'CopySource' => "{$sourceBucket}/{$sourceKeyname}",));
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)
    FILES=$(aws s3api list-objects --bucket your_bucket --prefix 'your_path' --delimiter '/'  | jq -r '.Contents[] | select(.Size > 0) | .Key' | sed '<your_rename_here>')
     for i in $FILES
     do
      aws s3 mv s3://<your_bucket>/${i}.gz s3://<your_bucket>/${i}
     done