Copie la estructura del directorio intacta al depósito de AWS S3

40

Quiero usar AWS S3 cli para copiar una estructura de directorio completa en un bucket de S3.

Hasta ahora, todo lo que he intentado copia los archivos al depósito, pero la estructura del directorio está contraída. (para decirlo de otra manera, cada archivo se copia en el directorio raíz del depósito)

El comando que uso es:

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

También he intentado dejar de lado la barra diagonal en mi designación de origen (es decir, la copia del argumento). También he usado un comodín para designar todos los archivos ... cada cosa que intento simplemente copia los archivos de registro en el directorio raíz del depósito.

agentev
fuente
3
¡Sí! Esa es definitivamente la respuesta. A diferencia de Unix, el comando cp (y el comando de sincronización) no crean un directorio de destino en el lado de destino a menos que usted les pida que lo hagan. Entonces, si lo aws s3 cp --recursive mylocalsrcdir s3://bucket/hace, simplemente colocará los archivos en su repositorio local en el "directorio raíz" del cubo. Si lo hace aws s3 cp --recursive mydirectory s3://bucket/mydirectory, recreará la estructura del directorio en el extremo de destino.
agentv

Respuestas:

39

Creo que la sincronización es el método que deseas. Intenta esto en su lugar:

aws s3 sync ./logdata s3://bucketname/
Chad Smith
fuente
44
... Estaba emocionado de intentar eso, pero me dio los mismos resultados que el comando cp. Los archivos de mi directorio ./logfiles se copiaron en el "directorio" raíz en el depósito. Sin embargo, una cosa que funcionó fue intentar esto: aws s3 sync ./logdata s3://bucketname/logdata gracias por el liderazgo. --- v
agentv
desafortunadamente, incluso con su agente de sugerenciasv obtuve el mismo resultado, la sincronización no conservó la estructura del directorio y simplemente aplastó todo.
niharvey
ACTUALIZACIÓN * - no importa mi estructura de directorio se estropeó en el extracto
niharvey
9

Me enfrenté a este error al usar cualquiera de estos comandos.

$ aws s3 cp --recursive /local/dir s3://s3bucket/
OR
$ aws s3 sync /local/dir s3://s3bucket/

Incluso pensé en montar el bucket S3 localmente y luego ejecutar rsync, incluso eso falló (o quedó bloqueado durante unas horas) ya que tengo miles de archivos.

Finalmente, s3cmd funcionó de maravilla .

s3cmd sync /local/dir/ --delete-removed s3://s3bucket/ --exclude="some_file" --exclude="*directory*"  --progress --no-preserve

Esto no solo funciona bien y muestra un resultado bastante detallado en la consola, sino que también carga archivos grandes en partes.

vikas027
fuente
1
tl; dr: el bloqueo de archivos comodín funcionó mejor en s3cmd para mí. Tan genial como aws-cli es, para mi único problema de manipulación de archivos S3 que no funcionó de inmediato como esperaba y pensé que podría, terminé instalando y usando s3cmd. Cualquiera que sea la sintaxis y el trabajo detrás de escena que imaginé conceptualmente, s3cmd era más intuitivo y servicial para mis ideas preconcebidas. Tal vez no sea la respuesta por la que viniste, pero funcionó para mí.
BradChesney79
Eso es útil @ BradChesney79
agentv
Sería bueno describir las opciones que está utilizando en el comando de sincronización. ¿También no hay un comando "cp" para el s3cmd? ¿Por qué usar sync en lugar de cp?
VinGarcia
4

Lo siguiente funcionó para mí:

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

AWS "creará" this_directoryy copiará todos los contenidos locales en él.

Michael Silverstein
fuente
2

Use el siguiente script para copiar la estructura de carpetas:

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
Shishir Arora
fuente
2

No pude conseguir s3 synco s3 cpal trabajo en una carpeta de 55 GB con miles de archivos y más de 2 docenas de subdirectorios dentro. Intentar sincronizar toda la carpeta solo provocaría que awscli falle en silencio sin cargar nada en el bucket.

Terminé haciendo esto para sincronizar primero todos los subdirectorios y sus contenidos (se preserva la estructura de carpetas):

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

Luego hice esto para obtener los 30,000 archivos en el nivel superior:

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

Asegúrese de observar la carga en el servidor (protip que puede usar wpara mostrar la carga) y ctrl-zsuspender el comando si la carga es demasiado alta. ( fgpara continuar de nuevo).

Poner esto aquí en caso de que ayude a alguien en una situación similar.

Notas:

-mindepth 1 excluye .

-maxdepth 1evita que find enumere el contenido de los subdirectorios, ya que los s3 syncmaneja con éxito.

cut -c 3- elimina el "./" del comienzo de cada resultado de find.

twhitney
fuente
1

Alternativamente, también puedes probar minio client aka mc

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

Espero que sea de ayuda.

PD: Soy uno de los contribuyentes al proyecto.

koolhead17
fuente
1
Crédito donde se debe el crédito: MC hizo el trabajo y conservó la estructura de directorios - ¡increíble! Ya estaba enojado para instalar> 200 megabytes de basura de Python & Pip para usar awscli y leer aquí que colapsa la estructura de directorios ...
joonas.fi
0

(Mejorando la solución de Shishir )

  • Guarde la siguiente secuencia de comandos en un archivo (denominé el archivo 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
  • Ejecútelo de la siguiente manera:
    /PATH/TO/s3Copy.sh /PATH/TO/ROOT/DIR/OF/SOURCE/FILESandDIRS PATH/OF/S3/BUCKET
    Por ejemplo, si s3Copy.shestá almacenado en el directorio de inicio y quiero copiar todos los archivos y directorios ubicados en el directorio actual, entonces ejecuto esto:
    ~/s3Copy.sh . s3://XXX/myBucket

Usted puede modificar la secuencia de comandos para permitir otros argumentos de s3 cptales como --include, --exclude...

LoMaPh
fuente
Esto es increíble. Artesanal, de hecho.
agentv