ワイルドカード名

説明

gsutil では、URI にワイルドカードを使用できます。たとえば、次のコマンドを実行します。

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

名前が gs://bucket/data/abc で始まり、その後に任意の数の文字が続くすべてのオブジェクトが同じサブディレクトリ内でコピーされます。

ディレクトリ単位と再帰的なワイルドカード

"*" ワイルドカードを使用すると、同じサブディレクトリのパスの終わりまでが比較されます。たとえば、バケット内に gs://bucket/data/abcd、gs://bucket/data/abcdef、gs://bucket/data/abcxyx という名前のオブジェクトがあり、サブディレクトリ(gs://bucket/data/abc/def)に 1 つのオブジェクトがある場合、上記の gsutil cp コマンドは最初の 3 つのオブジェクト名に一致しますが、最後のオブジェクトには一致しません。

ディレクトリの境界を超えて比較する場合には、'**' ワイルドカードを使用します。

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

前述の 4 つのオブジェクトすべてに一致します。

gsutil では、オブジェクトとファイル名の両方に同じワイルドカードを使用できます。 たとえば、次のコマンドを実行します。

gsutil cp data/abc* gs://bucket

ローカル ファイル システムのすべての名前に一致します。大半のコマンドシェルでワイルドカードを使用できます。上記のコマンドを実行すると、gsutil の実行前にシェルが引数を展開する場合があります。ただし、再帰的なワイルドカード('**')は大半のシェルでサポートされていません。このようなシェルで gsutil のワイルドカードを使用する場合には、gsutil に渡される前にシェルで解釈されないように、引数を単一引用符で囲む必要があります。

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

バケットのワイルドカード

1 つのプロジェクト内のバケット名を指定するときにワイルカードを使用できます。次に例を示します。

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

デフォルト プロジェクトで、名前が "data" で始まり、".example.com" で終わるすべてのバケットのコンテンツが一覧表示されます。-p オプションを使用すると、デフォルト以外のプロジェクトを指定できます。次に例を示します。

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

バケット名とオブジェクト名の両方にワイルドカードを使用することもできます。たとえば、次のコマンドを実行すると、デフォルト プロジェクトの任意の Cloud Storage バケットにある ".txt" ファイルがすべて削除されます。

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

他のワイルドカード文字

'*' 以外に、次のワイルドカードを使用できます。

?
1 文字に一致します。たとえば、"gs://bucket/??.txt" は、任意の 2 文字の後に .txt が続くオブジェクトに一致します。
[文字]
指定した任意の文字に一致します。たとえば、"gs://bucket/[aeiou].txt" は、1 つの母音字の後に .txt が続くオブジェクトに一致します。
[文字範囲]
任意の文字範囲に一致します。たとえば、"gs://bucket/[a-m].txt" は、a から m までの 1 文字の後に .txt が続くオブジェクトに一致します。

次のように、ワイルドカードを組み合わせて、より複雑なパターンに一致させることもできます。

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

ワイルドカードの使用時の予期せぬ動作

