aws s3 sync
命令有一个--exclude
标志,它允许您从同步中排除文件夹。但是,即使没有从该目录上传文件,该命令仍然会查看和处理该文件夹中的所有文件。首先,我想排除该文件夹的原因是因为它是一个包含大量数据的非常大的文件夹,实际上我希望同步的数据仅为父文件夹中的几MB,以及其他几个子文件夹。但是,同步这几个MB需要几分钟,因为该数据子文件夹中有几GB的数据。是否有一种方法可以实际排除(例如,从查看或处理)子文件夹,以便同步命令在合理的时间内完成?
发布于 2021-07-16 22:27:08
我认为这可能是对S3提供的功能的期望不匹配的情况。
S3实际上没有任何结构,桶只有一组扁平的对象,完整的字符串可以看作是每个对象的键"path“。
但是,ListObjectsV2 API动作提供了一些特性,比如指定前缀(只返回具有以特定字符串开头的键的对象),以及指定分隔符(通过提供的分隔符和重复键段组分隔键)的选项,这些选项允许您将桶的内容呈现为具有结构(例如,AWS控制台所做的)。
aws s3 sync
实用程序大概也从普通的ListObjectsV2 API动作开始工作,但是这个API在同步实用程序中没有任何与--exclude
(或--include
)选项等价的功能,只有通过键前缀过滤列表的选项。
因此,当它处理指定前缀的对象的完整列表时,同步实用程序似乎必须在客户端处理这些更灵活的筛选选项,如果指定前缀下有大量应该跳过的对象,那么这些选项就永远不会有效。
在您的场景中,您想要做的可能是指定您想要的前缀或前缀,而不是指定一个更通用的前缀并过滤您不想要的。如果您想要的是不能由前缀标识的,您可能需要考虑更改您的命名,以便可以指定一些已知的前缀。(甚至可能对不同类型的数据使用单独的存储桶,如果这为您的情况提供了更多的senes。)
发布于 2021-07-19 15:48:10
虽然H kan Lindqvist的答案在技术上似乎是正确的,但不幸的是,它并没有解决问题。同步(上传)几MB的时间长达30分钟,因为一个大的子文件夹被排除在外。由于AWS似乎不支持我所需要的功能,所以我转而使用另一个工具: shell脚本。
#!/bin/sh
for localfile in /home/path/to/source/files/*.*
do
aws s3 cp "$localfile" s3://path/to/bucket/
done
aws s3 sync /home/path/to/source/files/subfolder1 s3://path/to/bucket/subfolder1
aws s3 sync /home/path/to/source/files/subfolder2 s3://path/to/bucket/subfolder2
aws s3 sync /home/path/to/source/files/subfolder3 s3://path/to/bucket/subfolder3
# Deliberately skipping subfolder4
aws s3 sync /home/path/to/source/files/subfolder5 s3://path/to/bucket/subfolder5
aws s3 sync /home/path/to/source/files/subfolder6 s3://path/to/bucket/subfolder6
aws s3 sync /home/path/to/source/files/subfolder7 s3://path/to/bucket/subfolder7
aws s3 sync /home/path/to/source/files/subfolder8 s3://path/to/bucket/subfolder8
aws s3 sync /home/path/to/source/files/subfolder9 s3://path/to/bucket/subfolder9
aws s3 sync /home/path/to/source/files/subfolder10 s3://path/to/bucket/subfolder10
虽然这种方法解决了我在特定情况下遇到的问题,但也并非没有缺点:
aws s3 cp
命令总是上传文件,即使文件自上次以来没有更改aws s3 cp
命令比一般情况下的aws s3 sync
命令要慢得多。尽管存在这些缺点,但在我的情况下,这比使用带有aws s3 sync
标志的--exclude
要快一个数量级以上,所以我很满意。不过,我确实希望亚马逊在未来能提供更好的选择。
https://serverfault.com/questions/1069852
复制相似问题