Noms avec des caractères génériques

Description

gsutil accepte les caractères génériques d'URI. Par exemple, la commande :

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

copie tous les objets de ce sous-répertoire dont le nom commence par gs://bucket/data/abc, suivis d'un nombre quelconque de caractères.

Caractères génériques répertoire par répertoire ou récursifs

Le caractère générique "*" ne correspond qu'à la fin d'un chemin d'accès dans un sous-répertoire. Par exemple, si le bucket contient des objets nommés gs://bucket/data/abcd, gs://bucket/data/abcdef et gs://bucket/data/abcxyx, ainsi qu'un objet de sous-répertoire (gs://bucket/data/abc/def), la commande "gsutil cp" ci-dessus correspond aux noms des trois premiers objets, mais pas au dernier.

Si vous souhaitez des correspondances couvrant des limites de répertoires, utilisez un caractère générique "**" :

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

correspondra aux quatre objets ci-dessus.

Notez que gsutil accepte les mêmes caractères génériques pour les objets et les noms de fichiers. Par exemple :

gsutil cp data/abc* gs://bucket

correspondra à tous les noms du système de fichiers local. La plupart des interfaces système de commande sont également compatibles avec les caractères génériques. Par conséquent, si vous exécutez la commande ci-dessus, votre interface système développe probablement les correspondances avant d'exécuter gsutil. Cependant, la plupart des interfaces système ne sont pas compatibles avec les caractères génériques récursifs ('**'). Vous pouvez faire en sorte que la compatibilité avec les caractères génériques de gsutil fonctionne en plaçant les arguments entre guillemets simples pour qu'ils ne soient pas interprétés par l'interface système avant d'être transmis à gsutil :

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

Caractères génériques de bucket

Vous pouvez spécifier des caractères génériques pour les noms de buckets au sein d'un même projet. Exemple :

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

affiche le contenu de tous les buckets dont le nom commence par "data" et se termine par ".example.com" dans le projet par défaut. L'option "-p" peut être utilisée pour spécifier un projet différent de celui par défaut. Exemple :

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

Vous pouvez également combiner des caractères génériques de nom de bucket et d'objet. Par exemple, la commande suivante supprime tous les fichiers ".txt" de n'importe quel bucket Cloud Storage du projet par défaut :

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

Autres caractères génériques

Outre "*", vous pouvez utiliser les caractères génériques suivants :

?
Correspond à un seul caractère. Par exemple, "gs://bucket/??.txt" ne recherche que les objets dont deux caractères sont suivis de ".txt".
[caractères]
Correspond à l'un des caractères spécifiés. Par exemple, "gs://bucket/[aeiou].txt" renvoie les objets contenant une seule voyelle suivie de ".txt"
[plage caract]
Correspond à n'importe quel caractère de la plage. Par exemple, "gs://bucket/[am].txt" recherche les objets contenant les lettres "a", "b", "c", ... jusqu'à "m" et se terminant par ".txt".

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

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

Comportements potentiellement inattendus lors de l'utilisation de caractères génériques

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

  1. Les interfaces système (telles que bash et zsh) peuvent tenter de développer les caractères génériques avant de transmettre les arguments à gsutil. Si le caractère générique est censé faire référence à un objet cloud, cela peut entraîner des erreurs inattendues de type "Introuvable" (par exemple, si l'interface système tente de développer le caractère générique "gs://my-bucket/*"). sur la machine locale, car il ne trouve aucun fichier local et ne parvient pas à exécuter la commande).

    Notez que certaines interfaces système contiennent des caractères supplémentaires dans leurs jeux de caractères génériques. Par exemple, si vous utilisez zsh avec l'option "extendedglob", le caractère "#" est traité comme un caractère spécial, qui entre en conflit avec l'utilisation de ce caractère dans le référencement des objets versionnés (consultez la page gsutil help version pour en savoir plus).

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

  2. Vous ne pouvez pas spécifier un nom de fichier contenant des caractères génériques, car gsutil tente de développer les caractères génériques plutôt que de les utiliser en tant que caractères littéraux. Par exemple, en exécutant la commande :

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

    gsutil tente de faire correspondre la partie "[1]" à un caractère générique.

    Il existe un problème signalé de prise en charge du mode "brut" par gsutil, permettant d'utiliser des noms de fichiers contenant des caractères génériques. Toutefois, tant que cette compatibilité n'est pas mise en œuvre, il est impossible d'utiliser gsutil avec ces noms de fichiers. Vous pouvez utiliser un caractère générique pour nommer ces fichiers. Par exemple, vous pouvez remplacer la commande ci-dessus par :

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

    mais cette approche est potentiellement difficile à mettre en œuvre en général.

Comportement différent pour les fichiers "Dot" au sein du système de fichiers local

Conformément au comportement Unix standard, le caractère générique "*" correspond uniquement aux fichiers qui ne commencent pas par un "." (pour éviter toute confusion avec les répertoires "." et ".." présents dans tous les répertoires Unix. gsutil adopte ce même comportement lorsque vous utilisez des caractères génériques dans l'URI d'un système de fichiers, mais pas avec les URI cloud. Par exemple, la commande suivante copie tous les objets de gs://bucket1 vers gs://bucket2 :

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

mais la commande suivante ne copie que les fichiers qui ne commencent pas par "." du répertoire "dir" vers gs://bucket1 :

gsutil cp dir/* gs://bucket1

Facteur d'efficacité : utilisation de caractères génériques sur de nombreux objets

L'utilisation de caractères génériques comportant un préfixe de nom d'objet sans caractère générique est plus efficace, plus rapide et moins consommatrice de trafic réseau, par exemple :

gs://bucket/abc*.txt

que l'utilisation de caractères génériques comme première partie du nom d'objet. Exemple :

gs://bucket/*abc.txt

En effet, la requête "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 gsutil filtre la liste des résultats pour obtenir les objets dont le nom se termine par ".txt". En revanche, "gs://bucket/*abc.txt" demande au serveur la liste complète des objets de 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 correspondent aux modèles de correspondance de caractères génériques attendus, afin de profiter de l'efficacité des requêtes de préfixe côté serveur. Consultez, par exemple, gsutil help prod pour obtenir un exemple concret d'utilisation.

Facteur d'efficacité : utilisation de caractères génériques au milieu du chemin d'accès

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 :

gsutil ls gs://bucket/*/obj5

gsutil 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 le nombre de listes de buckets requises par votre caractère générique est élevé, plus le processus sera lent et coûteux. 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 à l'aide d'une requête GET pour 1 000 résultats, en spécifiant des marqueurs pour chacun d'eux).

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 :

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

Il permet d'obtenir plus d'objets que "gs://bucket/*/obj5" (puisqu'il couvre des répertoires). Toutefois, il est mis en œuvre à 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 répertorié et filtré localement, ce qui induit une quantité non négligeable de trafic réseau).