Скопіюйте структуру каталогів неушкодженою у відро AWS S3


40

Я хочу використовувати кліп AWS S3 для копіювання повної структури каталогу у відро S3.

Поки що все, що я спробував, копіює файли у відро, але структура каталогу зруйнована. (щоб сказати іншим способом, кожен файл копіюється у кореневий каталог відра)

Я використовую команду:

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

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


3
Так! Це однозначно відповідь. На відміну від Unix, команда cp (і команда синхронізації) не створюють цільовий каталог на стороні призначення, якщо ви не попросите їх зробити це. Тож якщо ви 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


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

Це не тільки добре виконує роботу та показує досить багатослівний вихід на консоль, але й завантажує великі файли частинами.


1
tl; dr: глобул файлів підкреслених файлів для мене працював краще в s3cmd. Настільки ж круто, як aws-cli - для моєї одноразової проблеми з маніпуляцією файлами S3, яка не відразу працювала, як я сподівався, і думав, що це можливо - я закінчив установку та використання s3cmd. Який би синтаксис і поза кадром не працював я концептуально уявляв, s3cmd був більш інтуїтивно зрозумілим та пристосованим до моїх запечених у попередніх уявленнях. Можливо, це не відповідь, з якого ви прийшли сюди, але це працювало на мене.
BradChesney79

Це корисно @ BradChesney79
agentv

Було б добре описати параметри, які ви використовуєте в команді синхронізації. Також для s3cmd немає команди "cp"? навіщо використовувати синхронізацію замість 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- видаляє "./" з початку кожного результату з пошуку.


1

Також ви можете спробувати minio client aka mc

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

Сподіваюся, це допоможе.

PS: Я один із учасників проекту.


1
Кредит, де належить кредит: mc зробив роботу та зберегла структуру dir - приголомшливо! Мені вже до душі встановити> 200 мегабайт Python & Pip crap, щоб використовувати awscli і прочитати тут, що він
руйнує

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...


Це чудово. Фактично, Artisanal.
agentv
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.