我尝试使用aws s3
CLI命令将文件(然后删除本地副本)从服务器同步到S3存储桶,但无法找到排除新创建文件的方法仍然在本地机器中使用。
有什么想法吗?
答案 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}}选项,告诉它使用空字节而不是换行符。