【发布时间】:2018-08-14 12:05:46
【问题描述】:
我正在尝试使用aws s3 CLI 命令将文件(然后删除本地副本)从服务器同步到 S3 存储桶,但找不到排除新创建的仍在本地使用的文件的方法机器。
有什么想法吗?
【问题讨论】:
标签: amazon-web-services amazon-s3 aws-cli
我正在尝试使用aws s3 CLI 命令将文件(然后删除本地副本)从服务器同步到 S3 存储桶,但找不到排除新创建的仍在本地使用的文件的方法机器。
有什么想法吗?
【问题讨论】:
标签: amazon-web-services amazon-s3 aws-cli
这应该可行:
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 选项一样,告诉它使用空字节而不是换行符。
【讨论】:
据我所知,您只能根据文件名包含/排除。所以我看到的唯一方法是一个非常肮脏的黑客。 您可以运行 bash 脚本来重命名阈值以下的所有文件,并像 TOO_NEW_%Filename% 一样为它们添加前缀/后缀,然后像这样运行 cli:
--exclude 'TOO_NEW_*'
但不,不要那样做。
【讨论】:
很可能忽略较新的文件是默认行为。我们可以在aws s3 sync help阅读:
默认行为是忽略相同大小的项目,除非本地版本比 S3 版本新。
如果您想更改默认行为,请向我们提供以下参数:
--size-only(布尔值)使每个键的大小成为用于决定是否从源同步到目标的唯一标准。
--exact-timestamps(布尔值)从 S3 同步到本地时,大小相同 仅当时间戳完全匹配时才会忽略项目。这 默认行为是忽略相同大小的项目,除非本地版本 比 S3 版本更新。
要查看要更新的文件,请运行 sync 和 --dryrun。
或者使用find列出所有需要排除的文件,并将其传递给--exclude参数。
【讨论】: