Carpetas

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, Cloud Console y gsutil proporcionan la ilusión de un árbol jerárquico de archivos:

  • Cloud Console 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.

/storage/images/folders.svg

Si creas una carpeta vacía con Cloud Console, Cloud Storage crea un objeto de cero bytes como marcador de posición. Por ejemplo, si creas una carpeta llamada folder en un bucket llamado my-bucket, se crea un objeto de cero bytes llamado gs://my-bucket/folder/. Puedes encontrar este objeto cuando ejecutes gsutil ls.

Herramientas

Haz clic en las pestañas a continuación para ver cómo cada herramienta maneja las carpetas.

Console

En Cloud Console, 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 Cloud Console, ve a la página Navegador de Cloud Storage.

    Ir al navegador

  2. Navega al bucket.

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

  1. 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 que your-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.

  2. 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 como file1 y file2:

    gsutil cp -r your-dir gs://your-bucket/abc

    Como resultado, gsutil crea los objetos gs://your-bucket/abc/your-dir/file1 y gs://your-bucket/abc/your-dir/file2.

  3. 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 con gs://your-bucket/abc/. Si es así, gsutil trata gs://your-bucket/abc como un nombre de carpeta y el comando anterior crea el objeto gs://your-bucket/abc/your-file. De lo contrario, gsutil crea el objeto gs://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:

  1. Agrega una barra al final de la URL de destino para que gsutil siempre la trate como una carpeta.

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

  3. 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 a gs://your-bucket/new como una carpeta. Una vez que tengas al menos uno de tus objetos en gs://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 que gs://my-bucket/folder/ es un objeto diferente de gs://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?