Я хочу использовать AWS S3 cli для копирования полной структуры каталогов в корзину S3.
Пока все, что я пробовал, копирует файлы в корзину, но структура каталогов разрушена. (иными словами, каждый файл копируется в корневой каталог корзины)
Я использую следующую команду:
aws s3 cp --recursive ./logdata/ s3://bucketname/
Я также попытался убрать косую черту в конце моего обозначения источника (т. Е. Аргумента «копия из»). Я также использовал подстановочный знак для обозначения всех файлов ... каждая вещь, которую я пробую, просто копирует файлы журнала в корневой каталог корзины.
Я считаю, что синхронизация - это тот метод, который вам нужен. Попробуйте вместо этого:
aws s3 sync ./logdata s3://bucketname/
У меня сработало следующее:
aws s3 cp ~/this_directory s3://bucketname/this_directory --recursive
AWS тогда «сделает» this_directory
и скопируйте в него все локальное содержимое.
Я столкнулся этот ошибка при использовании любой из этих команд.
$ aws s3 cp --recursive /local/dir s3://s3bucket/
OR
$ aws s3 sync /local/dir s3://s3bucket/
Я даже подумал о том, чтобы смонтировать ведро S3 локально, а затем запустить rsync, даже если это не удалось (или зависло на несколько часов), так как у меня тысячи файлов.
В заключение, s3cmd работал как шарм.
s3cmd sync /local/dir/ --delete-removed s3://s3bucket/ --exclude="some_file" --exclude="*directory*" --progress --no-preserve
Это не только хорошо выполняет свою работу и показывает довольно подробный вывод на консоль, но также загружает большие файлы по частям.
Я не мог получить s3 sync
или s3 cp
для работы с папкой размером 55 ГБ, содержащей тысячи файлов и более двух десятков подкаталогов внутри. Попытка синхронизировать всю папку просто приведет к сбою awscli без загрузки чего-либо в корзину.
Закончилось этим, чтобы сначала синхронизировать все подкаталоги и их содержимое (структура папок сохраняется):
nice find . -mindepth 1 -maxdepth 1 -type d | cut -c 3- | while read line; do aws s3 sync $"$line" "s3://bucketname/$line"; done
Затем я сделал это, чтобы получить 30 000 файлов на верхнем уровне:
nice find . -mindepth 1 -maxdepth 1 -type f | cut -c 3- | while read line; do aws s3 cp "$line" "s3://bucketname/";
Обязательно следите за нагрузкой на сервер (совет можно использовать w
чтобы просто показать нагрузку) и ctrl-z
приостановить команду, если нагрузка станет слишком высокой. (fg
чтобы продолжить снова).
Поместите это здесь на случай, если это поможет кому-то в подобной ситуации.
Ноты:
-mindepth 1
исключает .
-maxdepth 1
предотвращает вывод списка содержимого подкаталогов find, поскольку s3 sync
успешно справляется с ними.
cut -c 3-
удаляет "./" из начала каждого результата поиска.
(Улучшение решения Шишир)
s3Copy.sh
)path=$1 # the path of the directory where the files and directories that need to be copied are located
s3Dir=$2 # the s3 bucket path
for entry in "$path"/*; do
name=`echo $entry | sed 's/.*\///'` # getting the name of the file or directory
if [[ -d $entry ]]; then # if it is a directory
aws s3 cp --recursive "$name" "$s3Dir/$name/"
else # if it is a file
aws s3 cp "$name" "$s3Dir/"
fi
done
/PATH/TO/s3Copy.sh /PATH/TO/ROOT/DIR/OF/SOURCE/FILESandDIRS PATH/OF/S3/BUCKET
s3Copy.sh
хранится в домашнем каталоге, и я хочу скопировать все файлы и каталоги, расположенные в текущем каталоге, затем я запускаю это:~/s3Copy.sh . s3://XXX/myBucket
Вы можете легко изменить сценарий, чтобы учесть другие аргументы s3 cp
Такие как --include
, --exclude
, ...
Используйте следующий скрипт для копирования структуры папок:
s3Folder="s3://xyz.abc.com/asdf";
for entry in "$asset_directory"*
do
echo "Processing - $entry"
if [[ -d $entry ]]; then
echo "directory"
aws s3 cp --recursive "./$entry" "$s3Folder/$entry/"
else
echo "file"
aws s3 cp "./$entry" "$s3Folder/"
fi
done
В качестве альтернативы вы также можете попробовать мини-клиент, он же MC
$ mc cp Desktop/test/test/test.txt s3/miniocloud/Desktop/test/test/
Надеюсь, это поможет.
PS: Я один из участников проекта.
У меня это работает .. aws s3 sync mydir s3: // rahuls-bucket / mydir