Platzhalternamen

Beschreibung

gsutil unterstützt URI-Platzhalter. Beispielsweise mit dem Befehl:

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

kopiert alle Objekte, die mit gs://bucket/data/abc beginnen, gefolgt von einer beliebigen Anzahl von Zeichen in diesem Unterverzeichnis.

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

Verzeichnis nach Verzeichnis im Vergleich zu rekursiven Platzhaltern

Der Platzhalter * entspricht nur bis zum Ende eines Pfads innerhalb eines Unterverzeichnisses. Wenn der Bucket beispielsweise Objekte mit den Namen gs://bucket/data/abcd, gs://bucket/data/abcdef und gs://bucket/data/abcxyx sowie ein Objekt in einem Unterverzeichnis (gs://bucket/data/abc/def) beinhaltet, würde der obige gsutil cp-Befehl mit den ersten drei Objektnamen übereinstimmen, jedoch nicht mit dem letzten.

Wenn Übereinstimmungen die Verzeichnisgrenzen umfassen sollen, verwenden Sie einen Platzhalter **:

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

führt zu Übereinstimmungen mit allen vier oben gezeigten Objekten.

Beachten Sie, dass gsutil für Objekt- und Dateinamen dieselben Platzhalter unterstützt. So gilt zum Beispiel:

gsutil cp data/abc* gs://bucket

führt zu Übereinstimmungen mit allen Namen im lokalen Dateisystem.

Bucket-Platzhalter

Sie können Platzhalter für Bucket-Namen innerhalb eines einzelnen Projekts angeben. Beispiel:

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

Listet den Inhalt aller Buckets im Standardprojekt auf, deren Name mit data beginnt und mit .example.com endet. Mit der Option -p können Sie ein anderes Projekt als das Standardprojekt angeben. Beispiel:

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

Sie können auch Platzhalter für Bucket- und Objektnamen kombinieren. Mit diesem Befehl werden beispielsweise alle .txt-Dateien aus allen Ihrer Cloud Storage-Buckets im Standardprojekt entfernt:

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

Andere Platzhalterzeichen

Zusätzlich zu * können Sie folgende Platzhalter verwenden:

?
stimmt mit einem einzelnen Zeichen überein. "Gs://bucket/?.Txt" sucht beispielsweise nur nach Objekten mit zwei Zeichen, gefolgt von .txt.
[Zeichen]
stimmt mit einem der angegebenen Zeichen überein. Beispielsweise sucht gs://bucket/[aeiou].txt nach Objekten mit einem einzelnen Vokalzeichen gefolgt von .txt.
[Zeichenbereich]
entspricht einem beliebigen Zeichenbereich. Zum Beispiel sucht gs://bucket/[a-m].txt nach Objekten, die Buchstaben a, b, c, ... oder m enthalten und mit .txt enden.

Sie können Platzhalter kombinieren, um leistungsstärkere Übereinstimmungen zu erhalten. Beispiel:

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

Potenziell unerwartetes Verhalten bei der Verwendung von Platzhaltern

Es gibt mehrere Möglichkeiten, wie Platzhalter zu unerwartetem Verhalten führen können:

  1. Shells wie bash und zsh können versuchen, Platzhalter zu erweitern, bevor die Argumente an gsutil übergeben werden. Wenn der Platzhalter auf ein Cloud-Objekt verweisen sollte, kann dies zu unerwarteten "Nicht gefunden"-Fehlern führen, z. B. wenn die Shell versucht, den Platzhalter gs://my-bucket/* auf dem lokalen Computer zu erweitern, keine passenden lokalen Dateien vorhanden sind und der Befehl fehlschlägt.

    Beachten Sie, dass einige Shells zusätzliche Zeichen in ihren Platzhalterzeichensätzen enthalten. Wenn Sie beispielsweise zsh mit der extendedglob-Option verwenden, wird # als Sonderzeichen behandelt, das mit der Verwendung dieses Zeichens in Bezug auf versionierte Objekte in Konflikt steht. Ein Beispiel finden Sie unter Nicht aktuelle Objektversionen wiederherstellen.

    Setzen Sie den Ausdruck mit Platzhalter zur Vermeidung dieser Probleme in einfache Anführungszeichen (unter Linux) oder doppelte Anführungszeichen (unter Windows).

  2. Der Versuch, einen Dateinamen anzugeben, der Platzhalterzeichen enthält, funktioniert nicht, da gsutil versucht, die Platzhalterzeichen zu erweitern, anstatt sie als Literalzeichen zu verwenden. Führen Sie beispielsweise den folgenden Befehl aus:

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

    Damit versucht gsutil, den Teil [1] als Platzhalter abzugleichen.

    Es gibt ein ungelöstes Problem bei der Unterstützung eines "Roh"-Modus für gsutil, um eine Möglichkeit zu bieten, mit Dateinamen zu arbeiten, die Platzhalterzeichen enthalten. Aber bis / solange diese Unterstützung nicht implementiert ist, gibt es keine wirklich gute Möglichkeit, gsutil mit solchen Dateinamen zu verwenden. Zum Beispiel können Sie solche Dateien mit einem Platzhalter versehen. Ersetzen Sie beispielsweise den obigen Befehl durch:

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

    Dieser Ansatz ist im Allgemeinen aber schwer zu verwenden.

