Nombres comodín

Descripción

gsutil admite comodines de URI. Por ejemplo:

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

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

Comparación entre directorio por directorio y comodines recurrentes

El comodín “*” solo coincide por completo con una ruta de acceso dentro de un subdirectorio. Por ejemplo, si el depósito 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 cp de gsutil 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** .

Este comando coincidirá 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

Este comando coincidirá con todos los nombres del sistema de archivos local. La mayoría de las shells de comando también admiten comodines, por lo que, si ejecutas el comando anterior, es probable que la shell expanda las coincidencias antes de ejecutar gsutil. Sin embargo, la mayoría de las shells no admiten comodines recurrentes (“**”), y puedes hacer que la compatibilidad de comodines de gsutil funcione para esas shells si usas comillas simples en los argumentos a fin de que la shell no los interprete antes de pasarlos a gsutil:

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

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

Este comando mostrará el contenido de todos los depósitos 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 quitará todos los archivos “.txt” de cualquiera de tus depósitos 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 se refería a un objeto en la nube, esto puede generar errores inesperados de “No se encontró” (p. ej., si la shell intenta expandir el comodín “gs://my-bucket/*” en la máquina local, no coincidirá con ningún archivo local y fallará 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 carácter para hacer referencia a los objetos con versión (consulta ayuda de gsutil sobre versiones para obtener más detalles).

    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
    

    Este comando hará 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

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

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

Sin embargo, el siguiente comando solo copiará los archivos que no comiencen 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 envíe el subconjunto de resultados cuyos nombres de objetos comienzan con “abc” en la raíz del depósito y, luego, gsutil filtra la lista de resultados con los 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 depósito y, luego, filtra aquellos objetos cuyos nombres terminan con “abc.txt”. Esta consideración de eficiencia se vuelve cada vez más evidente cuando usas depósitos 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 depósito 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 realizará una lista de depósitos de nivel superior delimitada por / y, luego, una lista de depósitos para cada subdirectorio, lo que da como resultado un total de 3 listas de depósitos:

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

Cuantas más listas de depósitos requiera el 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 depósitos sin delimitador (lo que significa una menor cantidad de solicitudes de depósitos, a pesar de que enumerará todo el depósito y se filtrará de forma local, por lo que podría requerir una cantidad no trivial de tráfico de red).