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.

Verzeichnis nach Verzeichnis im Vergleich zu rekursiven Platzhaltern

Der Platzhalter "*" entspricht nur 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** .

stimmt mit allen vier Objekten oben überein.

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

gsutil cp data/abc* gs://bucket

stimmt mit allen Namen im lokalen Dateisystem überein. Die meisten Befehls-Shells unterstützen ebenfalls einen Platzhalter. Wenn Sie den obigen Befehl also ausführen, erweitert Ihre Shell wahrscheinlich die Übereinstimmungen, bevor gsutil ausgeführt wird. Die meisten Shells unterstützen jedoch keine rekursiven Platzhalter ('**'). Sie können dafür sorgen, dass die Unterstützung von gsutil-Platzhaltern für solche Shells funktioniert, wenn Sie die Argumente in einfache Anführungszeichen setzen, damit sie nicht von der Shell interpretiert werden, bevor sie an gsutil übergeben werden:

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

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 auf, deren Name im Standardprojekt 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 Ihren 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. "gs://bucket/[aeiou].txt" sucht beispielsweise Objekte mit einem einzelnen Vokalzeichen gefolgt von ".txt" ab.
[Zeichenbereich]
entspricht einem beliebigen Zeichenbereich. "Gs://bucket/[am].txt" sucht beispielsweise nach Objekten, die 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 lokalen Dateien vorhanden sind und der Befehl fehlschlägt.

    Beachten Sie, dass einige Shells zusätzliche Zeichen in ihren Platzhalterzeichensätzen enthalten. Wenn Sie zsh beispielsweise mit der erweiterten Glob-Option verwenden, wird "#" als Sonderzeichen behandelt, was im Konflikt mit der Verwendung dieses Zeichens beim Verweisen auf versionierte Objekte steht. Weitere Informationen finden Sie in der gsutil-Hilfe.

    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 entspricht der Platzhalter "*" nur Dateien, die nicht mit einem "."-Zeichen beginnen (um Verwechslungen mit den in allen Unix-Verzeichnissen vorhandenen Verzeichnissen "." und ".." zu vermeiden). gsutil bietet dasselbe Verhalten bei der Verwendung von Platzhaltern über eine Dateisystem-URI, aber nicht über Cloud-URIs. Mit dem folgenden Befehl werden beispielsweise alle Objekte von gs://bucket1 in gs://bucket2 kopiert:

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

Mit dem folgenden Befehl werden jedoch nur Dateien kopiert, die nicht mit "." im Verzeichnis "dir" nach gs://bucket1 beginnen:

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 ab. Dann wird nach den Objekten gefiltert, 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 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).