Caractères génériques d'URI

La Google Cloud CLI prend en charge l'utilisation des caractères génériques URI pour les fichiers, les buckets et les objets. Les caractères génériques vous permettent de travailler efficacement avec des groupes de fichiers correspondant à des modèles de nommage spécifiés. Cette page décrit les caractères génériques pris en charge et indique les points importants à prendre en compte lors de leur utilisation dans les commandes.

Caractères génériques

La gcloud CLI prend en charge les caractères génériques suivants :

Caractère Description
* Correspond à zéro caractère ou plus au niveau du répertoire actuel. Par exemple, cp gs://my-bucket/abc/d* correspond à l'objet abc/def.txt, mais pas à l'objet abc/def/g.txt. Dans le cas des commandes de liste telles que ls, si un * final correspond à un sous-répertoire du répertoire actuel, le contenu du sous-répertoire est également listé.
** Correspond à zéro caractère ou plus dans tous les répertoires. Lorsqu'il est utilisé dans un chemin d'accès à un fichier local, le caractère générique ** doit toujours être immédiatement précédé d'un délimiteur de répertoire. Par exemple, my-directory/**.txt est valide, mais my-directory/abc** ne l'est pas..
? Correspond à un seul caractère. Par exemple, gs://bucket/??.txt ne recherche que les objets avec exactement deux caractères suivis de .txt.
[CHARACTERS] Correspond à l'un des caractères spécifiés. Par exemple, gs://bucket/[aeiou].txt recherche des objets contenant une seule voyelle suivie de .txt.
[CHARACTER_RANGE] Correspond à n'importe quel caractère de la plage. Par exemple, gs://bucket/[a-e].txt recherche des objets contenant la lettre a, b, c, d ou e suivie de .txt.

Vous pouvez combiner des caractères génériques pour obtenir des correspondances plus efficaces, par exemple :

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

Sachez que si votre commande n'inclut pas d'option permettant de renvoyer des versions d'objet archivées dans les résultats, ces caractères génériques ne correspondent qu'aux versions d'objets actives.

La gcloud CLI prend en charge les mêmes caractères génériques pour les noms d'objets et de fichiers. Par exemple :

gcloud storage cp data/abc* gs://bucket

correspond à tous les fichiers commençant par abc dans le répertoire data du système de fichiers local.

Considérations liées au comportement

