En esta página, se analizan las carpetas en Cloud Storage y cómo varían en las herramientas de Cloud Storage.
Descripción general
Cloud Storage opera con un espacio de nombres fijo, lo que significa que las carpetas no existen dentro de Cloud Storage. Si creas un objeto llamado folder1/file.txt
en el bucket your-bucket
, la ruta al objeto es your-bucket/folder1/file.txt
, pero no hay una carpeta llamada folder1
. en su lugar, la string folder1
es parte del nombre del objeto.
Sin embargo, la consola de Google Cloud y gsutil proporcionan la ilusión de un árbol jerárquico de archivos:
La consola de Google Cloud crea una representación visual de las carpetas que son similares a un navegador de archivos local.
Gsutil simula la experiencia típica del directorio de línea de comandos con una variedad de reglas.
Herramientas
Haz clic en las pestañas a continuación para ver cómo cada herramienta maneja las carpetas.
Console
En la consola de Google Cloud, puedes crear una carpeta vacía en un bucket o subir una carpeta existente.
Cuando subes una carpeta existente, el nombre de la carpeta se vuelve parte de la ruta de acceso para todos los objetos contenidos en la carpeta. Todas las subcarpetas y los objetos que contienen también se incluyen en la carga.
Para crear una carpeta, haz lo siguiente:
- En la consola de Google Cloud, ve a la página Buckets de Cloud Storage.
Navega al bucket.
Haz clic en Crear carpeta para crear una carpeta nueva vacía o en Subir carpeta a fin de subir una existente.
gsutil
A fin de lograr la ilusión de un árbol jerárquico de archivos, gsutil aplica las siguientes reglas para determinar si la URL de destino en un comando debe tratarse como un nombre de objeto o una carpeta:
Si la URL de destino termina con un carácter
/
, gsutil trata la URL de destino como una carpeta. Por ejemplo, considera el siguiente comando, en el queyour-file
es el nombre de un archivo:gsutil cp your-file gs://your-bucket/abc/
Como resultado, gsutil crea un objeto llamado
gs://your-bucket/abc/your-file
.Si copias varios archivos fuente a una URL de destino, gsutil trata la URL de destino como una carpeta. Por ejemplo, considera el siguiente comando, en el que
your-dir
es una carpeta que contiene archivos comofile1
yfile2
:gsutil cp -r your-dir gs://your-bucket/abc
Como resultado, gsutil crea los objetos
gs://your-bucket/abc/your-dir/file1
ygs://your-bucket/abc/your-dir/file2
.Si no se aplica ninguna de las reglas anteriores, gsutil verifica los objetos del bucket para determinar si la URL de destino es un nombre de objeto o una carpeta. Por ejemplo, considera el siguiente comando, en el que
your-file
es el nombre de un archivo:gsutil cp your-file gs://your-bucket/abc
Gsutil realiza una solicitud de enumeración de objetos para
your-bucket
con el delimitador/
y el prefijo=abc
a fin de determinar si hay objetos en el bucket cuya ruta comienza congs://your-bucket/abc/
. Si es así, gsutil tratags://your-bucket/abc
como un nombre de carpeta y el comando anterior crea el objetogs://your-bucket/abc/your-file
. De lo contrario, gsutil crea el objetogs://your-bucket/abc
.
El enfoque basado en reglas de gsutil difiere de la forma en que funcionan muchas herramientas, que crean objetos de 0 bytes para marcar la existencia de carpetas. Gsutil comprende las convenciones que usan estas herramientas, como la convención de agregar _$folder$
al final del nombre del objeto de 0 bytes, pero gsutil no requiere que esos objetos de marcador implementen comportamientos de nombres coherentes con los comandos de UNIX.
Reintentos y nombres
Si habilitas los reintentos automáticos a través de gsutil, es posible que tengas un problema en el que un primer intento solo copie un subconjunto de archivos y, luego, los intentos posteriores encuentran una carpeta de destino existente y asignan nombres a tus objetos de forma incorrecta.
Por ejemplo, considera el siguiente comando, en el que hay subcarpetas en your-dir/
como dir1
y dir2
, y ambas subcarpetas contienen el archivo abc
:
gsutil cp -r ./your-dir gs://your-bucket/new
Si gs://your-bucket/new
aún no existe, gsutil crea los siguientes objetos en el primer intento exitoso:
gs://your-bucket/new/dir1/abc gs://your-bucket/new/dir2/abc
En el siguiente intento exitoso, gsutil crea los siguientes objetos:
gs://your-bucket/new/your-dir/dir1/abc gs://your-bucket/new/your-dir/dir2/abc
Para que gsutil funcione de manera coherente en cada intento, intenta lo siguiente:
Agrega una barra al final de la URL de destino para que gsutil siempre la trate como una carpeta.
Usar
gsutil rsync
. Dado que rsync no usa las reglas de nombres de carpetas definidas por cp de Unix, funciona con coherencia si la subcarpeta de destino existe o no.Si gsutil rsync no funciona, crea un objeto de marcador de posición para establecer que el destino es una carpeta. Por ejemplo:
gsutil cp some-file gs://your-bucket/new/placeholder
Con el objeto de marcador de posición presente, la ejecución del comando
gsutil cp -r
anterior trata de forma coherente ags://your-bucket/new
como una carpeta. Una vez que tengas al menos uno de tus objetos engs://your-bucket/new
, puedes borrar el objeto de marcador de posición y continuar tus cargas.
Para obtener más información sobre cómo se construyen los nombres, consulta gsutil help cp
.
Notas adicionales
No puedes crear un objeto de cero bytes para imitar una carpeta vacía mediante gsutil.
Si usas secuencias de comandos para compilar rutas de acceso a archivos mediante la combinación de rutas secundarias, ten en cuenta que, debido a que
/
es solo un carácter que está en nombre del objeto, gsutil interpreta quegs://my-bucket/folder/
es un objeto diferente degs://my-bucket//folder
.
Consideraciones sobre el precio
Una desventaja de este enfoque de asignación de nombres de gsutil es que se necesita una lista de objetos adicional antes de ejecutar un comando cp
o mv
, como una copia recurrente de una carpeta en la nube. Sin embargo, generar esas listas es bastante económico, ya que se usan parámetros de prefijos y delimitadores para limitar los datos del resultado. gsutil también realiza una sola solicitud de enumeración de objetos por comando cp
o mv
, lo que amortiza los costos de todos los objetos transferidos.
API de REST
API de JSON
Las carpetas no existen en la API de JSON, pero puedes reducir los objetos que listas mediante los parámetros de búsqueda prefix
y delimiter
.
Por ejemplo, para enumerar todos los objetos en el bucket my-bucket
con el prefijo folder/subfolder/
, realiza una solicitud de listado de objetos con esta URL:
"https://storage.googleapis.com/storage/v1/b/my-bucket/o?prefix=folder/subfolder/"
API de XML
Las carpetas no existen en la API de XML, pero puedes reducir los objetos que listas mediante prefix
y los parámetros de búsqueda delimiter
.
Por ejemplo, para enumerar todos los objetos en el bucket my-bucket
con el prefijo folder/subfolder/
, realiza una solicitud de listado de objetos con esta URL:
"https://storage.googleapis.com/my-bucket?prefix=folder/subfolder/"
¿Qué sigue?
- Subir objetos a un bucket de Cloud Storage.