Nombres comodín

Descripción

gsutil admite comodines de URI. Por ejemplo:

gsutil cp gs://bucket/data/abc* .

Este comando copia todos los objetos que comiencen con gs://bucket/data/abc seguidos de cualquier cantidad de caracteres dentro de ese subdirectorio.

Algunas shells requieren que las expresiones con comodines estén entre comillas simples (en Linux) o comillas dobles (en Windows). Por ejemplo:

gsutil cp 'data/abc**' gs://bucket

Comparación entre directorio por directorio y comodines recurrentes

El comodín * solo coincide hasta el final de una ruta dentro de un subdirectorio. Por ejemplo, si el bucket contiene objetos llamados gs://bucket/data/abcd, gs://bucket/data/abcdef, y gs://bucket/data/abcxyx, y un objeto en un subdirectorio (gs://bucket/data/abc/def), el comando gsutil cp anterior coincidirá con los primeros 3 nombres de objeto, pero no con el último.

Si deseas que las coincidencias abarquen los límites del directorio, usa un comodín **:

gsutil cp gs://bucket/data/abc** .

coincide con los cuatro objetos anteriores.

Ten en cuenta que gsutil admite los mismos comodines para objetos y nombres de archivos. Por ejemplo:

gsutil cp data/abc* gs://bucket

coincide con todos los nombres en el sistema de archivos local.

Comodines de depósitos

Puedes especificar comodines para los nombres de los depósitos dentro de un solo proyecto. Por ejemplo:

gsutil ls gs://data*.example.com

Enumera el contenido de todos los buckets cuyos nombres comiencen con data y terminen con .example.com en el proyecto predeterminado. La opción -p se puede usar para especificar un proyecto que no sea el predeterminado. Por ejemplo:

gsutil ls -p other-project gs://data*.example.com

También puedes combinar comodines de nombres de depósitos y objetos. Por ejemplo, este comando quita todos los archivos .txt en cualquiera de tus buckets de Cloud Storage en el proyecto predeterminado:

gsutil rm gs://*/**.txt

Otros caracteres comodín

Además de *, puedes usar estos comodines:

?
Coincide con un solo carácter. Por ejemplo, “gs://bucket/??.txt” solo coincide con objetos con dos caracteres seguidos de .txt.
[chars]
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.
[char range]
Coincide con cualquiera de los rangos de caracteres. Por ejemplo, gs://bucket/[a-m].txt coincide con los objetos que contienen letras a, b, c, … o m, y terminan con .txt.

Puedes combinar comodines para proporcionar coincidencias más eficaces, por ejemplo:

gs://bucket/[a-m]??.j*g

Comportamientos que pueden ser inesperados cuando se usan comodines

