【问题标题】:Is it possible to exclude from aws S3 sync files older then x time?是否可以从比 x 时间更早的 aws S3 同步文件中排除?
【发布时间】:2018-08-14 12:05:46
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    这应该可行:

    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-z 选项一样,告诉它使用空字节而不是换行符。

    【讨论】:

      【解决方案2】:

      据我所知,您只能根据文件名包含/排除。所以我看到的唯一方法是一个非常肮脏的黑客。 您可以运行 bash 脚本来重命名阈值以下的所有文件,并像 TOO_NEW_%Filename% 一样为它们添加前缀/后缀,然后像这样运行 cli:

      --exclude 'TOO_NEW_*'
      

      但不,不要那样做。

      【讨论】:

      • 我想我不会那样做,但这个解决方案确实启发了我这个解决方案。 1. 使用 s3 同步的 cronjob 不删除本地副本 2. 使用 bash 脚本删除旧文件的 cronjob。你怎么看?
      • 嗯,乍一看这听起来很可行。但是,如果出于某种原因(网络问题、停机时间?)您的第一份工作无法工作,会发生什么?然后你会删除你的文件而不会将它们发送到 s3,对吗?
      • 哦..你说得对。怎么样:bash 脚本复制早于 x 小时的文件,并且只有在复制成功的情况下才删除文件?
      【解决方案3】:

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

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

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2021-07-19
        • 1970-01-01
        • 2018-09-09
        • 1970-01-01
        • 1970-01-01
        • 2013-12-23
        • 1970-01-01
        • 1970-01-01
        • 2021-05-31
        相关资源
        最近更新 更多