В настоящее время я пишу сценарий для синхронизации файлов в ведрах s3 с s3cmd.
Проверяю документ, там написано:
s3cmd sync LOCAL_DIR s3://BUCKET[/PREFIX] or s3://BUCKET[/PREFIX] LOCAL_DIR
также нахожу хороший вариант:
--delete-removed
Delete remote objects with no corresponding local file [sync]
Я тестировал первую форму синхронизации s3cmd с --delete-deleted:
s3cmd sync -r --delete-removed LOCAL_DIR s3://BUCKET[/PREFIX]
Это работает как шарм, что ведро s3 удалит все файлы, не находящиеся в моем LOCAL_DIR
Однако, когда я пробую вторую форму:
s3cmd sync -r --delete-removed s3://BUCKET[/PREFIX] LOCAL_DIR
Кажется, что s3cmd сначала удаляет все мои файлы в LOCAL_DIR, а затем загружает файлы из ведра s3 в мой LOCAL_DIR
Очевидно, это пустая трата времени, так что есть другой лучший способ синхронизировать, не удаляя сначала все мои локальные файлы. То есть скопировать все файлы из ведра s3 в мой локальный каталог точно
Будьте осторожны с завершающей косой чертой (или отсутствием косой черты) в именах путей. Это имеет значение.
Важно - в обоих случаях учитывается только последняя часть имени пути. В случае 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 / member в них. Надеюсь, это достаточно ясно, если не спросить в списке рассылки или не отправить мне лучшую формулировку ;-)