是否可以从超过x时间的aws S3同步文件中排除?

时间:2015-11-16 09:00:45

标签: amazon-web-services amazon-s3 aws-cli

我尝试使用aws s3 CLI命令将文件(然后删除本地副本)从服务器同步到S3存储桶,但无法找到排除新创建文件的方法仍然在本地机器中使用。 有什么想法吗?

3 个答案:

答案 0 :(得分:0)

据我所知,您只能根据文件名包含/排除。因此,我看到的唯一方法是真正的肮脏黑客。 你可以运行一个bash脚本来重命名你的treshhold下面的所有文件和前缀/后缀,如TOO_NEW_%Filename%和运行cli,如:

--exclude 'TOO_NEW_*'

但不能不这样做。

答案 1 :(得分:0)

最有可能忽略较新的文件是默认行为。我们可以阅读aws s3 sync help

  

默认行为是忽略相同大小的项目,除非本地版本比S3版本更新。

如果您想更改默认行为,请向我们提供以下参数:

  
      
  • --size-only(布尔值)使每个键的大小成为决定是否从源同步到目标的唯一标准。

  •   
  • --exact-timestamps(boolean)从S3同步到本地时,大小相同   仅当时间戳完全匹配时,才会忽略项目。该   默认行为是忽略相同大小的项目,除非本地版本   比S3版本更新。

  •   

要查看要更新的文件,请使用sync运行--dryrun

或者使用find列出需要排除的所有文件,并将其传递给--exclude参数。

答案 2 :(得分:0)

这应该有效:

find /path/to/local/SyncFolder -mtime +1 -print0 | sed -z 's/^/--include=/' | xargs -0 /usr/bin/aws s3 sync /path/to/local/SyncFolder s3://remote.sync.folder --exclude '*'

这里有一个窍门:我们不会排除我们不想要的文件,我们会排除一切,然后是包括我们想要的文件。为什么?因为无论哪种方式,我们可能都会有太多参数无法容纳到命令行中。我们可以使用xargs将长行拆分为多个调用,但是不能让xargs拆分排除列表,因此我们必须让它拆分包含列表。

因此,从头开始,我们有一个find命令。 -mtime +1查找所有早于一天的文件,-print0告诉find用空字节而不是换行符来分隔每个结果,以防某些文件中包含换行符他们的名字。

接下来,sed--include=/选项添加到每个文件名的开头,并且包含-z选项以使sed知道使用空字节而不是换行符作为分隔符。

最后,xargs会将所有这些include选项提供给我们的aws命令的末尾,如果需要,请多次调用aws-0选项就像sed的{​​{1}}选项,告诉它使用空字节而不是换行符。