La CLI de Google Cloud admite el uso de comodines URI para archivos, segmentos y objetos. Los comodines te permiten trabajar de forma eficiente con grupos de archivos que coinciden con patrones de nomenclatura específicos. En esta página se describen los comodines que se admiten y se indican consideraciones importantes al usar comodines en los comandos.
.Caracteres comodín
La CLI de gcloud admite los siguientes comodines:
Carácter | Descripción |
---|---|
* |
Coincide con cero o más caracteres en el nivel del directorio actual. Por ejemplo, cp gs://my-bucket/abc/d* coincide con el objeto abc/def.txt , pero no con el objeto abc/def/g.txt . En el caso de los comandos de lista, como ls , si un * final coincide con un subdirectorio del nivel del directorio actual, también se muestra el contenido del subdirectorio. |
** |
Coincide con cero o más caracteres en los límites de los directorios. Cuando se usa como parte de una ruta de archivo local, el comodín ** siempre debe ir inmediatamente precedido por un delimitador de directorio. Por ejemplo, my-directory/**.txt es válido, pero my-directory/abc** no. |
? |
Coincide con un solo carácter. Por ejemplo, gs://bucket/??.txt solo coincide con objetos que tengan exactamente dos caracteres seguidos de .txt . |
[CHARACTERS] |
Coincide con cualquiera de los caracteres especificados. Por ejemplo, gs://bucket/[aeiou].txt coincide con los objetos que contienen un solo carácter de vocal seguido de .txt . |
[CHARACTER_RANGE] |
Coincide con cualquiera de los caracteres del intervalo. Por ejemplo, gs://bucket/[a-e].txt coincide con los objetos que contienen las letras a, b, c, d o e seguidas de .txt . |
Puedes combinar comodines para obtener coincidencias más potentes. Por ejemplo:
gs://*/[a-m]??.j*g
Ten en cuenta que, a menos que tu comando incluya una marca para devolver versiones de objetos no actuales en los resultados, estas comodines solo coincidirán con las versiones de objetos activas.
La CLI de gcloud admite los mismos comodines para los nombres de objetos y archivos. Por ejemplo:
gcloud storage cp data/abc* gs://bucket
Coincide con todos los archivos que empiezan por abc
en el directorio data
del sistema de archivos local.
Consideraciones sobre el comportamiento
Hay varios casos en los que el uso de comodines puede dar lugar a un comportamiento sorprendente:
Cuando se usan comodines en los nombres de los segmentos, las coincidencias se limitan a los segmentos de un solo proyecto. Muchos comandos te permiten especificar un proyecto mediante una marca. Si un comando no incluye una marca de proyecto o no admite el uso de una marca de proyecto, las coincidencias se limitan a los contenedores del proyecto predeterminado.
Los shells (como bash y zsh) pueden intentar expandir los comodines antes de pasar los argumentos a la gcloud CLI. Si el comodín debía hacer referencia a un objeto en la nube, esto puede provocar errores "No encontrado" inesperados. Por ejemplo, el shell podría intentar expandir el comodín
gs://my-bucket/*
en el equipo local, lo que no coincidiría con ningún archivo local y provocaría que el comando fallara.Además, algunas shells incluyen otros caracteres en sus conjuntos de caracteres comodín. Por ejemplo, si usas zsh con la opción extendedglob habilitada, trata
#
como un carácter especial, lo que entra en conflicto con el uso de ese carácter para hacer referencia a objetos versionados (consulta Restaurar versiones de objetos no actuales para ver un ejemplo).Para evitar estos problemas, rodea la expresión con comodines con comillas simples (en Linux) o comillas dobles (en Windows).
No se puede especificar un nombre de archivo que contenga caracteres comodín, ya que las herramientas de línea de comandos intentan expandir los caracteres comodín en lugar de usarlos como caracteres literales. Por ejemplo, si ejecutas el comando:
gcloud storage cp './file[1]' gs://my-bucket
nunca copia un archivo local llamado
file[1]
. En su lugar, la CLI de gcloud siempre trata[1]
como un comodín.La CLI de gcloud no admite un modo "sin formato" que le permita trabajar con nombres de archivo que contengan caracteres comodín. En el caso de estos archivos, debes usar otra herramienta, como la consola Google Cloud , o un comodín para capturarlos. Por ejemplo, para capturar un archivo llamado
file[1]
, puedes usar el siguiente comando:gcloud storage cp './file*1*' gs://my-bucket
Según el comportamiento estándar de Unix, el comodín
*
solo coincide con los archivos que no empiezan por el carácter.
(para evitar confusiones con los directorios.
y..
presentes en todos los directorios de Unix). La CLI de gcloud proporciona este mismo comportamiento cuando se usan comodines en un URI del sistema de archivos, pero no lo proporciona en URIs de la nube. Por ejemplo, el siguiente comando copia todos los objetos degs://bucket1
engs://bucket2
:gcloud storage cp gs://bucket1/* gs://bucket2
Sin embargo, el siguiente comando solo copia los archivos que no empiezan por
.
del directoriodir
ags://bucket1
:gcloud storage cp dir/* gs://bucket1
Consideraciones sobre la eficiencia
Es más eficiente, rápido y requiere menos tráfico de red usar comodines que tengan un prefijo de nombre de objeto que no sea un comodín, como:
gs://bucket/abc*.txt
que usar comodines como primera parte del nombre del objeto, como:
gs://bucket/*abc.txt
Esto se debe a que la solicitud de
gs://bucket/abc*.txt
pide al servidor que devuelva el subconjunto de resultados cuyo nombre de objeto empiece porabc
en la raíz del contenedor y, a continuación, filtra la lista de resultados para obtener los objetos cuyo nombre termine por.txt
. Por el contrario,gs://bucket/*abc.txt
pide al servidor la lista completa de objetos de la raíz del contenedor y, a continuación, filtra los objetos cuyo nombre termina enabc.txt
. Esta consideración sobre la eficiencia se hace cada vez más evidente cuando usas contenedores que contienen miles de objetos o más. En ocasiones, es posible configurar los nombres de los objetos para que se ajusten a los patrones de coincidencia de comodines esperados y aprovechar la eficiencia de las solicitudes de prefijo del lado del servidor.Supongamos que tienes un contenedor con estos objetos:
gs://bucket/obj1 gs://bucket/obj2 gs://bucket/obj3 gs://bucket/obj4 gs://bucket/dir1/obj5 gs://bucket/dir2/obj6
Si ejecutas el comando:
gcloud storage ls gs://bucket/*/obj5
gcloud storage
realiza un listado de segmentos de nivel superior delimitado por/
y, a continuación, un listado de segmentos por cada subdirectorio, lo que da un total de 3 listados de segmentos:GET /bucket/?delimiter=/ GET /bucket/?prefix=dir1/obj5&delimiter=/ GET /bucket/?prefix=dir2/obj5&delimiter=/
Cuantas más listas de contenedores requiera tu comodín, más lento y caro será. El número de listados de segmentos necesarios aumenta de la siguiente manera:
el número de componentes comodín (por ejemplo,
gs://bucket/a??b/c*/*/d
tiene 3 componentes de comodín);el número de subdirectorios que coinciden con cada componente;
El número de resultados (la paginación se implementa cuando el número de resultados es demasiado grande, especificando marcadores para cada uno).
Si quieres usar un comodín en mitad de la ruta, puedes probar a usar un comodín recursivo. Por ejemplo:
gcloud storage ls gs://bucket/**/obj5
Esta opción coincide con más objetos que
gs://bucket/*/obj5
(ya que abarca directorios), pero se implementa mediante una solicitud de lista de segmentos sin delimitadores (lo que significa que se realizan menos solicitudes de segmentos, aunque se muestra todo el segmento y se filtra localmente, por lo que podría requerir una cantidad considerable de tráfico de red).