如何在Amazon S3中重命名文件和文件夹?

时间:2014-01-17 11:22:18

标签: amazon-web-services amazon-s3

是否有任何功能可以在Amazon S3中重命名文件和文件夹?任何相关的建议也是受欢迎的。

21 个答案:

答案 0 :(得分:380)

我刚试过这个并且有效:

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

答案 1 :(得分:41)

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

答案 2 :(得分:18)

您可以使用AWS CLI commandsmv文件

答案 3 :(得分:17)

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

答案 4 :(得分:14)

我刚刚开始工作了。您可以像这样使用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}",
));

http://docs.aws.amazon.com/AmazonS3/latest/dev/CopyingObjectUsingPHP.html

答案 5 :(得分:11)

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

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

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

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

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

答案 6 :(得分:7)

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

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

答案 7 :(得分:4)

这可用于重命名同一文件夹中的文件

aws s3  mv s3://bucketname/folder_name1/test_original.csv s3://bucket/folder_name1/test_renamed.csv

答案 8 :(得分:3)

以下是使用S3 .NET SDK

在.NET中执行此操作的方法
var client = new Amazon.S3.AmazonS3Client(_credentials, _config);
client.CopyObject(oldBucketName, oldfilepath, newBucketName, newFilePath);
client.DeleteObject(oldBucketName, oldfilepath);

P.S。尝试尽可能使用客户端方法的“异步”版本,即使我没有这样做是为了可读性

答案 9 :(得分:3)

现在可以使用文件,选择文件,然后选择更多&gt;在GUI中重命名。

要重命名文件夹,您必须创建一个新文件夹,然后选择旧文件夹的内容并将其复制/粘贴(在&#34;更多&#34;再次)

答案 10 :(得分:2)

我们有2种方法可以在AWS S3存储上重命名文件-

1。使用CLI工具-

  

aws s3-递归mv s3:// bucket-name / dirname / oldfile s3:// bucket-name / dirname / newfile

2。使用SDK

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

答案 11 :(得分:1)

正如Naaz所回答的,直接重命名s3是不可能的。

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

代码正常工作只需添加你的aws访问密钥和密钥

这是我在代码中所做的事情

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

- &GT;复制完成后,删除源文件夹

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

}

答案 12 :(得分:0)

我所做的是创建一个新文件夹并将旧文件对象移动到新文件夹。

答案 13 :(得分:0)

文件和文件夹实际上是S3中的对象。您应该使用PUT OBJECT COPY重命名它们。见http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectCOPY.html

答案 14 :(得分:0)

如果要重命名 s3 文件夹中的大量文件,可以运行以下脚本。

    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   

答案 15 :(得分:0)

要重命名文件夹(从技术上讲,这是一组具有公用前缀作为键的对象),可以将aws cli move命令与--recursive选项一起使用。

aws s3 mv s3:// bucket / old_folder s3:// bucket / new_folder-递归

答案 16 :(得分:0)

下面是在s3上重命名文件的代码示例。由于存在火花o / p文件,我的文件为part-000 *,然后将其复制到同一位置的另一个文件名并删除part-000 *:

@RequestMapping(value = "/elements/{elementname}/records", method = RequestMethod.GET)
public ModelAndView getAllRecords(
  HttpServletRequest request, HttpServletResponse response,
  @RequestParam(value = "customerid", required = true) long customerId,
  @RequestParam(value = "userid", required = true) long userId,
  @RequestParam(value = "query", required = false) String query,
  throws Exception {
    Map < String, Object > model = new HashMap < String, Object > ();
    JsonObject records = elementService.searchRecords(query);
    ModelAndViewData msvd = elementService.commonRestService
                                .getModelAndView("dataObject", "streamingView");
    return new ModelAndView(msvd.getViewName(), handleCsvReportTypeRequest(records, customerId, userId));
}

public Map < String, Object > handleCsvReportTypeRequest(JsonObject records,
        String elementName, long customerId, long userId) throws Exception {
    StringBuffer csvData = new StringBuffer();
    // create csv data
    ModelAndViewData modelAndStreamingViewData = commonRestService.getModelAndView(
    "dataObject", "streamingView");
    byte[] byteArray = String.valueOf(csvData).getBytes();
    InputStream byteArrayInputStream = new ByteArrayInputStream(byteArray);
    model.put(modelAndStreamingViewData.getModelAttributeName(), byteArrayInputStream);

    model.put(DownloadConstants.CONTENT_TYPE, DownloadConstants.CSV_CONTENT_TYPE);
    model.put(DownloadConstants.FILENAME, "XYZ.csv");
    model.put(DownloadConstants.LAST_MODIFIED, new Date(System.currentTimeMillis()));
    model.put(DownloadConstants.CONTENT_LENGTH, Integer.valueOf(byteArray.length));
    return model;
}

答案 17 :(得分:0)

在AWS控制台中,如果您导航到S3,则会看到列出的文件夹。如果导航到该文件夹​​,则将看到列出的对象。右键单击即可重命名。或者,您可以选中对象前面的框,然后从名为“ ACTIONS”的下拉菜单中选择“重命名”。刚刚为我工作,2019年3月31日

答案 18 :(得分:0)

<<bucket>>/landing目录中的所有* .csv.err文件重命名为带有s3cmd的* .csv文件

 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)

答案 19 :(得分:0)

S3DirectoryInfo有一个MoveTo方法,它将一个目录移动到另一个目录中,这样移动的目录将成为另一个目录的子目录,其名称与原来的名称相同。

下面的扩展方法会将一个目录移动到另一个目录,即移动的目录将成为另一个目录。它实际上做的是创建新目录,将旧目录的所有内容移入其中,然后删除旧目录。

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

答案 20 :(得分:-1)

有一个软件可以与s3存储桶一起玩,以执行各种操作。

软件名称: S3浏览器

S3浏览器是Amazon S3和Amazon CloudFront的免费Windows客户端。 Amazon S3提供了一个简单的Web服务界面,可用于随时从Web上的任何位置存储和检索任意数量的数据。 Amazon CloudFront是一个内容交付网络(CDN)。它可以用于通过边缘位置的全球网络传送文件。


如果只有一次,则可以使用命令行执行以下操作:

(1)重命名同一存储桶中的文件夹:

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

(2)重命名存储桶:

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

在哪里

{access_key} =您对s3客户端的有效访问密钥

{secret_key} =您对s3客户端有效的密码密钥

一切正常,没问题。

谢谢