ワイルドカードを使用すると、予期せぬ動作が生じることがあります。

  1. シェル(bash や zsh など)は、gsutil に引数を渡す前にワイルドカードを展開しようとします。ワイルドカードがクラウド オブジェクトを参照することになっている場合、予期しない「見つかりませんでした」というエラーが発生します(たとえば、シェルがローカルマシンでワイルドカード「gs://my-bucket/*」を展開しようとすると、一致するローカル ファイルがなく、コマンドが失敗します)。

    一部のシェルでは、ワイルドカード文字セットに追加の文字が含まれています。たとえば、extendedglob オプション付きで zsh を使用すると、「#」が特殊文字として処理されます。これは、バージョニングされたオブジェクトを参照する際に、その文字の使用と競合します(gsutil help versions をご覧ください)。

    この問題を回避するには、ワイルドカード式を単一引用符(Linux の場合)または二重引用符(Windows の場合)で囲みます。

  2. gsutil はワイルドカード文字をリテラル文字として使用するのではなく展開しようとするため、ワイルドカード文字が含まれるファイル名を指定することはできません。たとえば、次のコマンドを実行します。

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

    gsutil は「[1]」の部分をワイルドカードとして照合します。

    gsutil でワイルドカード文字が含まれるファイル名を処理するために「raw」モードをサポートするという未解決の問題があるものの、このサポートが実装されるまで、または実装されていない場合、実際には gsutil を使用してこのようなファイル名を処理する良い方法はありません。ワイルドカードを使用してこのようなファイル名を付けるには、上記のコマンドを次のように置き換えます。

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

    ただし、この方法は一般に困難です。

ローカル ファイル システムのドットファイルに対する動作の違い

標準の Unix の動作では、ワイルドカード "*" は "." 文字で始まらないファイル名に一致します(Unix では "." と ".." はディレクトリを表します)。gsutil の場合、ファイル システムの URI に使用したワイルドカードはこれと同じ動作になりますが、クラウド URI に使用したワイルドカードは動作が異なります。たとえば、次のコマンドを実行すると、すべてのオブジェクトが gs://bucket1 から gs://bucket2 にコピーされます。

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

ただし、次のコマンドを実行すると、"." で始まらないファイルだけがディレクトリ "dir" から gs://bucket1 にコピーされます。

gsutil cp dir/* gs://bucket1

効果的な使い方: 多くのオブジェクトにワイルドカードを使用する場合

次のように、オブジェクト名の先頭以外にワイルドカードを使用すると、処理が速くなり、ネットワーク トラフィックも少なくなります。

gs://bucket/abc*.txt

次のように、オブジェクト名の先頭にワイルドカードを使用すると、効率が悪くなります。

gs://bucket/*abc.txt

"gs://bucket/abc*.txt" の場合、サーバーはバケットのルートにあり、名前が "abc" で始まるオブジェクトのリストを返し、gsutil がその結果をフィルタリングし、名前が ".txt" で終わるオブジェクトのリストを表示します。"gs://bucket/*abc.txt" の場合、サーバーはバケットのルートにあるすべてのオブジェクトのリストを作成し、さらに、名前が "abc.txt" で終わるオブジェクトでリストをフィルタリングします。バケット内に数千のオブジェクトが存在している場合、この効率性は非常に大きな問題となります。サーバー側の接頭辞リクエストを効率的に処理するため、ワイルドカードの一致パターンに合わせてオブジェクトの名前を設定できる場合があります。具体的な例については、gsutil help prod をご覧ください。

効果的な使い方: パスの途中にワイルドカードを使用する場合

たとえば、バケットに次のオブジェクトがあるとします。

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

次のコマンドを実行します。

gsutil ls gs://bucket/*/obj5

gsutil は、/ で区切られたトップレベルのバケットの一覧を作成し、各サブディレクトリのバケットの一覧を作成します。合計で 3 つのバケットリストを作成します。

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

ワイルドカードで作成するバケットリストが増えると、処理が遅くなり、コストがかかります。次の数に応じてバケットリストの数が増加します。

  • ワイルドカード コンポーネントの数(例: 「gs://bucket/a??b/c*/*/d」には 3 つのワイルドカード コンポーネントがあります)。
  • 各コンポーネントと比較するサブディレクトリの数
  • 結果の数。1,000 件ごとに 1 つの GET リクエストを使用し、それぞれにマーカーを指定して、ページ分割を行います。

パスの途中でワイルドカードを使用する場合には、次のように再帰的なワイルドカードを試してください。

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

ディレクトリの境界を超えているため、"gs://bucket/*/obj5" よりも多くのオブジェクトに一致しますが、区切りのないバケットリストを使用しているのでバケット リクエストの数は少なくなります。バケット全体のリストが作成され、ローカルでフィルタリングされるのでネットワーク トラフィックの量は多くなります。