Dossiers

Cette page décrit les dossiers dans Cloud Storage et leurs variations dans les outils Cloud Storage.

Présentation

Cloud Storage fonctionne avec un espace de noms unique, ce qui signifie que les dossiers n'existent pas réellement dans Cloud Storage. Si vous créez un objet nommé folder1/file.txt dans le bucket your-bucket, le chemin d'accès à l'objet est your-bucket/folder1/file.txt. Il n'existe pas de dossier folder1, mais un seul objet dont le nom contient folder1.

Toutefois, Cloud Console et gsutil fournissent l'illusion d'une arborescence de fichiers hiérarchique :

  • Cloud Console crée une représentation visuelle des dossiers qui ressemblent à l'explorateur de fichiers local.

  • gsutil simule l'expérience de répertoire de ligne de commande classique à l'aide de diverses règles.

/storage/images/folders.svg

Si vous créez un dossier vide à l'aide de Cloud Console, Cloud Storage crée un objet de zéro octet en tant qu'espace réservé. Par exemple, si vous créez un dossier nommé folder dans un bucket appelé my-bucket, un objet de zéro octet nommé gs://my-bucket/folder/ est créé. Vous pouvez trouver cet objet lorsque vous exécutez gsutil ls.

Outils

Cliquez sur les onglets ci-dessous pour découvrir comment chaque outil gère les dossiers.

Console

Dans Cloud Console, vous pouvez créer un dossier vide dans un bucket ou importer un dossier existant.

Lorsque vous importez un dossier existant, le nom du dossier devient une partie du chemin d'accès de tous les objets qu'il contient. Tous les sous-dossiers et les objets qu'ils contiennent sont également inclus dans l'importation.

Pour créer un dossier, procédez comme suit :

  1. Dans Google Cloud Console, accédez à la page du Navigateur Cloud Storage.

    Accéder à la page du navigateur

  2. Accédez au bucket.

  3. Cliquez sur Créer un dossier pour créer un dossier vide ou sur Importer un dossier pour importer un dossier existant.

gsutil

Pour illustrer l'arborescence de fichiers hiérarchique, gsutil applique les règles suivantes pour déterminer si l'URL de destination d'une commande doit être traitée comme un nom d'objet ou un dossier :

  1. Si l'URL de destination se termine par un caractère /, gsutil la traite comme un dossier. Prenons l'exemple de la commande suivante, où your-file est le nom d'un fichier :

    gsutil cp your-file gs://your-bucket/abc/

    En conséquence, gsutil crée un objet nommé gs://your-bucket/abc/your-file.

  2. Si vous copiez plusieurs fichiers sources dans une URL de destination, gsutil considère que l'URL de destination est un dossier. Prenons l'exemple de la commande suivante, où your-dir est un dossier contenant des fichiers tels que file1 et file2 :

    gsutil cp -r your-dir gs://your-bucket/abc

    Par conséquent, gsutil crée les objets gs://your-bucket/abc/your-dir/file1 et gs://your-bucket/abc/your-dir/file2.

  3. Si aucune des règles ci-dessus ne s'applique, gsutil vérifie les objets du bucket pour déterminer si l'URL de destination est un nom d'objet ou un dossier. Prenons l'exemple de la commande suivante, où your-file est le nom d'un fichier :

    gsutil cp your-file gs://your-bucket/abc

    gsutil envoie une requête de création de liste d'objets pour your-bucket, en utilisant le délimiteur / et le préfixe=abc, pour déterminer si le bucket comporte des objets dont le chemin d'accès commence par gs://your-bucket/abc/. Si tel est le cas, gsutil traite gs://your-bucket/abc comme un nom de dossier, et la commande ci-dessus crée l'objet gs://your-bucket/abc/your-file. Sinon, gsutil crée l'objet gs://your-bucket/abc.

L'approche basée sur des règles de gsutil diffère du fonctionnement de nombreux outils, qui créent des objets de 0 octet pour marquer l'existence de dossiers. gsutil comprend plusieurs conventions utilisées par ces outils, telles que la convention d'ajout de _$folder$ à la fin du nom de l'objet de 0 octet, mais gsutil ne nécessite pas de tels objets de repère pour mettre en œuvre un comportement de dénomination cohérent avec les commandes UNIX.

