У меня есть 200k файлов в ковше, которые мне нужно переместить в подпапку в том же ведре, какой лучший подход?
Перемещение множества файлов в одном ковше
Ответ 1
Недавно я столкнулся с той же проблемой. Я решил это с помощью API командной строки.
http://docs.aws.amazon.com/cli/latest/index.html http://docs.aws.amazon.com/cli/latest/reference/s3/mv.html
aws s3 mv s3://BUCKETNAME/myfolder/photos/ s3://BUCKETNAME/myotherfolder/photos/ --recursive --acl public-read
Мне нужно, чтобы объекты были общедоступными, поэтому я добавил параметр acl.
Ответ 2
Недавно смог сделать это с помощью одной команды. Также пошли намного быстрее, чем отдельные запросы для каждого файла.
Запустить такой фрагмент кода:
aws s3 mv s3://bucket-name/ s3://bucket-name/subfolder --recursive --exclude "*" --include "*.txt"
Используйте флаг --include
, чтобы выборочно выбрать нужные файлы.
Ответ 3
Нет операции "Переименовать", хотя было бы здорово, если бы это было.
Вместо этого вам нужно пропустить каждый элемент, который вы хотите переименовать, выполнить копию нового объекта, а затем удалить старый объект.
- http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectCOPY.html
- http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectDELETE.html
Примечание. Для упрощенных целей я предполагаю, что на вашем ведре не включено управление версиями.
Ответ 4
Приведенный ниже скрипт отлично работает для меня без проблем
for i in 'cat s3folders'
do
aws s3 mv s3://Bucket_Name/"$i"/ s3://Another_Bucket_Name/ --recursive
done
Он также удаляет пустую папку из источника, как только файлы перемещаются в целевую папку
Ответ 5
У меня была такая же проблема, и я закончил использование aws s3 mv
вместе с циклом bash for
.
Я сделал aws ls bucket_name
, чтобы получить все файлы в ведре. Затем я решил, какие файлы я хотел переместить, и добавил их в file_names.txt
.
Затем я выполнил следующий фрагмент, чтобы переместить все файлы:
for f in $(cat file_names.txt)
do
aws s3 mv s3://bucket-name/$f s3://bucket-name/subfolder/$f
done