将源文件夹中的文件移动到目标文件夹而无需删除源文件夹

时间:2019-10-17 18:46:56

标签: amazon-web-services unix amazon-s3

我正在尝试将子文件夹从S3存储桶的一个目录移动到同一存储桶中的另一个目录。在子文件夹中移动文件后,主目录将被删除,这对我来说绝对不会发生。

aws s3 mv s3://Bucket-Name/Input-List/$i/  s3://Bucket-Name/Input-List-Archive/$i/   --recursive

COLLECTION_LIST=(A B C D E F)
for i in ${COLLECTION_LIST[@]}
do

if [ $i == "A" -o $i == "B" ]
        then
                aws s3 mv s3://Bucket-Name/Input-List/$i/  s3://Bucket-Name/Input-List-Archive/$i/   --recursive
    else
                aws s3 mv s3://Bucket-Name/Input-List/Others/$i/  s3://Bucket-Name/Input-List-Archive/Others/$i/  --recursive

Input-List中的所有文件都必须移至Input-List-Archive,而不能删除Input-List目录。

2 个答案:

答案 0 :(得分:0)

编写脚本以从子文件夹递归复制文件并从子文件夹删除这些文件而不使用mv命令怎么样?

答案 1 :(得分:0)

首先,请注意,Amazon S3中实际上不存在目录/文件夹。

例如,我可以运行以下命令:

aws s3 cp foo.txt s3://my-bucket/folder1/folder2/foo.txt

即使folder1folder2不存在,这也将成功工作。

Amazon S3管理控制台将使这些文件夹“出现”,但实际上并不存在。

如果我随后跑:

aws s3 rm s3://my-bucket/folder1/folder2/foo.txt

然后将删除该对象,并且文件夹将“消失”(因为它们实际上从未存在过)。

但是,有时人们希望出现一个文件夹。在管理控制台中创建文件夹时,将创建一个零长度对象,并且将密钥(文件名)设置为该文件夹的名称。这将强制显示一个空的“文件夹”,但实际上它不是文件夹。

在S3中列出对象时,API调用可以返回通用前缀,该前缀在概念上与文件夹相似,但实际上只是文件名的“路径部分”。

值得一提的是, Amazon S3中没有“移动”命令。相反,当使用aws s3 mv命令时,AWS CLI将对象复制到新对象,然后删除原始对象。这使对象看起来像是已移动,但实际上已被复制和删除。

因此,您的选择是:

  • 不用担心文件夹。只是假装它们存在。他们没有任何目的。 OR
  • 移动后创建一个新文件夹。 OR
  • 编写您自己的程序以复制并删除对象,而不删除文件夹。

实际上,该文件夹很可能根本就不存在(也就是说,不存在带有与文件夹名称匹配的Key的零长度文件),因此实际上从未删除过该文件夹。只是没有什么可以使S3使文件夹“出现”在其中。