Carpetas simuladas

En esta página, se proporciona una descripción general de las carpetas en Cloud Storage.

Descripción general de las carpetas

A excepción de las carpetas administradas, 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 cadena folder1 es parte del nombre del objeto.

Sin embargo, la consola de Google Cloud y las CLI de Cloud Storage 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.

  • Las CLI de Cloud Storage simulan la experiencia típica del directorio de línea de comandos con una variedad de reglas.

/storage/images/folders.svg

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:

  1. En la consola de Google Cloud, ve a la página Buckets de Cloud Storage.

    Ir a Buckets

  2. Navega al bucket.

  3. Haz clic en Crear carpeta para crear una carpeta nueva vacía o en Subir carpeta para subir una existente.

Línea de comandos

Para lograr la ilusión de un árbol jerárquico de archivos, los comando sgcloud storage y gsutil aplican las siguientes reglas para determinar si la URL de destino en un comando debe tratarse como un nombre de objeto o una carpeta:

  1. Si la URL de destino termina con un carácter /, los comandos de la CLI tratan la URL de destino como una carpeta. Por ejemplo, observa el siguiente comando, en el que your-file es el nombre de un archivo:

    gcloud storage cp your-file gs://your-bucket/abc/

    Como resultado de este comando, Cloud Storage crea un objeto llamado abc/your-file en el bucket your-bucket.

  2. Si copias varios archivos fuente a una URL de destino, las CLI tratan la URL de destino como una carpeta. Por ejemplo, observa el siguiente comando, en el que your-dir es una carpeta que contiene archivos como file1 y file2:

    gcloud storage cp your-dir gs://your-bucket/abc --recursive

    Como resultado de este comando, Cloud Storage crea los objetos abc/your-dir/file1 y abc/your-dir/file2 en el bucket your-bucket.

  3. Si no se aplica ninguna de las reglas anteriores, las CLI verifican los objetos del bucket para determinar si la URL de destino es un nombre de objeto o una carpeta. Por ejemplo, observa el siguiente comando, en el que your-file es el nombre de un archivo:

    gcloud storage cp your-file gs://your-bucket/abc

    La CLI realiza una solicitud de enumeración de objetos para your-bucket, con el delimitador / y el prefijo=abc, para determinar si hay objetos en your-bucket cuya ruta de acceso comienza con abc/. Si es así, la CLI trata a abc/ como un nombre de carpeta y el comando anterior crea el objeto abc/your-file en el bucket your-bucket. De lo contrario, la CLI crea el objeto abc en your-bucket.

Este enfoque basado en reglas es diferente a la forma en que funcionan muchas herramientas, que crean objetos de 0 bytes para marcar la existencia de carpetas. Las CLI de Cloud Storage comprenden varias de las convenciones que usan estas herramientas, como la convención de agregar _$folder$ al final del nombre del objeto de 0 bytes, pero las CLI no requieren esos objetos de marcador para implementar un comportamiento de nombres coherente con los comandos de UNIX.

Reintentos y nombres

Cuando una CLI de Cloud Storagevuelve a intentar una solicitud interrumpida, puede ocurrir un problema en el que el primer intento copia un subconjunto de archivos y los intentos posteriores encuentran una carpeta de destino existente, lo que hace que los objetos se nombren 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:

gcloud storage cp ./your-dir gs://your-bucket/new --recursive

Si la ruta de acceso gs://your-bucket/new aún no existe, las CLI crean los siguientes objetos en el primer intento exitoso:

new/dir1/abc
new/dir2/abc

Sin embargo, en el siguiente intento exitoso del mismo comando, las CLI crean los siguientes objetos:

new/your-dir/dir1/abc
new/your-dir/dir2/abc

Para que las CLI funcionen de forma coherente en cada intento, prueba lo siguiente:

  1. Agrega una barra al final de la URL de destino para que las CLI siempre la traten como una carpeta.

  2. Usa gcloud storage rsync o 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.

Para obtener más información acerca de cómo se construyen los nombres, consulta construcción de nombres a través de cp.

Notas adicionales

  • No puedes crear un objeto de cero bytes para imitar una carpeta vacía a través de las CLI de Cloud Storage.

  • Si usas secuencias de comandos para compilar rutas de acceso a archivos a través de la combinación de rutas secundarias, ten en cuenta que, debido a que / es solo un carácter que está en nombre del objeto, las CLI interpretan que gs://my-bucket/folder/ es un objeto diferente de gs://my-bucket//folder.

API de REST

API de JSON

Las carpetas no existen en la API de JSON. Para limitar los objetos que listas, usa 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 a través de 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?