Unterschiedliches Verhalten für "Punkt"-Dateien im lokalen Dateisystem

Beim Standard-Unix-Verhalten stimmt der Platzhalter * nur mit Dateien überein, die nicht mit einem .-Zeichen beginnen (um Verwechslung zu vermeiden mit den Verzeichnisse . und .. vorhanden in allen Unix-Verzeichnisse). gsutil bietet dieses Verhalten bei Verwendung von Platzhaltern über eine Dateisystem-URI, aber stellt dieses Verhalten nicht über Cloud-URIs zur Verfügung. Mit dem folgenden Befehl werden beispielsweise alle Objekte von gs://bucket1 nach gs://bucket2 kopiert:

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

Mit dem folgenden Befehl werden nur Dateien, die nicht mit einem . beginnen aus dem Verzeichnis dir in gs://bucket1 kopiert:

gsutil cp dir/* gs://bucket1

Berücksichtigung in der Effizienz: Platzhalter über viele Objekte hinweg verwenden

Die Verwendung von Platzhaltern mit einem Objektnamenpräfix ohne Platzhalter ist effizienter, schneller und weniger netzwerkintensiv. Beispiel:

gs://bucket/abc*.txt

als Platzhalter als ersten Teil des Objektnamens zu verwenden. Beispiel:

gs://bucket/*abc.txt

Dies liegt daran, dass die Anfrage für gs://bucket/abc*.txt den Server auffordert, die Teilmenge der Ergebnisse zurückzusenden, deren Objektname mit "abc" im Bucket-Stammverzeichnis beginnt, und gsutil dann die Ergebnisliste nach Objekten filtert, deren Name mit ".txt" endet. Im Gegensatz dazu fragt gs://bucket/*abc.txt den Server nach der vollständigen Liste der Objekte im Bucket-Stammverzeichnis und filtert dann nach den Objekten, deren Name mit abc.txt endet. Die Effizienz wirkt sich immer deutlicher aus, wenn Sie Buckets mit Tausenden oder mehr Objekten verwenden. Es ist möglich, die Namen Ihrer Objekte so einzurichten, dass sie mit den Mustern für den Abgleich mit erwarteten Platzhaltern übereinstimmen, um die Effizienz von serverseitigen Präfixanfragen nutzen zu können. Ein konkretes Anwendungsfallbeispiel finden Sie unter gsutil help prod.

Berücksichtigung in der Effizienz: Mid-Path-Platzhalter verwenden

Angenommen, Sie haben einen Bucket mit diesen Objekten:

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

Wenn Sie den Befehl ausführen:

gsutil ls gs://bucket/*/obj5

führt gsutil eine /-getrennte Top-Level-Bucket-Auflistung durch und eine Liste für alle Unterverzeichnisse. Insgesamt gibt es also drei Bucket-Einträge:

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

Je mehr Buckets Ihr Platzhalter enthält, desto langsamer und teurer ist es. Die Anzahl der erforderlichen Bucket-Einträge erhöht sich so:

  • Die Anzahl der Platzhalterkomponenten (z. B. "gs://bucket/a??b/c*/*/d" enthält drei Platzhalterkomponenten);
  • Die Anzahl der Unterverzeichnisse, die der jeweiligen Komponente entsprechen und
  • Die Anzahl der Ergebnisse (Paginierung erfolgt mit einer GET-Anfrage pro 1.000 Ergebnisse, wobei Markierungen für jedes Ergebnis angegeben werden).

Wenn Sie einen Mid-Path-Platzhalter verwenden möchten, können Sie stattdessen einen rekursiven Platzhalter verwenden. Beispiel:

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

Dies entspricht mehr Objekten als gs://bucket/*/obj5 (da es sich über Verzeichnisse erstreckt), ist aber durch eine Auflistungsanfrage ohne Trennzeichen implementiert (was weniger Bucket-Anfragen bedeutet, obwohl es den gesamten Bucket auflistet und lokal filtert, sodass eine nicht unerhebliche Menge an Netzwerkverkehr erforderlich sein könnte).