Скопировать структуру каталога без изменений в корзину AWS S3

40

Я хочу использовать AWS S3 cli для копирования полной структуры каталогов в корзину S3.

Пока что все, что я пробовал, копирует файлы в корзину, но структура каталогов разрушена. (иначе говоря, каждый файл копируется в корневой каталог корзины)

Команда, которую я использую:

aws s3 cp --recursive ./logdata/ s3://bucketname/

Я также попытался убрать косую черту на моем исходном обозначении (то есть, копия из аргумента). Я также использовал подстановочный знак для обозначения всех файлов ... каждая вещь, которую я пробую, просто копирует файлы журнала в корневой каталог корзины.

agentv
источник
3
Да! Это определенно ответ. В отличие от Unix, команда cp (и команда sync) не создают целевой каталог на стороне назначения, если вы не попросите их сделать это. Так что если вы aws s3 cp --recursive mylocalsrcdir s3://bucket/тогда просто поместите файлы в вашем локальном репозитории в область «корневой каталог», то если вы это сделаете, aws s3 cp --recursive mydirectory s3://bucket/mydirectoryто воссоздаст структуру каталогов на целевом конце.
Agentv

Ответы:

39

Я считаю, что синхронизация это метод, который вы хотите. Попробуйте это вместо этого:

aws s3 sync ./logdata s3://bucketname/
Чад Смит
источник
4
... Я был взволнован, чтобы попробовать это, но это дало мне те же результаты, что и команда cp. Файлы из моего каталога ./logfiles были скопированы в корневой «каталог» в корзине. Одна вещь, которая сработала, была попытка сделать это: aws s3 sync ./logdata s3://bucketname/logdata спасибо за лидерство. --- v
agentv
к сожалению, даже с вашим предложением agentv я получил тот же результат: синхронизация не сохранила структуру каталогов, а просто выровняла все.
niharvey
ОБНОВЛЕНИЕ * - не
niharvey
9

Я столкнулся с этой ошибкой при использовании любой из этих команд.

$ 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

Это не только хорошо выполняет работу и показывает довольно подробный вывод на консоль, но также загружает большие файлы по частям.

vikas027
источник
1
tl; dr: подстановка файлов с подстановочными символами работала лучше в s3cmd для меня. Как ни круто, как aws-cli - для моей единовременной проблемы с манипулированием файлами S3, которая не сразу сработала, как я надеялся и думал, что это возможно - я закончил установку и использование s3cmd. Какой бы синтаксис и за кулисами ни работал, я концептуально представлял, s3cmd был более интуитивно понятным и подходящим для моей выпечки в предубеждениях. Может быть, это не тот ответ, за которым вы пришли сюда, но это сработало для меня.
BradChesney79
Это полезно @ BradChesney79
agentv
Было бы хорошо описать опции, которые вы используете в команде sync. Также нет команды "cp" для s3cmd? зачем использовать синхронизацию вместо cp?
VinGarcia
4

У меня сработало следующее:

aws s3 cp ~/this_directory s3://bucketname/this_directory --recursive

Затем AWS «сделает» this_directoryи скопирует в него все локальное содержимое.

Майкл Сильверстейн
источник
2

Используйте следующий скрипт для копирования структуры папок:

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
Шишир Арора
источник
2

Я не мог получить s3 syncили s3 cpпоработать над папкой 55 ГБ с тысячами файлов и более чем 2 дюжинами подкаталогов внутри. Попытка синхронизации всей папки просто приведет к тому, что awscli молча завершится сбоем без загрузки чего-либо в корзину.

Закончено это для первой синхронизации всех подкаталогов и их содержимого (структура папок сохраняется):

nice find . -mindepth 1 -maxdepth 1 -type d | cut -c 3- | while read line; do aws s3 sync $"$line" "s3://bucketname/$line"; done

Затем я сделал это, чтобы получить 30000 файлов на верхнем уровне:

nice find . -mindepth 1 -maxdepth 1 -type f | cut -c 3- | while read line; do aws s3 cp "$line" "s3://bucketname/";

Обязательно следите за нагрузкой на сервере (protip, который вы можете использовать, wчтобы просто показать нагрузку) и ctrl-zприостанавливайте команду, если нагрузка становится слишком высокой. ( fgчтобы продолжить это снова).

Положите это здесь на случай, если это поможет кому-либо в подобной ситуации.

Заметки:

-mindepth 1 исключает .

-maxdepth 1не позволяет находить содержимое списка подкаталогов, так как s3 syncобрабатывает их успешно.

cut -c 3- удаляет «./» в начале каждого результата поиска.

twhitney
источник
1

В качестве альтернативы вы также можете попробовать Minio Client или MC

$ mc cp Desktop/test/test/test.txt s3/miniocloud/Desktop/test/test/

Надеюсь, это поможет.

PS: я один из авторов проекта.

koolhead17
источник
1
Кредит, где кредит должен: mc сделал работу и сохранил структуру dir - потрясающе! Я уже разозлился, чтобы установить> 200 мегабайт Python & Pip Crap, чтобы использовать awscli и прочитать здесь, что он разрушает структуру dir ..
joonas.fi
0

(Совершенствование решения Шишира )

  • Сохраните следующий скрипт в файл (я назвал файл 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...

LoMaPh
источник
Это удивительно. Ремесленник, на самом деле.
agentv