是否有任何功能可以在Amazon S3中重命名文件和文件夹?任何相关的建议也是受欢迎的。
答案 0 :(得分:380)
我刚试过这个并且有效:
aws s3 --recursive mv s3://<bucketname>/<folder_name_from> s3://<bucket>/<folder_name_to>
答案 1 :(得分:41)
在S3中没有直接重命名文件的方法。您需要做的是使用新名称复制现有文件(只需设置目标密钥)并删除旧文件。
答案 2 :(得分:18)
您可以使用AWS CLI commands至mv
文件
答案 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
:
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客户端有效的密码密钥
一切正常,没问题。
谢谢