Existen varias maneras de usar comodines que pueden dar como resultado comportamientos inesperados:

  1. Las shells (como bash y zsh) pueden intentar expandir los comodines antes de pasar los argumentos a gsutil. Si el comodín debía referirse a un objeto en la nube, esto puede generar errores inesperados de tipo "No encontrado" (p. ej., si la shell intenta expandir el comodín gs://my-bucket/* en la máquina local, no hay coincidencias con archivos locales y falla el comando).

    Ten en cuenta que algunas shells incluyen caracteres adicionales en sus grupos de caracteres comodín. Por ejemplo, si usas zsh con la opción extendedglob habilitada, se tratará a # como un carácter especial, lo que entra en conflicto con el uso de ese caracteres para hacer referencia a los objetos con versión (consulta Copia las versiones de objetos no actuales para obtener un ejemplo).

    Para evitar estos problemas, encierra la expresión de comodín con comillas simples (en Linux) o comillas dobles (en Windows).

  2. Intentar especificar un nombre de archivo que contenga caracteres comodín no funcionará, ya que gsutil intentará expandir los caracteres comodín en lugar de usarlos como caracteres literales. Por ejemplo:

    gsutil cp './file[1]' gs://my-bucket
    

    hace que gsutil intente hacer coincidir la parte [1] como un comodín.

    Existe un problema abierto a fin de admitir un modo “sin procesar” para que gsutil proporcione una forma de funcionar con nombres de archivos que contengan caracteres comodín, pero, hasta que esa compatibilidad se implemente o a menos que eso suceda, no habrá forma de usar gsutil con esos nombres de archivo. Puedes usar un comodín para asignar un nombre a esos archivos, por ejemplo, si reemplazas el comando anterior por el siguiente:

    gsutil cp './file*1*' gs://my-bucket
    

    Sin embargo, ese enfoque puede ser difícil de usar en general.

Comportamiento diferente para los archivos “dot” en el sistema de archivos local

Con el comportamiento estándar de Unix, el comodín * solo coincide con los archivos que no comienzan con un carácter . (a fin de evitar confusiones con los directorios . y .. en todos los directorios de Unix). gsutil proporciona este mismo comportamiento cuando se usan comodines en un URI de sistema de archivos, pero no proporciona este comportamiento en los URI en la nube. Por ejemplo, el siguiente comando copia todos los objetos de gs://bucket1 a gs://bucket2:

gsutil cp gs://bucket1/* gs://bucket2

pero el siguiente comando solo copia los archivos que no comienzan con . del directorio dir a gs://bucket1:

gsutil cp dir/* gs://bucket1

Consideración de la eficiencia: Usa comodines en muchos objetos

Es más eficiente, más rápido y requiere menos tráfico de red usar comodines que tienen un prefijo de nombre de objeto sin comodín, como los siguientes:

gs://bucket/abc*.txt

Esto se contrapone a usar comodines como la primera parte del nombre del objeto, por ejemplo:

gs://bucket/*abc.txt

Esto se debe a que la solicitud de gs://bucket/abc*.txt le pide al servidor que vuelva a enviar el subconjunto de resultados cuyo nombre de objeto comienza con abc en la raíz del bucket y, luego, gsutil filtra la lista de resultados para objetos cuyos nombres terminan con .txt. Por el contrario, gs://bucket/*abc.txt solicita al servidor la lista completa de objetos en la raíz del bucket y, luego, filtra los objetos cuyos nombres terminan en abc.txt. Esta consideración de eficiencia se vuelve cada vez más evidente cuando usas buckets que contienen miles de objetos o más. A veces, es posible configurar los nombres de los objetos para que se ajusten a los patrones de coincidencia de comodines esperados, a fin de aprovechar la eficiencia de realizar solicitudes de prefijos del servidor. Consulta, por ejemplo, ayuda de gsutil sobre producción para ver un ejemplo de caso de uso concreto.

Consideración de la eficiencia: Usa comodines de mitad de ruta de acceso

Supongamos que tienes un bucket 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 a continuación, ocurrirá lo siguiente:

gsutil ls gs://bucket/*/obj5

gsutil genera una lista de buckets de nivel superior delimitada por / y, luego, una lista de buckets para cada subdirectorio, lo que da como resultado un total de 3 listas de buckets:

GET /bucket/?delimiter=/
GET /bucket/?prefix=dir1/obj5&delimiter=/
GET /bucket/?prefix=dir2/obj5&delimiter=/

Cuantas más listas de buckets requiera tu comodín, más lento y costoso será. La cantidad de listas de depósitos necesarias aumenta según lo siguiente:

  • La cantidad de componentes del comodín (p. ej., “gs://bucket/a??b/c*/*/d” tiene 3 componentes de comodín)
  • La cantidad de subdirectorios que coinciden con cada componente
  • La cantidad de resultados (la paginación se implementa mediante una solicitud GET por cada 1,000 resultados y se especifican los marcadores para cada uno)

Si deseas usar un comodín de mitad de ruta de acceso, puedes intentar usar un comodín recurrente, por ejemplo:

gsutil ls gs://bucket/**/obj5

Esto coincidirá con más objetos que gs://bucket/*/obj5 (ya que abarca directorios), pero se implementa mediante una solicitud de lista de buckets sin delimitador (lo que significa una menor cantidad de solicitudes de buckets, a pesar de que enumera todo el bucket y se filtra de forma local, por lo que podría requerir una cantidad no trivial de tráfico de red).