Назад | Перейти на главную страницу

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

Я хочу использовать 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