我正在尝试将子文件夹从 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
而不会删除目录。
如何编写脚本以递归方式从子文件夹复制文件并从子文件夹中删除这些文件,而不是使用 mv 命令?
首先,请注意,Amazon S3 中实际上并不存在目录/文件夹。
例如,我可以运行以下命令:
aws s3 cp foo.txt s3://my-bucket/folder1/folder2/foo.txt
即使不存在folder1
和folder2
,这也将成功工作。
Amazon S3 管理控制台将使这些文件夹"显示",但它们实际上并不存在。
如果我然后跑:
aws s3 rm s3://my-bucket/folder1/folder2/foo.txt
然后对象将被删除,文件夹将"消失"(因为它们实际上从未存在过(。
但是,有时人们希望显示一个文件夹。在管理控制台中创建文件夹时,将创建一个长度为零的对象,并将 Key(文件名(设置为文件夹的名称。这将强制出现一个空的"文件夹",但它实际上不是一个文件夹。
在 S3 中列出对象时,API 调用可以返回一个公共前缀,该前缀在概念上类似于文件夹,但它实际上只是文件名的"路径部分"。
还值得一提的是,Amazon S3中没有"move"命令。相反,在使用aws s3 mv
命令时,AWS CLI 会将对象复制到新对象,然后删除原始对象。这使对象看起来像是被移动了,但实际上它已被复制和删除。
因此,您的选择是:
- 不用担心文件夹。只是假装它们存在。它们没有任何目的。或
- 移动后创建一个新文件夹。或
- 编写自己的程序来复制和删除对象而不删除文件夹。
事实上,该文件夹很可能从一开始就不存在(也就是说,没有具有与文件夹名称匹配的键的零长度文件(,因此它从未真正被删除。只是没有什么可以导致 S3 使文件夹"看起来"在那里。