我目前正在编写一个脚本,使用 s3cmd 同步 s3 存储桶中的文件。
我查看了文件,上面写着:
s3cmd sync LOCAL_DIR s3://BUCKET[/PREFIX] or s3://BUCKET[/PREFIX] LOCAL_DIR
我还发现了一个不错的选择:
--delete-removed
Delete remote objects with no corresponding local file [sync]
我使用 --delete-removed 对 s3cmd 同步的第一个形式进行了测试:
s3cmd sync -r --delete-removed LOCAL_DIR s3://BUCKET[/PREFIX]
它的工作原理就像 s3 bucket 将删除任何不在我的 LOCAL_DIR 中的文件一样
但是当我尝试第二种形式时:
s3cmd sync -r --delete-removed s3://BUCKET[/PREFIX] LOCAL_DIR
s3cmd 似乎首先删除 LOCAL_DIR 下的所有文件,然后将文件从 s3 bucket 下载到我的 LOCAL_DIR
这显然是浪费时间,那么有没有更好的同步方法,而不必先删除我的所有本地文件。也就是说,将所有文件从 s3 存储桶复制到我的本地目录
答案1
注意路径名中的尾部斜线(或缺少斜线)。这会产生影响。
重要提示 — 两种情况下都只考虑路径名的最后一部分。如果 dir1 没有尾部斜杠(在我们的例子中,这相当于 ~/demo/dir1),则路径的最后一部分是 dir1,这是远程端使用的,附加在 s3://s3…/path/ 之后,形成 s3://s3…/path/dir1/…。
另一方面,对于 dir1/(注意结尾的斜杠),它与 ~/demo/dir1/(结尾再次是斜杠)相同,实际上类似于说 dir1/* - 即展开到 dir1 中的文件列表。在这种情况下,路径名的最后部分是文件名(file1-1.txt 和 file1-2.txt),没有 dir1/ 目录名。因此,最终的 S3 路径分别是 s3://s3…/path/file1-1.txt 和 s3://s3…/path/file1-2.txt,两者都没有 dir1/ 成员。我希望它足够清楚,如果没有,请在邮件列表中询问或给我发送更好的措辞 ;-)