Tentatives et dénomination

Si vous activez la relance automatique des tentatives via gsutil, vous risquez de rencontrer un problème dans lequel une première tentative ne copie qu'un sous-ensemble de fichiers et les tentatives suivantes rencontrent un dossier de destination déjà existant et nomment correctement vos objets.

Prenons l'exemple de la commande suivante, qui comporte des sous-dossiers sous your-dir/, tels que dir1 et dir2, et où les deux sous-dossiers contiennent le fichier abc :

gsutil cp -r ./your-dir gs://your-bucket/new

Si l'objet gs://your-bucket/new n'existe pas encore, gsutil crée les objets suivants à la première tentative réussie :

gs://your-bucket/new/dir1/abc
gs://your-bucket/new/dir2/abc

Lors de la prochaine tentative réussie, gsutil crée les objets suivants :

gs://your-bucket/new/your-dir/dir1/abc
gs://your-bucket/new/your-dir/dir2/abc

Pour que gsutil fonctionne de manière cohérente à chaque tentative, procédez comme suit :

  1. Ajoutez une barre oblique à la fin de l'URL de destination afin que gsutil la traite toujours comme un dossier.

  2. Utilisez gsutil rsync. Étant donné que rsync n'utilise pas les règles de dénomination des dossiers définies par cp d'Unix, la commande s'exécute de manière cohérente, que le sous-dossier de destination existe ou non.

  3. Si gsutil rsync ne fonctionne pas, créez un objet à espace réservé pour établir que la destination est un dossier. Exemple :

    gsutil cp some-file gs://your-bucket/new/placeholder

    Si l'objet d'espace réservé est présent, l'exécution de la commande gsutil cp -r ci-dessus traite invariablement gs://your-bucket/new comme un dossier. Une fois que vous disposez d'au moins un de vos objets sous gs://your-bucket/new, vous pouvez supprimer l'objet d'espace réservé et poursuivre vos importations.

Pour en savoir plus sur la construction des noms, consultez gsutil help cp.

Remarques supplémentaires

  • Vous ne pouvez pas créer d'objet de zéro octet pour imiter un dossier vide à l'aide de gsutil.

  • Si vous utilisez des scripts pour créer des chemins de fichiers en combinant des sous-chemins, notez que comme / est simplement un caractère qui se trouve dans le nom de l'objet, gsutil interprète gs://my-bucket/folder/ comme un objet différent de gs://my-bucket//folder.

Remarques sur les tarifs

L'un des inconvénients de l'approche de dénomination de gsutil est qu'elle nécessite une liste d'objets supplémentaire avant d'exécuter une commande cp ou mv, telle qu'une copie récursive d'un dossier vers le cloud. Toutefois, ces listes sont relativement peu coûteuses, car elles utilisent des paramètres de délimiteur et de préfixe pour limiter les données de résultat. gsutil n'envoie qu'une seule requête de création de liste d'objets par commande cp ou mv. Par conséquent, le coût de tous les objets transférés est amorti.

API REST

API JSON

Les dossiers n'existent pas dans l'API JSON, mais vous pouvez affiner laobjets que vous répertoriez à l'aide des paramètres de requête prefix et delimiter.

Par exemple, pour répertorier tous les objets du bucket my-bucket avec le préfixe folder/subfolder/, exécutez une requête de liste d'objets en utilisant cette URL :

"https://storage.googleapis.com/storage/v1/b/my-bucket/o?prefix=folder/subfolder/"

API XML

Les dossiers n'existent pas dans l'API XML, mais vous pouvez affiner les objets que vous répertoriez à l'aide des paramètres de requête prefix et delimiter.

Par exemple, pour répertorier tous les objets du bucket my-bucket avec le préfixe folder/subfolder/, exécutez une requête de liste d'objets en utilisant cette URL :

"https://storage.googleapis.com/my-bucket?prefix=folder/subfolder/"