AWS S3 列出对象不一致



我正在尝试使用 AWS S3 cli 列出具有给定前缀的对象。但是,对于看似相同的文件夹结构,它有时会返回不同的结果。

好的,这是命令#1

aws s3api list-objects --bucket b --prefix 38d2f2e0-8091-11e9-aaa9-03fd73386354/raw 
38d2f2e0-8091-11e9-aaa9-03fd73386354/raw/Pogonocherus_hispidus_Max.1001.png     
38d2f2e0-8091-11e9-aaa9-03fd73386354/raw/Pogonocherus_hispidus_Max.mtl  
38d2f2e0-8091-11e9-aaa9-03fd73386354/raw/Pogonocherus_hispidus_Max.obj 

在这里#2

aws s3api list-objects --bucket b --prefix 5d5c3abe-1a95-4e92-a03d-11fbf37d7851/raw 
5d5c3abe-1a95-4e92-a03d-11fbf37d7851/raw/
5d5c3abe-1a95-4e92-a03d-11fbf37d7851/raw/Pogonocherus_hispidus_Max.1001.png    
5d5c3abe-1a95-4e92-a03d-11fbf37d7851/raw/Pogonocherus_hispidus_Max.mtl
5d5c3abe-1a95-4e92-a03d-11fbf37d7851/raw/Pogonocherus_hispidus_Max.obj 

我不知道它为什么要这样做。理想情况下,我希望输出始终看起来像 #1。

这是怎么回事?

这两个列表之间的区别在于第二个列表中存在raw/子文件夹对象。使用 S3,在将对象写入该文件夹之前,无需创建该文件夹。而且,当您创建对象(如 folder1/folder2/image.jpg (时,S3 不会创建folder1/folder2/结构;它只是写入对象。

因此,您正在使用的某些过程是故意在5d5c3abe-1a95-4e92-a03d-11fbf37d7851/raw/处创建一个对象来表示raw/子文件夹。通常不需要创建此文件夹,但某些客户端会这样做。如您所见,在第一个示例中,没有 raw/ 子文件夹,一切正常。

因此,请查看您是否可以确定填充 S3 的方式存在一些差异,这可能会导致创建 uuid/raw/ 子文件夹。一个常见原因是有人使用 AWS S3 控制台创建了文件夹。

我被

困了一整晚,还有 1000 多个文件,我也想只获取子文件夹下的文件数量,但它也在内容中返回一个额外的文件,即子文件夹本身,

搜索后,我发现这就是 s3 的工作方式,但我有一个场景,我从以下目录中的 redshift 卸载数据

s3://bucket_name/subfolder/<10 number of files>

当我使用

paginator.paginate(Bucket=price_signal_bucket_name,Prefix=new_files_folder_path+"/")
它只会返回 10 个文件,

但是当我在 s3 存储桶本身上创建文件夹时,它还将返回子文件夹和 10 个文件,即总共 11 个条目

结论

  1. 如果整个文件夹上传到 s3,则列出 仅返回前缀下的文件
  2. 但是,如果 fodler 是在 s3 存储桶本身上创建的,那么使用 boto3 客户端列出它也将返回子文件夹和文件

最新更新