L'utilisation de caractères génériques peut entraîner divers comportements inattendus :

  • Lorsque vous utilisez des caractères génériques dans les noms de buckets, les correspondances sont limitées aux buckets d'un même projet. De nombreuses commandes vous permettent de spécifier un projet à l'aide d'un flag. Si une commande n'inclut pas de flag de projet ou ne prend pas en charge son utilisation, les correspondances sont limitées aux buckets du projet par défaut.

  • Les shells (tels que bash et zsh) peuvent tenter d'expanser les caractères génériques avant de transmettre les arguments à la gcloud CLI. Si le caractère générique est censé faire référence à un objet cloud, cela peut entraîner des erreurs "Introuvable" inattendues. Par exemple, le shell peut essayer d'expanser le caractère générique gs://my-bucket/* sur la machine locale, ce qui ne donnerait aucune correspondance à un fichier local, entraînant ainsi l'échec de la commande.

    En outre, certains shells contiennent d'autres caractères dans leurs jeux de caractères génériques. Par exemple, si vous utilisez zsh avec l'option extendedglob, # est traité comme un caractère spécial, ce qui va à l'encontre de son utilisation dans le référencement d'objets avec versions gérées (voir Restaurer les versions d'objet obsolètes pour obtenir un exemple).

    Pour éviter ces problèmes, placez l'expression entre des guillemets simples (sous Linux) ou guillemets doubles (sous Windows).

  • Vous ne pouvez pas spécifier un nom de fichier contenant des caractères génériques, car les outils de ligne de commande tentent d'expanser les caractères génériques plutôt que de les utiliser en tant que caractères littéraux. Par exemple, la commande :

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

    ne copie jamais les fichiers locaux nommés file[1]. Au lieu de cela, la gcloud CLI traite toujours [1] comme un caractère générique.

    La gcloud CLI ne prend pas en charge le mode "brut" qui lui permet d'utiliser des noms de fichiers contenant des caractères génériques. Pour ces fichiers, vous devez utiliser un outil différent, tel que la console Google Cloud , ou utiliser un caractère générique pour capturer les fichiers. Par exemple, pour capturer un fichier nommé file[1], vous pouvez utiliser la commande suivante :

    gcloud storage cp './file*1*' gs://my-bucket
  • Conformément au comportement Unix standard, le caractère générique * ne correspond qu'aux fichiers qui ne commencent pas par un caractère . (pour éviter toute confusion avec les répertoires . et .. présents dans tous les répertoires Unix). La gcloud CLI applique le même comportement lorsque vous utilisez des caractères génériques sur un URI de système de fichiers, mais pas sur des URI cloud. Par exemple, la commande suivante copie tous les objets depuis gs://bucket1 vers gs://bucket2 :

    gcloud storage cp gs://bucket1/* gs://bucket2

    Toutefois, la commande suivante ne copie que les fichiers qui ne commencent pas par . du répertoire dir à gs://bucket1 :

    gcloud storage cp dir/* gs://bucket1

Considérations liées à l'efficacité

  • Pour gagner en efficacité et rapidité et pour consommer moins de trafic réseau, mieux vaut utiliser des caractères génériques comportant un préfixe de nom d'objet sans caractère générique, par exemple :

    gs://bucket/abc*.txt

    plutôt que des caractères génériques remplaçant la première partie du nom d'objet, par exemple :

    gs://bucket/*abc.txt

    En effet, la requête pour gs://bucket/abc*.txt demande au serveur de renvoyer le sous-ensemble de résultats dont le nom d'objet commence par abc à la racine du bucket, puis elle filtre la liste des résultats pour ne retenir que les objets dont le nom se termine par .txt. En revanche, gs://bucket/*abc.txt demande au serveur la liste complète des objets à la racine du bucket, puis filtre les objets dont le nom se termine par abc.txt. Ce facteur d'efficacité est encore plus visible lorsque vous utilisez des buckets contenant des milliers d'objets ou plus. Il est parfois possible de configurer les noms de vos objets pour qu'ils soient adaptés aux modèles de correspondance des caractères génériques attendus et pour profiter de l'efficacité des requêtes de préfixe côté serveur.

  • Supposons que vous disposiez d'un bucket avec les objets suivants :

    gs://bucket/obj1
    gs://bucket/obj2
    gs://bucket/obj3
    gs://bucket/obj4
    gs://bucket/dir1/obj5
    gs://bucket/dir2/obj6

    Si vous exécutez la commande ci-dessous :

    gcloud storage ls gs://bucket/*/obj5

    gcloud storage renvoie une liste des buckets de premier niveau délimités par / puis une liste de buckets pour chaque sous-répertoire, soit un total de trois listes de buckets :

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

    Plus les listes de bucket requises par le caractère générique sont nombreuses, plus l'opération est lente et onéreuse. Le nombre de listes de buckets requises augmente avec :

    • le nombre de composants génériques (par exemple, gs://bucket/a??b/c*/*/d comporte trois composants génériques) ;

    • le nombre de sous-répertoires correspondant à chaque composant ; et

    • le nombre de résultats (la pagination est effectuée lorsque le nombre de résultats est trop élevé, en spécifiant des marqueurs pour chaque requête).

    Si vous souhaitez utiliser un caractère générique au milieu d'un chemin d'accès, essayez plutôt d'utiliser un caractère générique récursif, par exemple :

    gcloud storage ls gs://bucket/**/obj5

    Cela correspond à plus d'objets que gs://bucket/*/obj5 (puisqu'il couvre plusieurs répertoires) mais est implémenté à l'aide d'une requête de liste de buckets sans délimiteur (ce qui réduit le nombre de requêtes de bucket, bien que l'ensemble du bucket soit listé et filtré localement, ce qui peut nécessiter une quantité non négligeable de trafic réseau).