我理解在亚马逊s3中,there's only buckets and objects。文件夹和所有文件都没有放在同一个存储桶中,而看似位于文件夹中的对象只在文件名前面有一个前缀。
现在我的问题是......有没有办法使用AWS CLI更改PREFIX?
答案 0 :(得分:5)
在awscli2中,我可以使用以下命令完成此操作:
aws s3 mv --recursive s3://bucket/prefix1/ s3://bucket/prefix2/
在执行此操作之前,我通过检查以下内容的输出进行了快速测试(dryrun):
aws s3 --dryrun mv --recursive s3://bucket/prefix1/ s3://bucket/prefix2/
答案 1 :(得分:1)
是的,但不容易。请记住,“前缀”只是文件名的一部分,更改前缀将要求您重命名其中包含该前缀的每个文件 - 例如,如果您的存储桶包含以下文件,并且您想要重命名{{ 1}}到/oldprefix/
:
/newprefix/
您需要执行三个*操作才能完成前缀更改:每个对象一个。没有办法在一次操作中重命名它们。一般来说,您应该尽量避免需要大规模重命名的情况,因为这可能是一个相当漫长的过程。
*:如果你想对它挑剔,实际上不需要三个但是六个操作,因为重命名一个对象是通过先将它复制到新名称的两步完成的,然后删除原件。但是,许多S3客户端和库将为您处理此细节。
答案 2 :(得分:0)
遇到同样的问题。以下是我如何使用Linux bash的aws cli解决此问题的方法。
# check current contents
aws s3 ls --human-readable s3://mybucket/
输出:
PRE AK/
PRE AR/
PRE DC/
PRE DE/
PRE HI/
PRE OH/
PRE TN/
PRE VT/
构造数组进行迭代,然后在每个现有前缀上迭代并执行aws s3 mv
并移至新的前缀,并根据需要重新使用现有的前缀。
prefixArr=(AK AR DC DE HI OH TN VT)
for s3p in ${prefixArr2[@]}; do
echo moving s3://mybucket/$s3p
aws s3 mv s3://mybucket/$s3p s3://wkls-prm/state=$s3p.parquet --recursive
done
输出:
s3://wkls-prm/state=AK
move: s3://wkls-prm/state=AK/_SUCCESS to s3://wkls-prm/state=AK.parquet/_SUCCESS
move: s3://wkls-prm/state=AK/part-00002.snappy.parquet to s3://wkls-prm/state=AK.parquet/part-00002.snappy.parquet
move: s3://wkls-prm/state=AK/part-00003.snappy.parquet to s3://wkls-prm/state=AK.parquet/part-00003.snappy.parquet
s3://wkls-prm/state=AR
move: s3://wkls-prm/state=AR/_SUCCESS to s3://wkls-prm/state=AR.parquet/_SUCCESS
move: s3://wkls-prm/state=AR/part-00003.snappy.parquet to s3://wkls-prm/state=AR.parquet/part-00003.snappy.parquet
move: s3://wkls-prm/state=AR/part-00000.snappy.parquet to s3://wkls-prm/state=AR.parquet/part-00000.snappy.parquet
s3://wkls-prm/state=DC
move: s3://wkls-prm/state=DC/_SUCCESS to s3://wkls-prm/state=DC.parquet/_SUCCESS
move: s3://wkls-prm/state=DC/part-00003.snappy.parquet to s3://wkls-prm/state=DC.parquet/part-00003.snappy.parquet
move: s3://wkls-prm/state=DC/part-00002.snappy.parquet to s3://wkls-prm/state=DC.parquet/part-00002.snappy.parquet
s3://wkls-prm/state=DE
move: s3://wkls-prm/state=DE/_SUCCESS to s3://wkls-prm/state=DE.parquet/_SUCCESS
move: s3://wkls-prm/state=DE/part-00000.snappy.parquet to s3://wkls-prm/state=DE.parquet/part-00000.snappy.parquet
move: s3://wkls-prm/state=DE/part-00003.snappy.parquet to s3://wkls-prm/state=DE.parquet/part-00003.snappy.parquet
s3://wkls-prm/state=HI
move: s3://wkls-prm/state=HI/_SUCCESS to s3://wkls-prm/state=HI.parquet/_SUCCESS
move: s3://wkls-prm/state=HI/part-00003.snappy.parquet to s3://wkls-prm/state=HI.parquet/part-00003.snappy.parquet
move: s3://wkls-prm/state=HI/part-00000.snappy.parquet to s3://wkls-prm/state=HI.parquet/part-00000.snappy.parquet
s3://wkls-prm/state=OH
move: s3://wkls-prm/state=OH/_SUCCESS to s3://wkls-prm/state=OH.parquet/_SUCCESS
move: s3://wkls-prm/state=OH/part-00000.snappy.parquet to s3://wkls-prm/state=OH.parquet/part-00000.snappy.parquet
move: s3://wkls-prm/state=OH/part-00001.snappy.parquet to s3://wkls-prm/state=OH.parquet/part-00001.snappy.parquet
s3://wkls-prm/state=TN
move: s3://wkls-prm/state=TN/_SUCCESS to s3://wkls-prm/state=TN.parquet/_SUCCESS
move: s3://wkls-prm/state=TN/part-00000.snappy.parquet to s3://wkls-prm/state=TN.parquet/part-00000.snappy.parquet
move: s3://wkls-prm/state=TN/part-00003.snappy.parquet to s3://wkls-prm/state=TN.parquet/part-00003.snappy.parquet
检查结果:
aws s3 ls --human-readable s3://mybucket/
输出:
PRE state=AK.parquet/
PRE state=AR.parquet/
PRE state=DC.parquet/
PRE state=DE.parquet/
PRE state=HI.parquet/
PRE state=OH.parquet/
PRE state=TN.parquet/
PRE state=VT.parquet/
答案 3 :(得分:-1)
[编辑]我意识到我的答案没有完全回答OP,并且有几个人指出,可以使用更多的信息。
通常,AWS CLI for S3将查找指定存储桶AND前缀下的对象。如果包含前缀,则在匹配对象时会忽略对象名称的那一部分。
例如,假设您在存储桶备份的两个文件夹中有多个图像。您的对象名称可能如下所示 photos / graduation / image1.jpg 。
您可以使用以下命令将内部文件夹(在本例中为毕业)以及该文件夹中的所有文件复制到顶层:
aws s3 cp s3://backup/photos s3://backup --recursive
这将匹配存储桶 backup 中的所有文件,前缀为 photos 。它会将这些文件复制到 backup 存储桶,并将它们命名为剥离前缀后留下的任何内容 - 因此在这种情况下,它们将被命名为 graduation / image1.jpg
请注意,原始文件仍将位于原始文件夹中。要真正模拟前缀的重命名,您需要删除旧文件。
aws rm s3://backup/photos/graduation --recursive
完成后,您将在您的存储桶根目录下有一个毕业图像文件夹,而 photos 文件夹下则没有。换句话说,您已将照片/毕业的前缀重命名为毕业。
不幸的是,您似乎无法使用mv命令在同一个存储桶中执行此操作 - 它失败并显示“无法将文件存储到自身”的错误。